MariaDB 配置方法
!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_check 或 cracklib_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 官方提供了 mysqltuner 和 mysqlreport 等工具,可以分析数据库运行状态并给出配置建议。安装后执行即可获取报告:
sudo apt install mysqltuner # Debian/Ubuntu
sudo mysqltuner
根据建议有针对性地调整内存、连接数等参数。
七、常见问题排查
Q:修改 innodb_log_file_size 后 MariaDB 无法启动,报错 ib_logfile0 is of different size
A:关闭服务,手动删除 datadir 下的 ib_logfile0 和 ib_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