学习MySQL系列:2. MySQL配置项和配置文件

302 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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_serverutf8mb4,而又在server中定义了2个character_set_server,分别为utf8gbk,那我们重启服务器后,我们创建一下数据库,看一下字符集呢。

我们发现其创建的库字符集为gbk,于是我们可以得出结论,在配置文件出现重复项的时候,以最后一项参数为准。

总结

通过上述的学习,我们知晓了启动MySQL配置文件抓取的路径顺序,以及指定配置参数和读取配置文件,最后探讨了一下配置优先级问题,其优先级顺序为: 指定配置参数 > 读取配置文件, 而读取配置文件,是按照从前往后读取,若有重复项配置,则以最后一个配置项为准,快来试试吧。