Skip to content

MariaDB 配置文件优化

MariaDB 的配置文件是控制数据库行为的核心,合理的配置可以显著提高数据库的性能和稳定性。本文将介绍 MariaDB 配置文件的基本结构、不同规模服务器的参数模板、关键参数说明和最佳实践。

配置文件概述

配置文件位置

MariaDB 的配置文件位置因操作系统和安装方式而异:

  • Linux (Red Hat/CentOS)/etc/my.cnf/etc/my.cnf.d/
  • Linux (Debian/Ubuntu)/etc/mysql/my.cnf/etc/mysql/conf.d/
  • WindowsC:\Program Files\MariaDB 10.11\my.iniC:\my.ini
  • macOS (Homebrew)/usr/local/etc/my.cnf/usr/local/etc/my.cnf.d/
  • macOS (DMG)/usr/local/mysql/my.cnf

配置文件基本结构

MariaDB 配置文件采用 INI 格式,包含多个区块:

ini
# 客户端配置
[client]
port = 3306
socket = /tmp/mysql.sock

# 服务器配置
[mysqld]
# 基本设置
port = 3306
datadir = /usr/local/var/mysql

# 字符集设置
character-set-server = utf8mb4

# 内存设置
innodb_buffer_pool_size = 512M

# 其他设置...

# 安全配置
[mysql_safe]
log-error = /usr/local/var/mysql/error.log
pid-file = /usr/local/var/mysql/mysql.pid

配置文件加载顺序

MariaDB 会按照以下顺序加载配置文件:

  1. 命令行参数
  2. /etc/my.cnf
  3. /etc/mysql/my.cnf
  4. /usr/local/etc/my.cnf
  5. ~/.my.cnf

同一参数如果在多个配置文件中出现,后加载的配置文件会覆盖先加载的。

配置参数模板

小型服务器配置(2-4GB 内存)

适合开发环境、小型应用或测试场景:

ini
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4

[mysqld]
# 基本设置
port = 3306
datadir = /usr/local/var/mysql
basedir = /usr/local/mysql
socket = /tmp/mysql.sock
pid-file = /usr/local/var/mysql/mysql.pid
server-id = 1

# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

# 内存设置
innodb_buffer_pool_size = 1G      # InnoDB 缓冲池大小,推荐为总内存的 25%-50%
key_buffer_size = 64M           # MyISAM 键缓冲大小
max_allowed_packet = 64M         # 最大允许的数据包大小
innodb_log_buffer_size = 16M     # InnoDB 日志缓冲大小
join_buffer_size = 2M            # 连接缓冲大小
sort_buffer_size = 2M            # 排序缓冲大小
read_buffer_size = 1M            # 顺序读取缓冲大小
read_rnd_buffer_size = 2M        # 随机读取缓冲大小

# 连接设置
max_connections = 100            # 最大连接数
wait_timeout = 600               # 连接超时时间(秒)
interactive_timeout = 600        # 交互式连接超时时间(秒)

# 日志设置
log_error = /usr/local/var/mysql/error.log
slow_query_log = 1               # 启用慢查询日志
slow_query_log_file = /usr/local/var/mysql/slow.log
long_query_time = 2              # 慢查询阈值(秒)
log_queries_not_using_indexes = 1 # 记录未使用索引的查询

# 二进制日志设置
log_bin = /usr/local/var/mysql/mysql-bin
expire_logs_days = 7             # 二进制日志保留天数
max_binlog_size = 100M           # 单个二进制日志文件大小

# InnoDB 设置
innodb_file_per_table = 1        # 每个表使用独立的表空间
innodb_flush_log_at_trx_commit = 2 # 每秒刷新日志到磁盘,平衡性能和安全性
innodb_flush_method = fsync      # 日志刷新方法
innodb_io_capacity = 200         # InnoDB I/O 容量
innodb_lock_wait_timeout = 50    # InnoDB 锁等待超时时间

# 其他设置
skip_name_resolve = 1            # 跳过主机名解析,提高连接速度
skip_external_locking = 1        # 跳过外部锁定
lower_case_table_names = 0       # 区分表名大小写(0:区分,1:不区分)

中型服务器配置(8-16GB 内存)

适合中型应用或生产环境:

ini
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4

[mysqld]
# 基本设置
port = 3306
datadir = /usr/local/var/mysql
basedir = /usr/local/mysql
socket = /tmp/mysql.sock
pid-file = /usr/local/var/mysql/mysql.pid
server-id = 1

# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

