Ubuntu MariaDB日志管理实用技巧
MariaDB的日志主要分为以下几类,需根据需求启用并配置路径:
/etc/mysql/mariadb.conf.d/50-server.cnf
):[mysqld]
log_error = /var/log/mysql/mariadb-error.log
log_error_verbosity = 3 # 记录错误、警告、提示(级别越高越详细)
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 2 # 阈值(秒),建议从2开始调整
log_queries_not_using_indexes = 1 # 记录未使用索引的查询
[mysqld]
log_bin = /var/log/mysql/mariadb-bin # 自动追加序号(如.000001)
binlog_format = ROW # 推荐ROW格式(更准确)
expire_logs_days = 7 # 自动过期天数(避免磁盘爆满)
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/mariadb-query.log
general_log_output = FILE
50-server.cnf
添加plugin_load_add = server_audit
;server_audit_events = CONNECT,QUERY,TABLE # 监听连接、查询、表操作
server_audit_logging = ON
server_audit_file_path = /var/log/mysql/audit.log
server_audit_file_rotate_size = 100M # 单个文件大小
server_audit_file_rotations = 5 # 保留文件数
重启服务使配置生效:sudo systemctl restart mariadb
。使用logrotate
工具定期轮转日志,避免单个文件过大占用磁盘空间。
logrotate
已内置MariaDB配置(/etc/logrotate.d/mysql
),内容如下:/var/log/mysql/*.log {
daily # 每天轮转
rotate 7 # 保留7天
missingok # 文件不存在不报错
compress # 压缩旧日志(gzip)
delaycompress # 延迟压缩(避免影响当前日志写入)
notifempty # 空日志不轮转
create 640 mysql adm # 新日志权限(用户:组)
sharedscripts # 所有日志处理完再执行脚本
postrotate
/usr/bin/mysqladmin flush-logs # 刷新日志(重新打开文件句柄)
endscript
}
-v
显示详细过程,-f
强制轮转:sudo logrotate -vf /etc/logrotate.d/mysql
mysqladmin flush-logs
或 FLUSH LOGS;
(SQL命令)。tail -f
跟踪日志更新(如错误日志):sudo tail -f /var/log/mysql/mariadb-error.log
grep
过滤特定内容(如“error”):sudo grep -i "error" /var/log/mysql/mariadb-error.log
mysqldumpslow
(内置工具)统计慢查询:mysqldumpslow -s t /var/log/mysql/mariadb-slow.log
(按时间排序);pt-query-digest
(Percona工具包)生成详细报告:pt-query-digest /var/log/mysql/mariadb-slow.log > slow_report.txt
mysqlbinlog
查看变更内容(如恢复数据):mysqlbinlog /var/log/mysql/mariadb-bin.000001
;mysqlbinlog --start-datetime="2025-10-01 00:00:00" --stop-datetime="2025-10-01 23:59:59" /var/log/mysql/mariadb-bin.000001
;mysqlbinlog /var/log/mysql/mariadb-bin.000001 > recovery.sql
。journalctl -u mariadb
;journalctl --since "2025-10-01" --until "2025-10-02"
;journalctl --vacuum-size=100M
(限制总大小为100M)或journalctl --vacuum-time=2weeks
(清理两周前的日志)。/var/log/mysql/
)仅允许mysql
用户和adm
组访问:sudo chown -R mysql:adm /var/log/mysql/
;sudo chmod -R 750 /var/log/mysql/
。logrotate
外,可定期用find
命令删除旧日志(如超过30天):find /var/log/mysql/ -type f -name "*.log" -mtime +30 -exec rm {} \;
(谨慎使用,建议配合logrotate
)。general_log = 0
),避免记录所有查询导致磁盘占用过高;log_bin = ON
),确保数据可恢复;long_query_time
):根据业务需求设置为1-5秒,优先优化高频慢查询。