温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

mysql 多个参数选项文件my.cnf优先级研究

发布时间:2020-08-09 13:23:15 来源:ITPUB博客 阅读:253 作者:神谕丶 栏目:MySQL数据库
my.cnf是mysql服务器在unix平台下默认的配置文件的文件名。

输入my_print_defaults可以得出mysql server启动时所读取的my.cnf的顺序:(一般为该四个,根据安装方式、OS发行版、mysql版本而定)
或者 


  1. $ mysql --help | grep my.cnf

/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/my.cnf(有的版本写作/usr/local/mysql/etc/my.cnf) ~/.my.cnf 

也就是说,先读取/etc/my.cnf,再去读/etc/mysql/my.cnf,第三个读/usr/local/mysql/my.cnf,其中,第三个为basedir,即mysql安装目录。
第四个为~/.my.cnf,这个~即为/home/$USERNAME,而$USERNAME为服务器启动用户。


在手册中给出的顺序是(由上至下读取)

  1. File Name            Purpose
  2. /etc/my.cnf          Global options
  3. /etc/mysql/my.cnf    Global options
  4. SYSCONFDIR/my.cnf    Global options
  5. $MYSQL_HOME/my.cnf   Server-specific options
  6. defaults-extra-file  The file specified with --defaults-extra-file=path, if any
  7. ~/.my.cnf            User-specific options
  8. ~/.mylogin.cnf       Login path options



但通用的读取先后顺序为:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 
省略部分路径。

其中/etc/my.cnf与/etc/mysql/my.cnf为全局选项文件
而~/.my.cnf为用户选项文件


场景一:
Global options与Global options同时存在。
即/etc/my.cnf与/etc/mysql/my.cnf同时存在

疑问:如果/etc/my.cnf存在,还会去找/etc/mysql/my.cnf吗?
如果是,那么是直接使用/etc/mysql/my.cnf文件
还是先使用/etc/my.cnf,再用/etc/mysql/my.cnf中呢?如果参数相同,后者覆盖前者吗?


实验:
/etc/my.cnf
[mysqld]
long_query_time = 15
slow_query_log  = on
autocommit = off

/etc/mysql/my.cnf
[mysqld]
long_query_time = 12
slow_query_log = on


查询:

  1. mysql> show variables like 'autocommit';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | autocommit    | OFF   |
  6. +---------------+-------+
  7. 1 row in set (0.00 sec)

  8. mysql> show variables like 'long_query_time';
  9. +-----------------+-----------+
  10. | Variable_name   | Value     |
  11. +-----------------+-----------+
  12. | long_query_time | 12.000000 |
  13. +-----------------+-----------+
  14. 1 row in set (0.01 sec)


此时先用了/etc/my.cnf中的autocommit=off。
虽然slow_query_log都有设置,但是参数相同,/etc/mysql/my.cnf优先级更大,故为12s。


继续实验:
删除/etc/my.cnf


$ sudo mv /etc/my.cnf /etc/my.cnf.bk


重启服务器,查询:

  1. mysql> show variables like 'autocommit';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | autocommit    | ON    |
  6. +---------------+-------+
  7. 1 row in set (0.00 sec)

  8. mysql> show variables like 'long_query_time';
  9. +-----------------+-----------+
  10. | Variable_name   | Value     |
  11. +-----------------+-----------+
  12. | long_query_time | 12.000000 |
  13. +-----------------+-----------+
  14. 1 row in set (0.01 sec)

此时只用了/etc/mysql/my.cnf。




场景二:
Global options与User-specific options同时存在
即/etc/my.cnf与~/.my.cnf同时存在


实验:
同样先删除其他配置文件,确保只剩如下两个位置:

/etc/my.cnf
[mysqld]
long_query_time = 15
slow_query_log  = on
autocommit = off


~/.my.cnf
[mysqld]
long_query_time = 12
slow_query_log = on


编辑好后保存退出

查询


  1. mysql> show variables like 'autocommit';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | autocommit    | OFF   |
  6. +---------------+-------+
  7. 1 row in set (0.00 sec)

  8. mysql> show variables like 'long_query_time';
  9. +-----------------+-----------+
  10. | Variable_name   | Value     |
  11. +-----------------+-----------+
  12. | long_query_time | 12.000000 |
  13. +-----------------+-----------+
  14. 1 row in set (0.01 sec)




autocommit默认是on
long_query_time默认是10


说明/etc/my.cnf已经生效
autocommit = off
虽然有设置
long_query_time = 15


但是
~/.my.cnf
中有设置
long_query_time = 12
故~/.my.cnf也有生效,在存在相同选项时,优先级高于Global options的/etc/my.cnf。


结论:
当多个my.cnf存在时:
Global optionsUser-specific options同时存在时,User-specific options优先级高于Global options并两者都会读取,若选项相同,则优先级高者覆盖前者
虽然/etc/my.cnf与/etc/mysql/my.cnf均为Global options,但是规则也同样和Global options与User-specific options一致。




作者微信公众号(持续更新)
mysql 多个参数选项文件my.cnf优先级研究

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI