前言:mysql系列文章为学习 xiaohaizi的书籍《MySQL 是怎样运行的:从根儿上理解 MySQL》的读书笔记,主要记录了书中主要知识点,便于后续复习。
一、mysql服务端-客户端架构
mysql其实是由两部分组成的,一部分是客户端程序,一部分是服务器程序。它的服务器程序直接和我们存储的数据打交道,然后可以有好多客户端程序连接到这个服务器程序,发送增删改查的请求,然后服务器就响应这些请求,从而操作它维护的数据。启动的MySQL
服务器进程的默认名称为mysqld
, 而我们常用的MySQL
客户端进程的默认名称为mysql
。
1.1 mysql的bin目录
mysql默认安装文件夹为/usr/local/mysql,在类UNIX
系统中用来启动MySQL
服务器程序的可执行文件有很多,大多在MySQL
安装目录的bin
目录下。
.
├── mysql
├── mysql.server -> ../support-files/mysql.server
├── mysqladmin
├── mysqlbinlog
├── mysqlcheck
├── mysqld
├── mysqld_multi
├── mysqld_safe
├── mysqldump
├── mysqlimport
├── mysqlpump
... (省略其他文件)
0 directories, 40 files
1.2 启动mysql服务端
-
mysqld
mysqld
这个可执行文件就代表着MySQL
服务器程序,运行这个可执行文件就可以直接启动一个服务器进程。但这个命令不常用,我们继续往下看更牛逼的启动命令。 -
mysqld_safe
mysqld_safe
是一个启动脚本,它会间接的调用mysqld
,而且还顺便启动了另外一个监控进程,这个监控进程在服务器进程挂了的时候,可以帮助重启它。另外,使用mysqld_safe
启动服务器程序时,它会将服务器程序的出错信息和其他诊断信息重定向到某个文件中,产生出错日志,这样可以方便我们找出发生错误的原因。 -
mysql.server
mysql.server
也是一个启动脚本,它会间接的调用mysqld_safe
,在调用mysql.server
时在后边加上start或者
stop就可以启动和关闭服务器程序了。 -
mysqld_multi 运行多个服务器实例,也就是运行多个
MySQL
服务器进程。mysql_multi
可执行文件可以对每一个服务器进程的启动或停止进行监控。这个命令的使用比较复杂,不作重点。
1.3 启动mysql客户端
成功启动MySQL
服务器程序后,就可以启动客户端来连接服务器,bin
目录下有许多客户端程序,比方说mysqladmin
、mysqldump
、mysqlcheck
等,我们主要用mysql来启动客户端连接。启动这个可执行文件时一般需要一些参数,格式如下:
mysql -h主机名 -u用户名 -p密码
参数名 | 参数含义 |
---|---|
-h | 表示服务器进程所在计算机的域名或者IP地址,如果服务器进程就运行在本机的话,可以省略这个参数,或者填localhost 或者127.0.0.1 。也可以写作 --host=主机名 的形式。 |
-u | 表示用户名。也可以写作 --user=用户名 的形式。 |
-p | 表示密码。也可以写作 --password=密码 的形式。 |
连接成功后会出现 mysql> ,然后就可以输入命令操作mysql服务器。最后输入exit,quit或者\q 退出连接。
1.4 客户端与服务器的连接
mysql
数据库服务器进程和客户端进程可能运行在不同的主机中,它们之间必须通过网络来进行通讯。MySQL
采用TCP
作为服务器和客户端之间的网络通信协议。MySQL
服务器启动的时候会默认申请3306
端口号,也可以在启动服务器程序的命令行里添加-P
参数来明确指定一下端口号。
如果我们的服务器进程和客户端进程都运行在同一台操作系统为类Unix
的机器上的话,我们可以使用Unix域套接字文件
来进行进程间通信。如果我们在启动客户端程序的时候指定的主机名为localhost
,或者指定了--protocol=socket
的启动参数,那服务器程序和客户端程序之间就可以通过Unix
域套接字文件来进行通信了。MySQL
服务器程序默认监听的Unix
域套接字文件路径为/tmp/mysql.sock
,客户端程序也默认连接到这个Unix
域套接字文件。如果我们想改变这个默认路径,可以在启动服务器程序时指定socket
参数,就像这样:
mysqld --socket=/tmp/a.txt
服务器启动后便会监听/tmp/a.txt
。在服务器改变了默认的UNIX
域套接字文件后,如果客户端程序想通过UNIX
域套接字文件进行通信的话,也需要显式的指定连接到的UNIX
域套接字文件路径,这样该客户端进程和服务器进程就可以通过路径为/tmp/a.txt
的Unix
域套接字文件进行通信了:
二、mysql的配置
mysql有许多的配置项,设置项一般都有各自的默认值,比方说服务器允许同时连入的客户端的默认数量是151
,表的默认存储引擎是InnoDB
,我们可以在程序启动的时候去修改这些默认值,对于这种在程序启动时指定的设置项也称之为启动选项(startup options),这些选项控制着程序启动后的行为。在MySQL
安装目录下的bin
目录中的各种可执行文件,不论是服务器相关的程序(比如mysqld
、mysqld_safe
)还是客户端相关的程序(比如mysql
、mysqladmin
),在启动的时候基本都可以指定启动参数。这些启动参数可以放在命令行中指定,也可以把它们放在配置文件中指定。
2.1 命令行指定配置项
在启动mysql的服务器端和客户端的时候,可以在命令行中指定选项时需要在选项名前加上--
前缀。另外,如果选项名是由多个单词构成的,它们之间可以由短划线-
连接起来,也可以使用下划线_
连接起来,也就是说skip-networking
和skip_networking
表示的含义是相同的。
mysqld --skip-networking
我们前边提到的skip-networking
、default-storage-engine
称之为长形式的选项(因为它们很长),设计MySQL
的大叔为了我们使用的方便,对于一些常用的选项提供了短形式(如-h表示--host, -P表示端口和--port等价)。使用长形式选项时需要在选项名前加两个短划线--
不同的是,使用短形式选项时在选项名前只加一个短划线-
前缀。
2.2 配置文件
2.2.1 配置文件位置
在类UNIX
操作系统中,MySQL
会按照下列路径来寻找配置文件:
路径名 | |
---|---|
/etc/my.cnf | |
/etc/mysql/my.cnf | |
SYSCONFDIR/my.cnf | |
$MYSQL_HOME/my.cnf | 特定于服务器的选项(仅限服务器) |
defaults-extra-file | 命令行指定的额外配置文件路径 |
~/.my.cnf | 用户特定选项 |
~/.mylogin.cnf | 用户特定的登录路径选项(仅限客户端) |
这几个路径中的任意一个都可以当作配置文件来使用。MySQL
将按照我们在上表中给定的顺序依次读取各个配置文件,如果该文件不存在则忽略,如果我们在多个配置文件中设置了相同的启动选项,那以最后一个配置文件中的为准。如果我们不想让MySQL
到默认的路径下搜索配置文件(就是上表中列出的那些),可以在命令行指定defaults-file
选项,比如这样(以UNIX
系统为例):
mysqld --defaults-file=/tmp/myconfig.txt
这样,在程序启动的时候将只在/tmp/myconfig.txt
路径下搜索配置文件。`defaults-extra-file`和`defaults-file`的区别,使用`defaults-extra-file`可以指定额外的配置文件搜索路径(也就是说那些固定的配置文件路径也会被搜索)。
2.2.2 配置文件内容
与在命令行中指定启动选项不同的是,配置文件中的启动选项被划分为若干个组,每个组有一个组名,用中括号[]
扩起来。配置文件中不同的选项组是给不同的启动命令使用的,如果选项组名称与程序名称相同,则组中的选项将专门应用于该程序。例如, [mysqld]
和[mysql]
组分别应用于mysqld
服务器程序和mysql
客户端程序。需要注意的一点是,mysqld_safe
和mysql.server
这两个程序在启动时都会读取[mysqld]
选项组中的内容。
在配置文件中指定启动选项的语法类似于命令行语法,但是配置文件中只能使用长形式的选项。在配置文件中指定的启动选项不允许加--
前缀,并且每行只指定一个选项,而且=
周围可以有空白字符(命令行中选项名、=
、选项值之间不允许有空白字符)。