小心my.cnf中重复系统变量设置带来困扰
2026-01-23 09:13 潇湘隐者 阅读(7) 评论(0) 收藏 举报我们知道MySQL对不同位置的my.cnf文件的读取顺序是有优先级的. 那么问题来了, 如果同一个my.cnf中, 不同位置出现了两个相同系统变量/参数, MySQL会读取哪一个系统变量呢? 是不是一个很有意思的问题!
那么我们先来看看,在测试环境的my.cnf中, 我们以变量server_id为例子,
server_id=1002
我们在my.cnf中新增了一个server_id=1003,如下所示
...................................
server_id=1002
...................................
server_id=1003
然后重启MySQL服务后,此时,检查系统变量server_id. 经过验证发现靠后位置的系统变量生效了, 而前面的系统变量被"覆盖"了.
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1003 |
+---------------+-------+
1 row in set (0.01 sec)
mysql>
一般来说,这种情况比较少见, 而且也容易排查, 如下所示.
$ grep server_id my.cnf
server_id=1002
server_id=1003
介绍一个我遇到的案例, 搭建MySQL InnoDB Cluster时,需要在my.cnf中设置参数server_id, 但是之前的my.cnf中设置了server-id系统变量/参数,而在不知情的情况下(没有仔细检查,系统变量太多,搜索的时候只搜索了关键词server_id)设置了server_id系统变量后,重启MySQL实例发现系统变量/参数没有生效. 刚开始挺纳闷的.仔细检查好久后才发现这个问题.所以,这里有衍生了另外一个问题,系统变量要统一一致,不要有些用"中划线",有些用"下划线".
MySQL的系统变量,有时候你会看到下面两种不同“样貌”的系统变量,有时候是下划线,有时候是横线,关于这部分内容的详细说明如下所示:
log-timestamps=SYSTEM
或
log_timestamps=SYSTEM
其实,下划线和横线都支持, 官方文档中称带横线的系统变量为"命令行格式","下划线"的为系统变量(System Variables)
官方文档的介绍:
System variable values can be set globally at server startup by using options on the command line or in an option file.
At startup, the syntax for system variables is the same as for command options, so within variable names, dashes and
underscores may be used interchangeably. For example, --general_log=ON and --general-log=ON are equivalent.
通过使用命令行或选项文件中的选项,可以在服务器启动时全局设置系统变量值。启动时,系统变量的语法与命令选项的语法相同,因此在变量名称中,破折号和下划线可以互换使用。例如, --general_log=ON和 --general-log=ON是等价的。
浙公网安备 33010602011771号