学习MySQL系列:2. MySQL配置项和配置文件
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
今天是学习MySQL 是怎样运行的:从根儿上理解 MySQL的第二天。
我们在使用MySQL的过程中,或多或少都使用过配置文件,例如: /etc/my.cnf,那你知道其中配置的具体含义么? 来,我们一起来看看今天的文章吧。
启动MySQL Server,我们有2种方式,第一种就是我们读取配置文件进行启动MySQL Server,第二种就是我们执行mysqld的时候,指定其具体参数,我们分别来介绍下。
指定配置参数
还记得我们上一节安装MySQL的时候,我们启动MySQL Server的命令么?
/home/mysql-source/bin/mysqld --user=root --basedir=/home/mysql-source --datadir=/home/mysql-source/db --socket=/home/mysql-source/db/mysql.sock
我们可以直接将参数写到mysqld后面,例如 启动的用户, MySQL安装目录, MySQL数据目录等, 那我们还可以指定其他的参数么? 当然可以。
例如,我们想将MySQL服务器字符集设置为utf8mb4,那我们可以这样启动MySQLD后指定--character_set_server=utf8mb4。
/home/mysql-source/bin/mysqld ... --character_set_server=utf8mb4
我们顺利启动数据库后,利用客户端进入数据库,我们使用创建了一个库: pdudo_test_1,而后我们查看其建表语句,发现该字符集已经是utf8mb4了。
代码:
mysql> create database pdudo_test_1;
mysql> show create database pdudo_test_1;
那除此之外,我们客户端可以使用配置变量参数么? 那当然可以了,那例如,我们想使用socket进行登录数据库,我们可以在mysql后增加--socket即可,例如:
命令:
/home/mysql-source/bin/mysql --user=root --socket=/home/mysql-source/db/mysql.sock --password
在命令行提示下,我们输入命令,从而正确进入了MySQL Server中,那如上我们使用的长形式,其实它对应的还有短形式,我们可以使用mysql --help获取一下。
其实长形式是有2个--开头的,而短形式,则只有1个-开头。
这里列举几个参数
| 长形式 | 端形式 | 含义 |
|---|---|---|
| --user | -u | 指定用户名 |
| --password | -p | 指定密码 |
| --socket | -S | 指定sockert路径 |
| --host | -h | 指定主机名称 |
等等,诸如此类。
读取配置文件
在MySQL中,不仅可以指定参数启动,更多的,还是使用配置文件的方式来启动服务器或者客户端。
在Linux环境下,MySQL会按照如下优先级去搜索配置文件
/etc/my.cnf/etc/mysql/my.cnf$MYSQL_HOME/my.cnf[datadir]/my.cnf~/.my.cnf
关于my.cnf,配置文件选项组如下
[server]
...
[mysqld]
...
[mysqld_safe]
...
[client]
...
[mysql]
...
[mysqladmin]
...
其中定义的格式如
key = value
的形式,等号=中间可以有空格
在命令行指定配置参数的时候,是不允许有空格的。
接着我们来看看启动的时候,mysql读取参数的作用域
这里就不补充完整了,除了一下这些以外,还有其他的,例如:
[mysqldump][myisamchk][mysqlhotcopy]
| 作用域 | 命令 | 管控组 |
|---|---|---|
| 服务器 | mysqld | [mysqld] [server] |
| 服务器 | mysqld_safe | [mysqld] [server][mysqld_safe] |
| 客户端 | mysql | [client] [mysql] |
那我们来配置一下
[root@master ~]# cat /etc/my.cnf
[mysqld]
user=root
basedir=/home/mysql-source
datadir=/home/mysql-source/db
socket=/home/mysql-source/db/mysql.sock
[mysql]
socket=/home/mysql-source/db/mysql.sock
user=root
password=lJ1&aR1!cB9_
[root@master ~]#
如上我们配置了2个项,分别是[mysqld]和[mysql],将作用于服务器和客户端,现在我们使用mysql应该可以直接进去的,我们尝试一下
这次我们没有服务器指定character_set_server,我们创建一个库来看看其字符集。
优先级问题
我们有没有想过这样一个问题,当有配置文件 和 又在启动的时候指定了参数的时候,谁的优先级更高呢?
为了验证该问题,我们能否修改下配置文件,例如将[mysql]的user修改为pdudo,我们都知道MySQL服务器还未创建pdudo用户,然后我们再启动的时候指定其用户名为root,让我们看看效果如何吧。
修改客户端的配置,是不用重启MySQL服务器。
通过如上例子,我们发现,若是在命令行指定了配置项,则会覆盖文件的配置项。
若配置文件定义了重复项,那么以什么为准呢?
比如: 在配置文件中,定义了多个 character_set_server 且分别在不同的管控组下,我们以什么为准呢,我们可以模拟下如上情况。
我们在mysqld定义了character_set_server为utf8mb4,而又在server中定义了2个character_set_server,分别为utf8和gbk,那我们重启服务器后,我们创建一下数据库,看一下字符集呢。
我们发现其创建的库字符集为gbk,于是我们可以得出结论,在配置文件出现重复项的时候,以最后一项参数为准。
总结
通过上述的学习,我们知晓了启动MySQL配置文件抓取的路径顺序,以及指定配置参数和读取配置文件,最后探讨了一下配置优先级问题,其优先级顺序为: 指定配置参数 > 读取配置文件, 而读取配置文件,是按照从前往后读取,若有重复项配置,则以最后一个配置项为准,快来试试吧。

浙公网安备 33010602011771号