my.cnf 加载顺序是什么
MySQL 启动时按固定路径顺序读取选项文件,后读到的同名参数覆盖先读到的;客户端工具与 mysqld 读的是同一套文件,但只取自己所属的段。排查「参数改了不生效」,第一步永远是确认最终生效值来自哪个文件,而不是凭印象改最熟悉的那个 my.cnf。
基本信息
| 适用版本 | MySQL 5.7 / 8.0(顺序一致,默认路径随发行版略有差异) |
|---|---|
| 典型顺序 | /etc/my.cnf → /etc/mysql/my.cnf → $MYSQL_HOME/my.cnf → ~/.my.cnf |
| 常用段 | [mysqld] [client] [mysql] [mysqldump] [mysqld_safe] |
| 包含机制 | !include / !includedir 可追加目录内所有 .cnf |
| 生效方式 | HUP 或重启服务;客户端工具每次调用实时读取 |
典型使用场景
- 定位参数来源:面板、DBA、发布脚本各改一处,需要确认到底谁生效
- 给 mysqldump 单独设参数:在 [mysqldump] 段写 quick、single-transaction 避免每次敲长命令
- 临时排查用个人级配置:~/.my.cnf 只影响该用户的客户端,不动服务端
- 容器化部署时把配置挂载进容器,避免重建后参数回退
- 审计合规要求核对 max_connections、sql_mode 等关键项的实际生效值
查看生效顺序与参数
查看生效顺序与参数
mysqld --verbose --help | grep -A2 'Default options' # 服务端读取顺序
mysql --help | grep -A2 'Default options' # 客户端读取顺序
my_print_defaults mysqld # 列出服务端实际生效项
my_print_defaults mysqld | grep -i max_connections # 直接看某个参数
mysqld --print-defaults # 等价写法,便于脚本调用常用段示例
常用段示例
[mysqld]
max_connections = 2000
innodb_buffer_pool_size = 8G
[client]
default-character-set = utf8mb4
[mysqldump]
quick = 1
single-transaction = 1
[mysql]
prompt = '\\u@\\h [\\d]> '常见路径与适用环境
| 路径 | 典型环境 | 说明 |
|---|---|---|
| /etc/my.cnf | RHEL / CentOS / 宝塔面板 | 面板改参数通常落到这里 |
| /etc/mysql/my.cnf | Debian / Ubuntu 的 mysql 包 | 可能再 include 子目录 |
| /etc/mysql/mysql.conf.d/ | Ubuntu 8.0 | 通过 !includedir 引入 |
| $MYSQL_HOME/my.cnf | 手动解压的二进制包 | 以 my.cnf 所在目录为 MYSQL_HOME |
同一个参数在多个文件出现时,后加载的胜出;而命令行显式参数优先级高于所有配置文件。宝塔面板改的参数与手工写 /etc/my.cnf 如果不在同一文件,重启后容易出现「又不生效了」。
调大 innodb_buffer_pool_size 一类参数前要核对物理内存与业务峰值,改配置后先做语法与启动验证(mysqld --validate-config 仅 8.0.16+ 支持),别在业务高峰直接重启。