# 内存设置
innodb_buffer_pool_size = 4G      # InnoDB 缓冲池大小,推荐为总内存的 50%
key_buffer_size = 256M           # MyISAM 键缓冲大小
max_allowed_packet = 128M        # 最大允许的数据包大小
innodb_log_buffer_size = 32M     # InnoDB 日志缓冲大小
join_buffer_size = 4M            # 连接缓冲大小
sort_buffer_size = 4M            # 排序缓冲大小
read_buffer_size = 2M            # 顺序读取缓冲大小
read_rnd_buffer_size = 4M        # 随机读取缓冲大小

# 连接设置
max_connections = 200            # 最大连接数
wait_timeout = 600               # 连接超时时间(秒)
interactive_timeout = 600        # 交互式连接超时时间(秒)

# 日志设置
log_error = /usr/local/var/mysql/error.log
slow_query_log = 1               # 启用慢查询日志
slow_query_log_file = /usr/local/var/mysql/slow.log
long_query_time = 1              # 慢查询阈值(秒)
log_queries_not_using_indexes = 1 # 记录未使用索引的查询

# 二进制日志设置
log_bin = /usr/local/var/mysql/mysql-bin
expire_logs_days = 14            # 二进制日志保留天数
max_binlog_size = 256M           # 单个二进制日志文件大小

# InnoDB 设置
innodb_file_per_table = 1        # 每个表使用独立的表空间
innodb_flush_log_at_trx_commit = 1 # 每次事务提交都刷新日志到磁盘,最高安全性
innodb_flush_method = O_DIRECT   # 日志刷新方法,推荐使用 O_DIRECT
innodb_io_capacity = 400         # InnoDB I/O 容量
innodb_io_capacity_max = 800     # InnoDB 最大 I/O 容量
innodb_lock_wait_timeout = 50    # InnoDB 锁等待超时时间
innodb_log_file_size = 512M      # InnoDB 日志文件大小
innodb_log_files_in_group = 2    # InnoDB 日志文件数量
innodb_buffer_pool_instances = 4 # InnoDB 缓冲池实例数量,推荐为 CPU 核心数
innodb_thread_concurrency = 0    # InnoDB 线程并发数,0 表示自动

# 其他设置
skip_name_resolve = 1            # 跳过主机名解析,提高连接速度
skip_external_locking = 1        # 跳过外部锁定
lower_case_table_names = 0       # 区分表名大小写
query_cache_type = 0             # 禁用查询缓存
query_cache_size = 0             # 查询缓存大小

大型服务器配置(32GB+ 内存)

适合大型应用、高并发场景或数据仓库:

ini
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4

[mysqld]
# 基本设置
port = 3306
datadir = /usr/local/var/mysql
basedir = /usr/local/mysql
socket = /tmp/mysql.sock
pid-file = /usr/local/var/mysql/mysql.pid
server-id = 1

# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

# 内存设置
innodb_buffer_pool_size = 20G     # InnoDB 缓冲池大小,推荐为总内存的 60%-70%
key_buffer_size = 512M           # MyISAM 键缓冲大小
max_allowed_packet = 256M        # 最大允许的数据包大小
innodb_log_buffer_size = 64M     # InnoDB 日志缓冲大小
join_buffer_size = 8M            # 连接缓冲大小
sort_buffer_size = 8M            # 排序缓冲大小
read_buffer_size = 4M            # 顺序读取缓冲大小
read_rnd_buffer_size = 8M        # 随机读取缓冲大小

# 连接设置
max_connections = 500            # 最大连接数
wait_timeout = 600               # 连接超时时间(秒)
interactive_timeout = 600        # 交互式连接超时时间(秒)
max_connect_errors = 10000       # 最大连接错误数

# 日志设置
log_error = /usr/local/var/mysql/error.log
slow_query_log = 1               # 启用慢查询日志
slow_query_log_file = /usr/local/var/mysql/slow.log
long_query_time = 1              # 慢查询阈值(秒)
log_queries_not_using_indexes = 1 # 记录未使用索引的查询
log_slow_admin_statements = 1    # 记录慢管理语句
log_slow_slave_statements = 1    # 记录从库慢查询

# 二进制日志设置
log_bin = /usr/local/var/mysql/mysql-bin
expire_logs_days = 30            # 二进制日志保留天数
max_binlog_size = 512M           # 单个二进制日志文件大小
sync_binlog = 1                   # 每次事务都刷新二进制日志到磁盘

