目录
- mysqlbinlog
- binlog 相关 sql
- 通过该命令将 binlog 转成可读的文本文件
mysqlbinlog
Binlog 是 mysql 用来记录数据变化的日志。通过 binlog 我们可以恢复数据,也可以跟踪数据的修改记录。Binlog 有三种模式:
- Statement Level 模式: 每一条修改数据的 sql 记录到 binlog 中
日志量少,但遇到 sql 中使用 now() 等 sql 函数,恢复数据时导致数据的不一致性 - Row Level模式:修改后的每一条数据记录到 binlog 中
日志量大,但不会有数据不一致问题 - 混合模式:前面两种模式优点的混合,根据 sql 的特点决定 Statement Level 模式或者 Row Level 模式。
了解 binlog 后,针对上面问题我们可以通过 binlog 确定数据是否是修改后又被修改回原来的值。
binlog 相关 sql
flush logs; // 产生一个新的日志文件
show variables like 'log_bin_basename'; // 查看日志存储地址
show binary logs; // 查看所有的binlog信息
show master status; // 查看最新日志文件名称
show binlog events in 'binlog.000008'; // 查看制定的binlog日志记录
通过该命令将 binlog 转成可读的文本文件
mysqlbinlog -vv --base64-output=decode-rows mysql-bin.000019 > mysql-bin.000019.txt
通过 grep 查找我们关心的数据,表名是需要查询表的名称,5575 是我的 id 字段,更新操作是根据 id 执行的
cat mysql-bin.002997.txt |grep -C 10 'UPDATE.*表名' | grep -C 10 '5575'
可以看到开始位置为 Pos,结束位置为 End_log_pos,接着用 mysqlbinlog 命令恢复
mysqlbinlog --no-defaults binlog.000008 --start-position=Pos --stop-position=End_log_pos | mysql -uroot -p123456 test
查询某个表特定时间的 binlog 日志
mysqlbinlog --start-datetime='2020-06-12 00:00:00' --stop-datetime='2020-06-12 17:54:49' /path/mysql-bin.00002 |grep 'receipt_list' >>/path/binlog20200612.sql