Loading

003 二进制日志-binlog

Binlog(Binary Log) 是 MySQL 用来记录 数据库中所有“数据变更行为” 的日志文件。

核心一句话:

只要数据被“写过”,并且 binlog 开启,就一定能在 binlog 里找到痕迹。

Binlog 会记录:

  • INSERT
  • UPDATE
  • DELETE
  • CREATE / DROP TABLE
  • ALTER TABLE
  • 事务的 BEGIN / COMMIT

❌ 不记录

  • SELECT
  • 纯查询操作
  • 内存计算

Binlog 的核心用途

主从复制(Replication)

  • 从库通过 binlog 同步主库的数据变更

数据恢复(Point-in-Time Recovery)

  • 通过 全量备份 + binlog 恢复到任意时间点

安全审计 / 事后追责(非常重要)

  • 查清楚:比如查看什么时候修改了哪条记录。

开启 MySQL Binlog(重启 MySQL 生效)

[mysqld]
# 开启 binlog
log-bin=mysql-bin

# 每台 MySQL 实例必须唯一
server-id = 1

# binlog 格式(推荐)
binlog_format = mixed

# binlog 自动过期天数
expire_logs_days = 10
binlog_format 三种模式
模式说明是否推荐
STATEMENT记录原始 SQL❌ 不安全
ROW记录行变更✅ 最安全
MIXED自动选择生产推荐

重启:
service mysqld restart
# 或
systemctl restart mysqld
查看 binlog 是否启用
SHOW VARIABLES LIKE 'log_bin';

查看 Binlog 的官方工具:mysqlbinlog

binlog 是二进制,只能用这个工具解析

实战案例 排查 t_syspara.customer_service_url 被篡改

导出完整 Binlog 为可读 SQL, 不要加“--database” 参数,否则会导致漏掉事务的可能。
/www/server/mysql/bin/mysqlbinlog   /www/server/data/mysql-bin.000015  > /tmp/mall_binlog_000015.sql
快速定位目标表 t_syspara
 grep -ni "t_syspara" /tmp/mall_binlog_000015.sql
假设要查看 行号 3225984 的数据。
导出完整事务上下文。
 sed -n $((3225984-200)),$((3225984+200))p /tmp/mall_binlog_000015.sql > /tmp/t_syspara_customer_service_url_context.sql




binlog日志转存伪SQL:


-V, --version  mysqlbinlog的版本信息
binlog文件读取的起始时间点  --start-datetime="2017-08-16 10:00:00"
binlog文件读取的结束时间点 --stop-datetime="2017-08-16 15:00:00" 
binlog输出语句的base64解码  --base64-output=decode-rows
        decode-rows:这个选项将把基于行的事件解码成一个SQL语句,特别是当指定-verbose选项时使用解码行事件到带注释的伪SQL语句,如下所示。
        mysqlbinlog --base64-output=decode-rows --verbose mysqld-bin.000001
重新构建伪SQL语句的行信息输出,-v -v会增加列类型的注释信息。-v, --verbose 
 --no-defaults 选项   修复utf8mb4选项带来的在mysqlbinlog查看binlog时会报错问题
mysqlbinlog.exe 
--no-defaults 
--base64-output=decode-rows 
-v 
--start-datetime="2021-04-20 11:41:15" 
--stop-datetime="2021-04-20 11:41:20" 
D:\Download\mysql-bin.000289   > D:\Download\test4.txt\

mysqlbinlog --no-defaults --base64-output=decode-rows -v 
--start-datetime="2021-05-13 09:00:00" --stop-datetime="2021-05-13 09:10:00"  
mysql-bin.00001 > 566.sql


mysql binlog执行无效 执行mysqlbinlog出现Found invalid event in binary log 错误
一般这种情况都是由于mysqlbinlog的版本和在用的mysql版本不一致造成的,需要指定mysqlbinlog路径执行






posted @ 2026-01-08 21:42  LungGiyo  阅读(3)  评论(0)    收藏  举报