MariaDB 配置方法

FreeGuideOnline 最新 2026-07-15

!includedir /etc/my.cnf.d/


### 1.2 查看当前加载的配置文件
连接数据库后,执行以下命令可以列出 MariaDB 启动时实际读取的配置文件及顺序:
```sql
SHOW VARIABLES LIKE 'config_file%';

或者直接在 shell 中使用 mysqld --verbose --help | head -20 查看默认选项文件路径。

建议:遵循系统包管理器的文件组织方式,尽量不要把所有配置都堆在主文件里。独立文件容易维护,也便于版本控制。

二、基础配置段与参数详解

MariaDB 配置文件被划分为不同的配置段([group]),常用的有 [mysqld][client][mysql] 等。服务端核心配置都在 [mysqld] 段下。

2.1 必知必会的通用配置

打开配置文件,在 [mysqld] 段中添加或修改以下参数:

[mysqld]
# 数据库数据存放目录,确保磁盘空间充足
datadir = /var/lib/mysql

# 临时文件目录,建议放在高速磁盘上
tmpdir = /tmp

# 绑定监听地址,生产环境不要开放全网段
bind-address = 127.0.0.1

# 默认端口,按需修改
port = 3306

# 默认存储引擎,强烈推荐 InnoDB
default_storage_engine = InnoDB

# 字符集与排序规则
character-set-server  = utf8mb4
collation-server      = utf8mb4_unicode_ci

说明utf8mb4 是真正的 UTF-8 支持,可以存储 emoji 等四字节字符。排序规则 utf8mb4_unicode_ci 通用性好,若不关心重音区分可改用 utf8mb4_general_ci

2.2 内存与缓存相关参数(影响性能)

合理的缓存配置可以显著提升查询速度。初学者可根据物理内存粗略估算:

假设总内存 4GB,只运行 MariaDB 的简单场景:

# InnoDB 缓冲池大小,设为物理内存的 50%~70%
innodb_buffer_pool_size = 2G

# 查询缓存:0 代表关闭(高并发下建议关),1 为开启
query_cache_type = 0
query_cache_size = 0

# 连接线程独享缓冲区(排序、读表等)
sort_buffer_size  = 2M
read_buffer_size  = 2M
read_rnd_buffer_size = 2M

# 每个连接堆栈大小
thread_stack = 256K

参数速查表

参数 作用 建议值
innodb_buffer_pool_size InnoDB 数据和索引缓存,最重要的参数 物理内存的 50%~70%
query_cache_type 开启查询缓存(0/1) 0 (高并发场景)
max_connections 最大并发连接数 先设为 200,按需调整
table_open_cache 可缓存的打开表文件描述符数量 通常为 max_connections × 平均表数

2.3 InnoDB 核心配置

# 独立表空间,每个表一个 .ibd 文件,便于管理
innodb_file_per_table = 1

# 重做日志文件大小,过小影响写入性能
innodb_log_file_size = 256M

# 日志缓冲区
innodb_log_buffer_size = 16M

# 事务提交方式:1 代表每次事务提交都刷写磁盘,性能与安全兼顾可用 2
innodb_flush_log_at_trx_commit = 2

# InnoDB 双写缓冲,建议开启防止页损坏
innodb_doublewrite = 1

注意:修改 innodb_log_file_size 后,需要先彻底关闭 MySQL 服务,删除原有的 ib_logfile 文件,再重启,否则无法启动。

三、安全配置(mysql_secure_installation 进阶)

MariaDB 自带的安全脚本 mysql_secure_installation 可以完成基础安全设置,但你需要理解其背后的配置项。手动配置时可参考以下步骤:

3.1 设置 root 密码及认证方式

初次安装后,可以用 mysql -u root 无密码登录,首先修改 root 密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY '强密码';

如果遇到 plugin 'unix_socket' 的问题,需要先修改认证插件:

UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE User = 'root';
FLUSH PRIVILEGES;

3.2 删除匿名用户和测试数据库

DELETE FROM mysql.user WHERE User='';
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
FLUSH PRIVILEGES;

3.3 限制 root 远程登录

生产环境应禁止 root 账号从远程主机连接。检查并确保 host 字段仅为 localhost

SELECT User, Host FROM mysql.user WHERE User='root';
-- 如果存在 '%' 或特定 IP,删除或修改
DELETE FROM mysql.user WHERE User='root' AND Host <> 'localhost';
FLUSH PRIVILEGES;

3.4 启用密码强度验证插件(可选)

MariaDB 10.1+ 支持 simple_password_checkcracklib_password_check 插件,可在配置文件中启用:

[mysqld]
plugin-load-add = simple_password_check
simple_password_check_minimal_length = 10

四、网络与远程访问配置

默认情况下,MariaDB 仅监听本地环回地址,出于安全考虑这是正确的。若需要允许其他主机连接,请按以下步骤操作。

4.1 修改监听地址

编辑配置文件,在 [mysqld] 段注释或修改 bind-address

# 允许所有 IPv4 连接(内部网络使用,公网强烈不建议)
bind-address = 0.0.0.0

# 或者仅监听特定内网IP
bind-address = 192.168.1.100

4.2 创建远程访问用户并授权

不要直接开放 root 远程。为不同应用程序创建专用账号,并限制来源 IP:

CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'app_password';
GRANT ALL PRIVILEGES ON app_db.* TO 'appuser'@'192.168.1.%';
FLUSH PRIVILEGES;
  • 'appuser'@'192.168.1.%' 表示该用户只能从 192.168.1.0/24 网段连接。
  • 如果需要整个公司内网,可以设置为 'appuser'@'10.0.0.%'
  • 若测试环境暂时不限制 IP,可使用 'appuser'@'%',但务必在测试结束后回收权限。

4.3 防火墙设置

Linux 系统通常需要开放防火墙端口,以 firewalld 为例:

sudo firewall-cmd --permanent --add-service=mysql
sudo firewall-cmd --reload

或 iptables:

sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT

五、日志与慢查询配置

合理配置日志有助于排查问题,但注意日志文件可能占用大量磁盘空间。

[mysqld]
# 错误日志默认开启,可自定义位置
log_error = /var/log/mysql/error.log

# 通用查询日志(生产环境长时间开启会严重影响性能,仅调试时启用)
# general_log = 1
# general_log_file = /var/log/mysql/general.log

# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2           # 执行超过2秒的SQL会被记录
log_queries_not_using_indexes = 1  # 记录未使用索引的查询(会产生大量日志)
log_slow_admin_statements = 1

每次配置文件修改后,需重启 MariaDB 使设置生效:

sudo systemctl restart mariadb   # 或 service mysql restart

六、配置检查与性能分析工具

6.1 语法校验

重启服务前,推荐先用以下命令检查配置语法:

mysqld --validate-config

若有错误会直接提示行号,避免启动失败。

6.2 运行时参数动态修改

部分参数支持在线调整,无需重启:

SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;

但注意,动态修改的参数在重启后会失效,如需永久生效仍需写入配置文件。

6.3 配置调优辅助

MariaDB 官方提供了 mysqltunermysqlreport 等工具,可以分析数据库运行状态并给出配置建议。安装后执行即可获取报告:

sudo apt install mysqltuner   # Debian/Ubuntu
sudo mysqltuner

根据建议有针对性地调整内存、连接数等参数。

七、常见问题排查

Q:修改 innodb_log_file_size 后 MariaDB 无法启动,报错 ib_logfile0 is of different size

A:关闭服务,手动删除 datadir 下的 ib_logfile0ib_logfile1 文件,然后重新启动。注意备份数据!

Q:远程连接被拒绝,报错 Host '...' is not allowed to connect to this MariaDB server

A:检查用户权限中 Host 字段是否匹配客户端 IP;确认配置文件中 bind-address 是否包含客户端网络;检查防火墙是否放行 3306 端口。

Q:中文字符插入乱码或报错 Incorrect string value

A:确保库、表、连接的字符集均为 utf8mb4。可以在客户端连接时指定 --default-character-set=utf8mb4,或配置 [client] 段:

[client]
default-character-set = utf8mb4