# InnoDB 设置
innodb_file_per_table = 1        # 每个表使用独立的表空间
innodb_flush_log_at_trx_commit = 1 # 每次事务提交都刷新日志到磁盘
innodb_flush_method = O_DIRECT   # 日志刷新方法
innodb_io_capacity = 2000        # InnoDB I/O 容量
innodb_io_capacity_max = 4000    # InnoDB 最大 I/O 容量
innodb_lock_wait_timeout = 50    # InnoDB 锁等待超时时间
innodb_log_file_size = 2G        # InnoDB 日志文件大小
innodb_log_files_in_group = 2    # InnoDB 日志文件数量
innodb_buffer_pool_instances = 8 # InnoDB 缓冲池实例数量,推荐为 CPU 核心数
innodb_thread_concurrency = 0    # InnoDB 线程并发数
innodb_purge_threads = 4         # InnoDB 清理线程数
innodb_page_cleaners = 4         # InnoDB 页清理线程数
innodb_thread_sleep_delay = 1000 # InnoDB 线程睡眠延迟
innodb_max_dirty_pages_pct = 75  # InnoDB 最大脏页比例

# 线程池设置
thread_handling = pool-of-threads # 使用线程池
thread_pool_size = 16            # 线程池大小,推荐为 CPU 核心数
thread_pool_max_threads = 1000   # 线程池最大线程数

# 其他设置
skip_name_resolve = 1            # 跳过主机名解析
skip_external_locking = 1        # 跳过外部锁定
lower_case_table_names = 0       # 区分表名大小写
query_cache_type = 0             # 禁用查询缓存
query_cache_size = 0             # 查询缓存大小
innodb_adaptive_hash_index = 1   # 启用自适应哈希索引
innodb_stats_on_metadata = 0     # 禁用元数据统计

关键参数说明

基本设置

  • port:MariaDB 服务端口,默认 3306
  • datadir:数据目录路径
  • socket:UNIX 套接字文件路径
  • pid-file:PID 文件路径
  • server-id:服务器 ID,主从复制必需

字符集设置

  • character-set-server:服务器默认字符集,推荐 utf8mb4
  • collation-server:服务器默认排序规则
  • init_connect:连接初始化 SQL 语句

内存管理

  • innodb_buffer_pool_size:InnoDB 缓冲池大小,推荐为总内存的 50%-70%
  • key_buffer_size:MyISAM 键缓冲大小,用于缓存 MyISAM 表的索引
  • max_allowed_packet:最大允许的数据包大小,防止大查询占用过多资源
  • innodb_log_buffer_size:InnoDB 日志缓冲大小,用于缓存 Redo Log

连接管理

  • max_connections:最大连接数,根据服务器资源和业务需求调整
  • wait_timeout:非交互式连接超时时间
  • interactive_timeout:交互式连接超时时间
  • max_connect_errors:最大连接错误数,超过后会拒绝该主机连接

日志设置

  • log_error:错误日志路径
  • slow_query_log:是否启用慢查询日志
  • slow_query_log_file:慢查询日志路径
  • long_query_time:慢查询阈值,单位秒
  • log_queries_not_using_indexes:是否记录未使用索引的查询

二进制日志设置

  • log_bin:是否启用二进制日志
  • expire_logs_days:二进制日志保留天数
  • max_binlog_size:单个二进制日志文件大小
  • sync_binlog:二进制日志刷新策略,1 表示每次事务都刷新到磁盘

InnoDB 设置

  • innodb_file_per_table:是否为每个表使用独立的表空间
  • innodb_flush_log_at_trx_commit:Redo Log 刷新策略
    • 0:每秒刷新一次
    • 1:每次事务提交都刷新
    • 2:每次事务提交都刷新到操作系统缓存,每秒刷新到磁盘
  • innodb_flush_method:日志刷新方法,推荐 O_DIRECT
  • innodb_log_file_size:InnoDB 日志文件大小,推荐 512M-2G
  • innodb_buffer_pool_instances:缓冲池实例数量,推荐为 CPU 核心数
  • innodb_thread_concurrency:InnoDB 线程并发数,0 表示自动

线程池设置

  • thread_handling:线程处理方式,pool-of-threads 表示使用线程池
  • thread_pool_size:线程池大小,推荐为 CPU 核心数
  • thread_pool_max_threads:线程池最大线程数

版本差异

MariaDB 10.0+

  • 引入了 Aria 存储引擎相关参数
  • 增加了线程池相关参数
  • 增强了 InnoDB 性能参数

