Linux下MariaDB日志管理指南
MariaDB的日志系统是其运维的重要工具,涵盖错误排查、性能优化、数据复制等多个场景。以下是具体管理方法:
错误日志(Error Log)
记录MariaDB服务器启动、运行及关闭过程中的错误信息(如启动失败、磁盘空间不足、权限问题等),是故障排查的核心依据。
查询日志(General Query Log)
记录所有客户端连接信息及执行的SQL语句(包括SELECT、INSERT等),用于审计或分析数据库操作行为,但会显著增加I/O负载,建议仅在调试时开启。
慢查询日志(Slow Query Log)
记录执行时间超过long_query_time阈值(默认10秒,可调整)的SQL语句,以及未使用索引的查询,是优化数据库性能的关键工具。
二进制日志(Binary Log,Binlog)
记录所有对数据库的更改操作(如INSERT、UPDATE、DELETE、CREATE TABLE等),以事件形式存储,用于主从复制、数据恢复(如通过mysqlbinlog工具恢复到指定时间点)。
中继日志(Relay Log)
仅在从服务器上使用,用于存储从主服务器接收的二进制日志,主从复制时,从服务器通过读取中继日志重放更改以实现数据同步。
MariaDB的日志配置通过修改配置文件实现(路径通常为/etc/my.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf,取决于发行版),关键参数如下:
[mysqld]
log_error = /var/log/mysql/error.log # 指定日志文件路径(需确保目录可写)
log_error_verbosity = 3 # 日志详细程度(0=无错误,1=错误,2=警告,3=信息,默认1)
[mysqld]
general_log = 1 # 开启查询日志(0=关闭,1=开启)
general_log_file = /var/log/mysql/query.log # 指定日志文件路径
[mysqld]
slow_query_log = 1 # 开启慢查询日志
slow_query_log_file = /var/log/mysql/slow-query.log # 日志文件路径
long_query_time = 2 # 慢查询阈值(秒,默认10秒)
log_queries_not_using_indexes = 1 # 记录未使用索引的查询
[mysqld]
log_bin = /var/log/mysql/mysql-bin.log # 开启二进制日志(路径需可写)
server_id = 1 # 服务器唯一标识(主从复制必需,集群中需唯一)
binlog_format = ROW # 日志格式(ROW/STATEMENT/MIXED,默认ROW,推荐ROW)
expire_logs_days = 10 # 日志自动过期天数(0=不自动删除)
max_binlog_size = 100M # 单个二进制日志文件最大大小(超过则滚动)
[mysqld]
relay_log = /var/log/mysql/mysql-relay-bin.log # 中继日志路径
relay_log_recovery = 1 # 中继日志恢复(从服务器崩溃后重新读取主库binlog)
使用logrotate工具自动轮转、压缩、删除旧日志,配置文件通常位于/etc/logrotate.d/mysql,示例如下:
/var/log/mysql/*.log {
daily # 每天轮转
missingok # 忽略缺失的日志文件
rotate 7 # 保留最近7天的日志
compress # 压缩旧日志(如.gz格式)
notifempty # 空日志不轮转
create 640 mysql adm # 新日志文件权限及所有者
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
systemctl restart mariadb >/dev/null 2>&1 || true # 重启MariaDB以重新打开日志文件
endscript
}
手动测试配置是否正确:
sudo logrotate -vf /etc/logrotate.d/mysql
实时查看日志
tail -f /var/log/mysql/error.log # 实时查看错误日志
tail -f /var/log/mysql/slow-query.log # 实时查看慢查询日志
使用journalctl查看(systemd系统)
sudo journalctl -u mariadb.service -f # 实时查看MariaDB日志
sudo journalctl -u mariadb.service --since "2025-10-01" --until "2025-10-07" # 按时间范围查看
分析慢查询日志
使用mysqldumpslow工具(MariaDB自带)分析慢查询日志,找出最耗时的查询:
mysqldumpslow -s t /var/log/mysql/slow-query.log # 按执行时间排序
mysqldumpslow -s c /var/log/mysql/slow-query.log # 按出现次数排序
查看二进制日志内容
使用mysqlbinlog工具解析二进制日志(需指定日志文件路径):
mysqlbinlog /var/log/mysql/mysql-bin.000001 # 查看二进制日志内容
mysqlbinlog --start-datetime="2025-10-01 00:00:00" --stop-datetime="2025-10-01 23:59:59" /var/log/mysql/mysql-bin.000001 # 按时间范围查看
清理旧日志
logrotate配置的expire_logs_days参数自动删除过期日志。find命令删除超过指定天数的日志文件:find /var/log/mysql/ -type f -name "*.log" -mtime +30 -exec rm {} \; # 删除30天前的.log文件
/var/log/mysql)的所有者为mysql或mariadb用户(通常为mysql:mysql),避免权限问题导致日志无法写入。expire_logs_days,避免日志文件占用过多磁盘空间(如设置为7-30天)。log_bin和server_id配置正确,从服务器的relay_log和server_id配置正确。通过以上步骤,可实现MariaDB日志的有效管理,保障数据库的稳定运行与可维护性。