本文档介绍如何使用binlog进行数据恢复

场景描述

需要恢复的数据日期
开始时间为2024-05-28 01:33:02
截止时间为2024-06-06 09:40:00
先进入mysql的binlog目录所在,一般是/var/lib/mysql
对最新的binlog文件执行命令,比如最新的binlog文件为binlog.000050 查看最后10行,确保binlog内记录时间是对的

1
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS --start-datetime="2024-05-28 01:33:02" --stop-datetime="2024-06-06 09:40:00"  -v ./binlog.000050 |  tail -10

这条命令用于读取并解析 MySQL 二进制日志文件 (binlog.000091) 的内容,并且只显示日志文件中的最后 10 行。以下是各个参数的详细介绍:

  1. mysqlbinlog: 这是用于处理 MySQL 二进制日志文件的工具。

  2. --no-defaults: 这个参数告诉 mysqlbinlog 工具不要读取默认的选项文件(例如 /etc/my.cnf)。

  3. --base64-output=DECODE-ROWS: 这个参数指示 mysqlbinlog 输出时将包含基于 BASE64 编码的行事件解码为人类可读的形式。DECODE-ROWS 是指将行格式事件解码为 SQL 语句。

  4. --start-datetime="2024-05-28 01:33:02": 指定读取二进制日志的开始时间,只处理这个时间点之后的事件。

  5. --stop-datetime="2024-06-06 09:40:00": 指定读取二进制日志的结束时间,只处理这个时间点之前的事件。

  6. -v: 这个参数告诉 mysqlbinlog 使用详细模式输出,显示更多的细节信息。

  7. ./binlog.000050: 指定要读取的二进制日志文件的路径和文件名。

  8. | tail -10: 管道操作符 (|) 将 mysqlbinlog 的输出传递给 tail 命令,tail -10 表示只显示输出的最后 10 行。

当在binlog.000050文件中并没有记录2024-06-06 09:40:00时间段时,就需要去查看binlog.000049、binlog.000048、binlog.000047 …文件了

1
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS --start-datetime="2024-05-28 01:33:02" --stop-datetime="2024-06-06 09:40:00"  -v ./binlog.000049 |  tail -10

假如最终查看到47文件才包含了截止时间

1
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS --start-datetime="2024-05-28 01:33:02" --stop-datetime="2024-06-06 09:40:00"  -v ./binlog.000047 |  tail -10

将其记录下来

确定开始时间在哪个binlog文件
一般binlog会定期清理,假如只剩下binlog.000030—binlog.000050的文件

1
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS --start-datetime="2024-05-28 01:33:02" --stop-datetime="2024-06-06 09:40:00"  -v ./binlog.000030 |  tail -10

假如最终查看到35文件才包含了开始时间

1
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS --start-datetime="2024-05-28 01:33:02" --stop-datetime="2024-06-06 09:40:00"  -v ./binlog.000035 |  tail -10

将其记录下来

将binlog转化为sql文件

1
2
3
4
5
mkdir sqldir
for i in {35..47}
do
mysqlbinlog --no-defaults --base64-output=DECODE-ROWS --start-datetime="2024-05-28 01:33:02" --stop-datetime="2024-06-06 09:40:00" -v /var/lib/mysql/binlog.0000$i > sqldir/out$i.sql
done

将sql文件导入数据库

然后再按照开始时间为2024-05-28 01:33:02依次执行sql,一定要按照时间顺序执行

1
2
3
4
for i in {35..47}
do
mysql -uroot -p'密码' 要恢复的库名 < sqldir/out$i.sql
done