003 二进制日志-binlog
Binlog(Binary Log) 是 MySQL 用来记录 数据库中所有“数据变更行为” 的日志文件。
核心一句话:
只要数据被“写过”,并且 binlog 开启,就一定能在 binlog 里找到痕迹。
Binlog 会记录:
INSERTUPDATEDELETECREATE / DROP TABLEALTER 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 = 10binlog_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.sqlbinlog日志转存伪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.sqlmysql binlog执行无效 执行mysqlbinlog出现Found invalid event in binary log 错误
一般这种情况都是由于mysqlbinlog的版本和在用的mysql版本不一致造成的,需要指定mysqlbinlog路径执行

浙公网安备 33010602011771号