讲解
MySQL 启动时读取配置文件(Linux 上通常是 /etc/my.cnf 或 /etc/mysql/my.cnf,Docker 镜像里在 /etc/my.cnf),文件按段落组织:[mysqld] 是服务器本身的配置,[client] 是客户端工具的默认配置,[mysql] 是 mysql 命令行的专属配置。最常见的配置事故就是参数写错了段落——把 innodb_buffer_pool_size 写进 [client] 里,服务器根本不会读它。
值得知道的常用参数不多:character-set-server 和 collation-server 定默认字符集(utf8mb4);max_connections 最大连接数(默认 151,应用打满连接池时要调大);innodb_buffer_pool_size 是 InnoDB 的缓存池,数据库专用机上通常设为物理内存的 50%~70%,这是对性能影响最大的单个参数;slow_query_log 和 long_query_time 控制慢查询日志。8.0 起 redo log 大小用 innodb_redo_log_capacity 设置(老的 innodb_log_file_size 组合已废弃)。
参数分动态和静态:动态参数可以 SET GLOBAL 在线修改(无需重启),静态参数只能改配置文件后重启。SHOW VARIABLES 查看当前生效值,改配置后用它核对。还有个 8.0 的实用特性:SET PERSIST 把动态参数的修改同时写入 mysqld-auto.cnf,重启后依然生效,介于「临时 SET GLOBAL」和「改配置文件」之间。
示例
一份典型的 my.cnf 服务器段落(ini 片段,写入配置文件后需重启生效,此处不执行):
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
max_connections = 500
innodb_buffer_pool_size = 1G
innodb_redo_log_capacity = 512M
slow_query_log = ON
long_query_time = 1
用 SHOW VARIABLES 核对当前实例的关键参数,这是改配置后的标准检查动作:
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
动态参数的会话级调整示例:查看当前 sql_mode,再给本会话设置语句超时(毫秒),只对当前连接生效:
SELECT @@SESSION.sql_mode;
SET SESSION max_execution_time = 3000;
SELECT @@SESSION.max_execution_time AS session_timeout_ms;
常见坑
- 参数写错段落:[client] 里的 mysqld 参数被静默忽略,改了等于没改。改完用 SHOW VARIABLES 核对生效值。
- 改完文件忘重启(静态参数):innodb_buffer_pool_size 这类参数只能重启生效,改完文件不重启,SHOW VARIABLES 还是旧值。
- buffer pool 超过物理内存:给了超过机器内存的值会导致 swap,数据库性能雪崩。专用机给 50%~70%,和应用混部的机器要更保守。
- Docker 里乱挂配置:把整个 /etc/mysql 目录用空目录挂载覆盖,镜像自带的配置全丢。只挂载单个配置文件,或用 --init-file、自定义 cnf 挂载到 /etc/mysql/conf.d/。
小结
my.cnf 按 [mysqld]/[client] 分段;重点参数是字符集、max_connections、innodb_buffer_pool_size;动态参数 SET GLOBAL 在线改、SET PERSIST 持久化,改完一律 SHOW VARIABLES 核对。下一章进入运维的生命线:备份与恢复。