Binlog 常见操作命令
Binlog 的查询方式一般分为两种,一种是进入 MySQL 控制台进行查询,另一种是通过 MySQL 提供的工具 mysqlbinlog
进行查询,两者的不同如下介绍
通过 MySQL Cli 查询 BINLOG 信息
在 cli 中,常见的命令如下:
使用 SHOW BINLOG EVENTS
的问题:
- 使用该命令时,如果当前的 binlog 文件很大,而且没有指定
limit
,会引发对资源的过度消耗。因为 MySQL 客户端需要将 binlog 的全部内容处理,返回并显示出来。为了防止这种情况,mysqlbinlog 工具是一个很好的选择。
通过 mysqlbinlog 查询 BINLOG 信息
查看 binlog 文件的内容
字段说明:
at
表示 offset 或者说事件开始的起始位置
100309 9:28:36 server id 123
表示 server 123 开始执行事件的日期时间点
end_log_pos 245
表示事件的结束位置 +1,或者说是下一个事件的起始位置。
exec_time
表示 master 上执行花费的时间,在 slave 上,记录的时间是从 Master 记录开始,一直到 Slave 结束完成所花费的时间。
error_code=0
表示没有错误发生。
mysqlbinlog 用途如下:
- mysqlbinlog 可以作为代理 cli 读取 binlog 的工具;
- mysqlbinlog 可以讲执行过的 SQL 语句输出,用于数据的恢复或备份。
查看 BINLOG 日志
导出 BINLOG 日志,用于分析和排查 sql 语句
导入 BINLOG 日志
mysqlbinlog 参数说明
官方文档:https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlog.html
参数变化说明
mysqlbinlog 的常用参数
GTID截取示例
使用 BINLOG 恢复数据
准备数据
删除表或者数据
误删操作
数据的恢复
数据恢复前工作
在执行数据恢复前,如果操作的是生产环境,会有如下建议:
- 使用
flush logs
前滚 binlog 日志序列号,好处如下:
- 可将误删除操作,定位在一个 binlog 文件中,便于之后的数据分析和恢复;
- 避免操作正在被使用的 binlog 文件,防止意外情况;
- 数据的恢复不要在生产库中执行,现在临时库恢复,确认无误后,再导入生产库,防止对数据产生二次破坏。
通常来说,恢复主要有两个步骤:
- 在临时库中,恢复定期执行的全量备份数据。
- 基于全量备份的数据点,通过 binlog 来恢复误操作和正常的数据
使用 BINLOG 做数据恢复前:
确定恢复数据的步骤
这里主要有两条误删的操作,数据行的误删和表的误删。有两种方式进行恢复。
- 方式一:首先恢复到删除表操作之前的位置,然后再单独恢复误删的数据行
- 方式二:首先恢复到误删数据行之前的位置,然后跳过误删时间再恢复数据表操作之前的位置
查询创建表的事件位置和删除表的事件位置
根据位置导出 SQL 文件
说明: 因为恢复数据的时候,这些SQL语句对应的 gtid 事务已经执行过了,由于gtid 特性是只要binlog中记录了对应的gtid,就不会执行,这个是gtid 的幂等性检查机制,因此 mysqlbinlog 过滤数据的时候一定要开启参数 --skip-gtids
, 默认值是 true