binlog恢复数据
本文档介绍如何使用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 行。以下是各个参数的详细介绍:
mysqlbinlog
: 这是用于处理 MySQL 二进制日志文件的工具。--no-defaults
: 这个参数告诉mysqlbinlog
工具不要读取默认的选项文件(例如/etc/my.cnf
)。--base64-output=DECODE-ROWS
: 这个参数指示mysqlbinlog
输出时将包含基于 BASE64 编码的行事件解码为人类可读的形式。DECODE-ROWS
是指将行格式事件解码为 SQL 语句。--start-datetime="2024-05-28 01:33:02"
: 指定读取二进制日志的开始时间,只处理这个时间点之后的事件。--stop-datetime="2024-06-06 09:40:00"
: 指定读取二进制日志的结束时间,只处理这个时间点之前的事件。-v
: 这个参数告诉mysqlbinlog
使用详细模式输出,显示更多的细节信息。./binlog.000050
: 指定要读取的二进制日志文件的路径和文件名。| 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 | mkdir sqldir |
将sql文件导入数据库
然后再按照开始时间为2024-05-28 01:33:02依次执行sql,一定要按照时间顺序执行
1 | for i in {35..47} |