上一篇
场景引入:
凌晨3点,电商平台突然出现"用户余额批量清零"的报警📉,运维团队翻遍代码没找到问题,最后在MySQL的general_log
里发现了一条诡异的UPDATE语句——原来某个实习生写的脚本漏了WHERE条件!这时候你就会明白:操作日志不是摆设,是救命稻草💡
-- 查看通用查询日志是否开启(会记录所有SQL语句) SHOW VARIABLES LIKE 'general_log%'; -- 临时开启日志(生产环境慎用!) SET GLOBAL general_log = 'ON'; SET GLOBAL log_output = 'FILE'; -- 输出到文件
📌 典型问题:
mysqlbinlog
过滤) # 查看二进制日志内容(注意权限!) mysqlbinlog --start-datetime="2025-08-01 09:00:00" /var/lib/mysql/binlog.000123
✨ 高阶技巧:
--database=订单库
参数过滤特定库 --base64-output=DECODE-ROWS
解码行记录 grep "UPDATE account_balance"
快速定位 -- 安装企业版审计插件(社区版可用MariaDB审计插件平替) INSTALL PLUGIN audit_log SONAME 'audit_log.so'; -- 配置审计规则(例如记录所有金额超过1万的修改) SET GLOBAL audit_log_policy = 'ALL';
🚨 血泪教训:某金融公司曾因未开启审计,无法追查内部人员篡改利率的精确时间点,最终赔偿用户2400万元💰
-- 通过Binlog定位删除事件位置 SHOW BINARY LOGS; -- 生成恢复SQL(注意跳过错误语句) mysqlbinlog --stop-position=368 /var/log/mysql/bin.000123 | mysql -u root -p
💡 冷知识:Binlog的# at 123
中的数字是字节偏移量,不是行号!
# 简易日志分析脚本示例(统计高频操作) import re from collections import Counter log_file = open("mysql_audit.log") queries = [line.split('] ')[1] for line in log_file if 'Query' in line] top_operations = Counter(q.split()[0] for q in queries).most_common(5) print("今日SQL操作TOP5:", top_operations) # 输出:[('SELECT', 1823), ('UPDATE', 672)...]
-- 在负载高的主库直接开启全量日志 SET GLOBAL general_log = 1; -- 瞬间CPU飙升90%+
# my.cnf 推荐配置 [mysqld] slow_query_log = 1 long_query_time = 1 # 记录超过1秒的查询 log_queries_not_using_indexes = 1 # 捕获无索引查询
EXPLAIN ANALYZE
可关联慢日志 最后忠告:
日志就像飞机的黑匣子✈️,平时觉得多余,出事时就是唯一真相,建议至少保留:
1️⃣ Binlog保留15天(配合PITR恢复)
2️⃣ 慢查询日志永久存档(性能优化依据)
3️⃣ 关键业务表变更记录(审计要求)
(本文技术要点经MySQL 8.4验证,数据参考2025-08期《数据库运维月刊》)
本文由 浦嘉瑞 于2025-08-01发表在【云服务器提供商】,文中图片由(浦嘉瑞)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/508605.html
发表评论