MariaDB 10.1+

  • 引入了虚拟列相关参数
  • 增加了 Galera Cluster 相关参数
  • 增强了动态列功能参数

MariaDB 10.2+

  • 支持 JSON 数据类型相关参数
  • 增加了降序索引相关参数
  • 增强了 InnoDB 功能参数

MariaDB 10.3+

  • 引入了 Sequence 对象相关参数
  • 增加了不可见索引相关参数
  • 增强了安全性相关参数

MariaDB 10.4+

  • 默认存储引擎改为 InnoDB
  • 增加了 Roles 功能相关参数
  • 增强了审计功能相关参数

MariaDB 10.5+

  • 引入了更多性能监控参数
  • 增强了 Galera Cluster 功能参数
  • 支持更多的加密选项

常见问题(FAQ)

1. 如何验证配置文件语法是否正确?

方法

bash
# 检查配置文件语法
mysqld --help --verbose | grep -A 10 "Default options"

# 或使用以下命令
mysqld --validate-config

2. 如何查看当前生效的配置参数?

方法

sql
-- 查看所有配置参数
SHOW VARIABLES;

-- 查看特定参数
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

-- 查看全局变量
SHOW GLOBAL VARIABLES LIKE 'max_connections';

3. 如何动态修改配置参数?

方法

sql
-- 临时修改会话变量(仅当前连接有效)
SET session max_connections = 200;

-- 临时修改全局变量(需要重启服务后持久化)
SET GLOBAL max_connections = 200;

-- 永久修改需要编辑配置文件

4. 配置文件修改后如何生效?

方法

bash
# 重启服务(所有配置都生效)
systemctl restart mariadb

# 或使用以下命令重新加载配置(部分配置生效)
mysqladmin reload

5. 如何优化 InnoDB 性能?

建议

  • 调整 innodb_buffer_pool_size 为总内存的 50%-70%
  • 设置 innodb_file_per_table = 1
  • 调整 innodb_log_file_size 为 512M-2G
  • 使用 innodb_flush_method = O_DIRECT
  • 增加 innodb_buffer_pool_instances 数量

6. 如何禁用查询缓存?

方法

ini
[mysqld]
query_cache_type = 0
query_cache_size = 0

7. 如何启用慢查询日志?

方法

ini
[mysqld]
slow_query_log = 1
slow_query_log_file = /path/to/slow.log
long_query_time = 1

8. 如何优化连接性能?

建议

  • 设置 skip_name_resolve = 1 跳过主机名解析
  • 调整 max_connections 为合适的值
  • 使用线程池(thread_handling = pool-of-threads
  • 设置合理的 wait_timeoutinteractive_timeout

最佳实践

1. 配置文件管理

  • 使用版本控制管理配置文件
  • 定期备份配置文件
  • 不同环境使用不同的配置文件(开发、测试、生产)
  • 配置文件中添加注释,说明参数用途和调整原因

2. 性能调优

  • 根据服务器资源和业务需求调整配置参数
  • 定期监控性能指标,如 CPU 使用率、内存使用率、I/O 等待等
  • 使用慢查询日志和性能模式分析性能瓶颈
  • 针对不同的工作负载优化配置参数

3. 安全配置

  • 禁用不必要的功能和插件
  • 限制远程访问,使用防火墙或 bind-address
  • 设置强密码策略
  • 定期更新 MariaDB 到最新版本

4. 监控和维护

  • 启用错误日志和慢查询日志
  • 定期分析日志,及时发现和解决问题
  • 使用监控工具,如 Prometheus、Grafana 等
  • 定期进行数据库健康检查

5. 测试和验证

  • 在测试环境中验证配置变更
  • 进行性能测试,比较配置变更前后的性能差异
  • 测试主从复制、备份恢复等功能

总结

MariaDB 配置文件是数据库性能和稳定性的关键,DBA 需要根据服务器规模、业务需求和工作负载合理调整配置参数。本文提供了不同规模服务器的配置模板,涵盖了基本设置、内存管理、连接管理、日志设置和 InnoDB 优化等方面。

在实际生产环境中,DBA 应该定期监控数据库性能,根据实际情况调整配置参数,并遵循最佳实践,确保数据库能够稳定、高效地运行。同时,需要关注 MariaDB 版本差异,确保配置参数的兼容性和有效性。

通过本文的介绍,相信您已经掌握了 MariaDB 配置文件的优化方法,能够根据实际情况制定合适的配置方案,提高数据库的性能和可靠性。