MySQL作为最流行的开源关系型数据库之一,其配置文件是数据库运行的核心控制中枢。我管理过上百个MySQL实例,发现90%的性能问题和稳定性故障都与配置不当有关。配置文件就像数据库的"基因编码",决定了它的行为模式、资源分配和容错能力。
MySQL默认会从多个路径加载配置文件,不同操作系统下的优先级和路径各不相同。在Linux系统中,常见的加载顺序是:
注意:当多个配置文件存在相同参数时,后加载的配置会覆盖之前的设置。建议统一使用/etc/my.cnf作为主配置文件,避免配置分散带来的管理困难。
MySQL配置文件采用INI文件格式,具有以下特征:
[section]定义配置组key=value形式存在#和;作为注释符号!include和!includedir指令一个典型的配置片段如下:
ini复制[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
这是最重要的配置段,控制MySQL服务器的核心行为。关键参数包括:
port=3306:监听端口bind-address=127.0.0.1:绑定IP地址max_connections=151:最大连接数innodb_buffer_pool_size=128M:InnoDB缓冲池大小影响所有MySQL客户端工具的行为:
ini复制[client]
port=3306
socket=/tmp/mysql.sock
default-character-set=utf8mb4
专门针对mysql命令行工具的配置:
ini复制[mysql]
auto-rehash
prompt=\\u@\\h:\\d \\R:\\m:\\s>
ini复制innodb_buffer_pool_size=12G # 建议为物理内存的50-70%
innodb_buffer_pool_instances=8 # 每个实例至少1GB
innodb_buffer_pool_load_at_startup=ON
innodb_buffer_pool_dump_at_shutdown=ON
ini复制sort_buffer_size=4M
join_buffer_size=4M
read_buffer_size=2M
read_rnd_buffer_size=2M
经验:这些缓冲区是每个连接独占的,设置过大会导致内存快速耗尽。在连接数多的场景要特别注意。
ini复制log_error=/var/log/mysql/error.log
log_error_verbosity=3 # 1=errors, 2=errors+warnings, 3=errors+warnings+notes
ini复制slow_query_log=ON
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=2 # 超过2秒的查询
log_queries_not_using_indexes=ON
ini复制server_id=1
log_bin=/var/log/mysql/mysql-bin
binlog_format=ROW
expire_logs_days=7
binlog_row_image=FULL
sync_binlog=1
以下是一个8核32GB内存生产服务器的推荐配置:
ini复制[mysqld]
# 基础配置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
# 网络配置
port=3306
bind-address=0.0.0.0
max_connections=300
back_log=150
# 内存配置
innodb_buffer_pool_size=20G
innodb_buffer_pool_instances=8
innodb_log_file_size=2G
innodb_log_buffer_size=64M
key_buffer_size=512M
# 查询缓存配置
query_cache_type=0
query_cache_size=0
# 日志配置
log_error=/var/log/mysql/error.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=1
log_queries_not_using_indexes=1
# 复制配置
server_id=1
log_bin=/var/log/mysql/mysql-bin
binlog_format=ROW
binlog_row_image=FULL
expire_logs_days=7
sync_binlog=1
# InnoDB配置
innodb_flush_log_at_trx_commit=1
innodb_file_per_table=1
innodb_flush_method=O_DIRECT
innodb_read_io_threads=8
innodb_write_io_threads=8
innodb_io_capacity=2000
innodb_io_capacity_max=4000
git-crypt加密敏感信息pt-config-diff工具比较配置差异SET GLOBAL动态修改可调参数SHOW STATUS和SHOW VARIABLES监控效果bash复制# 检查配置文件语法
$ mysqld --verbose --help | grep -A 1 "Default options"
# 验证配置参数
$ mysqladmin variables
$ mysql -e "SHOW VARIABLES LIKE '%buffer%'"
# 使用Percona工具检查
$ pt-variable-advisor localhost
SET GLOBAL max_connections=300;SET SESSION sort_buffer_size=4M;sql复制-- 查看当前使用中的配置
SELECT * FROM performance_schema.variables_by_thread
WHERE VARIABLE_NAME IN (
'innodb_buffer_pool_size',
'max_connections',
'innodb_io_capacity'
);
-- 监控内存使用情况
SELECT * FROM sys.memory_global_by_current_bytes
WHERE event_name LIKE 'memory/innodb/buffer%';
通过不同端口运行多个MySQL实例:
ini复制[mysqld@replica01]
datadir=/var/lib/mysql-replica01
socket=/var/lib/mysql-replica01/mysql.sock
port=3307
server_id=2
[mysqld@replica02]
datadir=/var/lib/mysql-replica02
socket=/var/lib/mysql-replica02/mysql.sock
port=3308
server_id=3
ini复制[mysqld]
plugin-load-add=audit_log.so
audit_log_format=JSON
audit_log_file=/var/log/mysql/audit.log
ini复制[mysqld]
# 禁用符号链接
symbolic-links=0
# 密码策略
validate_password.policy=STRONG
validate_password.length=12
# SSL配置
ssl-ca=/etc/mysql/ca.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
经过多年实战,我发现MySQL配置需要定期review和调整。每次MySQL版本升级后,都应该检查废弃参数和新特性。建议每季度进行一次配置审计,结合监控数据持续优化参数设置。