携手创作,共同成长!这是我参与「掘金日新计划 · 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
配置文件抓取的路径顺序,以及指定配置参数和读取配置文件,最后探讨了一下配置优先级问题,其优先级顺序为: 指定配置参数 > 读取配置文件, 而读取配置文件,是按照从前往后读取,若有重复项配置,则以最后一个配置项为准,快来试试吧。