核心概念

MySQL 的配置文件采用分层目录结构 + 配置组隔离的机制。了解文件加载顺序和配置组的作用范围,是正确配置 MySQL 的基础。

文件布局(Ubuntu/Debian 系)

/etc/mysql/
├── my.cnf                     # 主入口文件(所有 MySQL 程序读取)
├── conf.d/                    # 【通用】对所有 MySQL 程序生效
│   ├── mysql.cnf              # 客户端配置([client] 组)
│   └── mysqldump.cnf          # mysqldump 配置([mysqldump] 组)
└── mysql.conf.d/              # 【服务端】仅对 MySQL 服务器生效
    ├── mysql.cnf              # mysql CLI 配置([mysql] 组)
    └── mysqld.cnf             # 服务器核心配置([mysqld] 组)⭐

各文件作用

文件适用程序典型内容
/etc/mysql/my.cnf所有 MySQL 程序主入口,通过 !includedir 引入子目录
conf.d/mysql.cnf客户端 + 服务端[client] 组默认参数(如 default-character-set)
conf.d/mysqldump.cnfmysqldump[mysqldump] 组参数(如 quick、max_allowed_packet)
mysql.conf.d/mysql.cnfmysql CLI[mysql] 组参数(如 prompt、auto-rehash)
mysql.conf.d/mysqld.cnfmysqld 服务端[mysqld] 组核心配置(port、datadir、bind-address、log-bin)⭐

加载机制与优先级

加载顺序

MySQL 通过 !includedir 指令按字母顺序加载配置目录中的 .cnf / .ini 文件:

my.cnf 读取顺序:
  1. /etc/mysql/my.cnf                      ← 最先读取,定义全局参数
  2. /etc/mysql/conf.d/                     ← 按字母序加载(mysql.cnf → mysqldump.cnf)
  3. /etc/mysql/mysql.conf.d/               ← 按字母序加载(mysql.cnf → mysqld.cnf)
  4. ~/.my.cnf                              ← 用户家目录配置(可选,优先级最高)

优先级规则

同一配置组(section)内,后加载的文件覆盖先加载的相同参数。

示例:若 my.cnf 中设了 port=3306,而 mysql.conf.d/mysqld.cnf 中设了 port=3307,则最终生效的是 3307

配置组的隔离机制

MySQL 配置文件使用 [group] 标记来区分生效范围:

配置组生效的程序解释
[client]所有客户端程序(mysql、mysqldump 等)共享连接参数
[mysql]mysql CLI 客户端仅命令行客户端
[mysqldump]mysqldump 备份工具仅导出工具
[mysqld]MySQL 服务器进程核心服务参数
[mysqld_safe]mysqld_safe 启动脚本日志、pid 文件等

实战意义

1. 配置排查时先定位正确的文件

bind-address 属于 [mysqld] 组,应去 mysql.conf.d/mysqld.cnf 查找,而非在客户端配置文件中浪费时间。

2. 追加配置时选择合适的位置

  • 服务端参数(bind-address、max_connections)→ 追加到 mysql.conf.d/mysqld.cnf
  • 通用客户端参数(default-character-set)→ 追加到 conf.d/mysql.cnf

3. 避免被覆盖

服务端专属配置不要写在 conf.d/ 目录下,否则可能被 mysql.conf.d/ 中的同名参数覆盖。

4. Ansible 模板策略

如果使用配置模板管理 MySQL,应针对 mysql.conf.d/mysqld.cnf 进行管理(而非 my.cnf),保持与发行版默认布局兼容。

验证当前生效配置

# 查看 mysqld 当前加载了哪些配置文件
mysqld --verbose --help | grep -A 1 "Default options"
 
# 查看所有生效的配置参数
mysql -u root -p -e "SHOW VARIABLES;"
 
# 查看特定参数
mysql -u root -p -e "SHOW VARIABLES LIKE 'bind_address';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'port';"

参考链接