Linux环境下MariaDB日志分析的完整流程
MariaDB的日志文件路径由配置文件(/etc/my.cnf或/etc/mysql/mariadb.conf.d/*.cnf)定义,默认位置如下:
/var/log/mariadb/mariadb.log(部分系统可能为/var/log/mysql/error.log);/var/log/mysql/slow.log(或自定义路径,如/var/lib/mysql/slow.log);/var/log/mysql/general.log;/var/log/mysql/mysql-bin.*。若默认未开启所需日志,需修改MariaDB配置文件(/etc/my.cnf或/etc/mysql/mariadb.conf.d/*.cnf)并重启服务:
[mysqld]
log_error = /var/log/mariadb/mariadb.log
[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1 # 设置慢查询阈值为1秒(可根据业务调整)
log_queries_not_using_indexes = ON # 可选:记录未使用索引的查询
[mysqld]
general_log = ON
general_log_file = /var/log/mysql/general.log
修改完成后,重启MariaDB使配置生效:
sudo systemctl restart mariadb
使用tail -f命令实时监控日志更新(如错误日志):
sudo tail -f /var/log/mariadb/mariadb.log
使用grep命令过滤日志中的关键信息(如“error”“slow query”):
# 查找错误日志中的“ERROR”关键词
sudo grep -i "error" /var/log/mariadb/mariadb.log
# 查找慢查询日志中的“Slow query”关键词
sudo grep -i "slow query" /var/log/mysql/slow.log
使用mysqlbinlog工具解析二进制日志(需指定日志文件路径):
# 查看最新二进制日志的内容
sudo mysqlbinlog /var/log/mysql/mysql-bin.000001
# 查看指定时间段的二进制日志(如2025-10-01至2025-10-31)
sudo mysqlbinlog --start-datetime="2025-10-01 00:00:00" --stop-datetime="2025-10-31 23:59:59" /var/log/mysql/mysql-bin.000001
慢查询日志是优化数据库性能的关键,常用分析工具如下:
mysqldumpslow(MariaDB自带)mysqldumpslow可统计慢查询日志中的高频查询、执行时间等信息,常用命令:
# 统计慢查询日志中出现次数最多的前10条查询
sudo mysqldumpslow -s c /var/log/mysql/slow.log | head -n 10
# 统计执行时间最长的前10条查询
sudo mysqldumpslow -s t /var/log/mysql/slow.log | head -n 10
# 显示带执行时间的慢查询详情
sudo mysqldumpslow -v /var/log/mysql/slow.log
pt-query-digest(Percona Toolkit工具)pt-query-digest功能更强大,可生成详细的慢查询报告(需提前安装Percona Toolkit):
# 分析慢查询日志并生成报告
sudo pt-query-digest /var/log/mysql/slow.log > slow_report.txt
# 查看报告中的Top 10慢查询
head -n 20 slow_report.txt
报告中会包含慢查询的执行时间、扫描行数、锁时间、执行频率等信息,帮助快速定位性能瓶颈。
使用logrotate工具自动轮换、压缩旧日志,避免日志文件占用过多磁盘空间:
在/etc/logrotate.d/目录下创建mariadb配置文件:
sudo nano /etc/logrotate.d/mariadb
添加以下内容(覆盖错误日志、慢查询日志等):
/var/log/mariadb/mariadb.log {
daily # 每天轮换
rotate 7 # 保留最近7天的日志
missingok # 若日志文件不存在也不报错
notifempty # 若日志为空则不轮换
compress # 压缩旧日志(如.gz格式)
delaycompress # 延迟压缩(避免压缩当天日志)
create 0640 mysql mysql # 创建新日志文件的权限和所有者
sharedscripts # 所有日志轮换完成后执行脚本
postrotate
systemctl restart mariadb > /dev/null 2>&1 || true
endscript
}
# 测试配置文件语法是否正确
sudo logrotate -d /etc/logrotate.d/mariadb
# 手动触发轮换
sudo logrotate -f /etc/logrotate.d/mariadb
通过以上配置,logrotate会每天自动处理MariaDB日志,保持日志文件的可管理性。