很好奇, MySQL 可以加载多个 my.cnf 配置文件吗?

2017-01-15 19:48:22 +08:00
 SP00F

这边因为项目上线,在 MySQL 5.5 以及 5.7 中测试过去了,但是线上 MySQL 版本为 5.6 执行失败

Incorrect integer value: '' for column 'id' at row 1 [closed]

原因是 sql_mode 设置了,但在 my.cnf 中配置时取消 sql_mode 发现仍未解决该问题。无奈只能临时 SET global sql_mode = '' 解决问题,随后用最笨的检查方式检索整个硬盘上的 my.cnf 文件,发现其中一个配置文件内容为

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

sql_mode 行注释后解决该问题。

my.cnf位于 /usr/local/mysql/my.cnf 而实际使用的是 /etc/my.cnf

新手请教 MySQL 是可以加载多个 my.cnf 配置文件的吗?如何检查 MySQL 的配置文件加载都有哪些?以及加载顺序呢?

5513 次点击
所在节点    MySQL
16 条回复
BombayCat
2017-01-15 19:56:57 +08:00
是有多个 my.cnf 的,不同位置的对应的作用域不一样
SP00F
2017-01-15 20:01:07 +08:00
@BombayCat
但是很好奇,按加载顺序是

````# mysql --help|grep 'my.cnf'
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf````

发现并没有 `/usr/local/mysql/my.cnf` 作为检查顺序,就有加载这个 my.cnf 所以很好奇,按顺序查找 my.cnf 的话,不存在会加载 `/usr/local/mysql/my.cnf` 该配置文件吧。
skydiver
2017-01-15 20:03:39 +08:00
既然是 /usr/local 说明是自己编译的,所以你需要 /usr/local/bin/mysql --help
SP00F
2017-01-15 20:12:58 +08:00
@skydiver
是的,查找顺序是 /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

但,并没有 /usr/local/mysql/my.cnf 所以我很懵逼。。。怎么会加载了一下这个 my.cnf
wql
2017-01-15 20:13:50 +08:00
@SP00F include 指令?
SP00F
2017-01-15 20:17:13 +08:00
@wql
没有看到 include …… 不清楚是否在编译的时候加的。。。

MySQL 启动时未指定 my.cnf 位置,是按照 MySQL 的查找顺序找到 my.cnf 运行的。
skydiver
2017-01-15 20:22:01 +08:00
@SP00F /usr/local/bin/mysql --help 也是一样的输出?
SP00F
2017-01-15 20:26:54 +08:00
@skydiver
我的是 /usr/bin/mysql

[root@localhost bin]# /usr/bin/mysql --help | grep 'cnf'
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

所以很奇怪拉。
skydiver
2017-01-15 20:37:25 +08:00
@SP00F 并没有 /usr/local/bin/mysql ?那 /usr/local 里的配置文件哪来的?
skydiver
2017-01-15 20:40:05 +08:00
@SP00F 你看的 /usr/bin/mysql 当然不会读取 /usr/local/ 里的配置文件了……

你最好确定下你启动的 mysql 到底是哪个。如果你改了 /usr/local 的配置文件就好了,说明你启动的不是 /usr 里的那一份而是 /usr/local 里的那一份 mysql
SP00F
2017-01-15 20:45:33 +08:00
@skydiver
/usr/bin/mysql 是软链接,真实的是 /usr/local/mysql/bin/mysql

现在怀疑的是 /etc/init.d/mysql 中的问题。会查找 --basedir 下的 my.cnf 也就是 /usr/local/mysql/my.cnf

不过我好奇的是可以多个 my.cnf 加载的吗?
skydiver
2017-01-15 20:53:31 +08:00
@SP00F 你可以直接 /usr/local/mysql/bin/mysql --help 看看,也许加载路径和输入的路径有关系

加载多个 my.cnf 是可以的,你没看到你上面的输出就有 3 个吗 /etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf 按顺序加载的
SP00F
2017-01-15 21:06:23 +08:00
@skydiver
嗯,我检查过输出的几个配置文件,只有 /etc/my.cnf 存在,然后另外一个就是 /usr/local/mysql/my.cnf 了。

按照一般启动方式,没有指定配置文件的话,是按照 /etc/mysql/my.cnf /etc/my.cnf 以及 ~/.mysql.cnf 加载的,启动的用户 mysql 的主目录也在 /home/mysql 所以没道理会加载 /usr/local/mysql/my.cnf 配置文件,唯一的解释就是在 /etc/init.d/mysql 中有设置了查找位置。
msg7086
2017-01-16 04:26:21 +08:00
SP00F
2017-01-16 08:16:20 +08:00
@msg7086 thanks
noahzh
2017-01-16 08:55:56 +08:00
启动时候,指定使用某个 cnf 就可以了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/334753

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX