MySql通过binlog恢复数据b
00 分钟
2022-8-26

1.首先检查binlog是否已经开启,命令如下:

mysql> show variables like '%log_bin%';
结果如下:
log_bin:是否开启
log_bin_basename:bin文件路径及名前缀
log_bin_index:bin文件index
如果log_bin为ON代表开启,否则为关闭。如果log_bin没开启,恭喜你数据彻底无法恢复,如果开启请继续往下看
notion image
2.利用bin-log二进制日志文件恢复数据:
mysql二进制日志文件恢复数据有两种方式:使用事件时间的时间点恢复和使用事件位置的时间点恢复;

(1)使用事件时间的时间点恢复:

要指明恢复的开始和结束时间,两个选项参数是: --start-datetime和 --stop-datetime;
语法格式:mysqlbinlog [参数] DATETIME
例如,假设在2019年5月7日上午10:00,执行了一个删除了一个大表的SQL语句。要还原表和数据,可以恢复前一天的备份,然后执行以下命令:
mysqlbinlog --stop-datetime="2019-05-06 23:59:59" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
如果您还需要恢复2019年5月7日上午10:00之后发生的活动。可以用命令:
mysqlbinlog --start-datetime="2019-05-07 10:01:00" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p

(2)使用事件位置的时间点恢复:

而不是指定日期和时间, --start-position 和--stop-position选项 可用于指定日志位置。它们的工作方式与--start-datetime和 --stop-datetime选项相同,只是指定日志位置数字而不是日期。使用可能会使您更准确地了解日志的哪个部分进行恢复,特别是如果许多事务发生在与SQL语句相同的时间内。
要确定位置号码,请在执行不需要的事务的时间范围内运行 mysqlbinlog,但将结果重定向到文本文件进行检查。你可以这样做:
mysqlbinlog --start-datetime="2019-05-07 900" --stop-datetime="2019-05-07 10:05:00" /var/lib/mysql/mysql-bin.000001 > /tmp/mysql_restore.sql
该命令/tmp在执行有害SQL语句的时间内在包含SQL语句的目录中创建一个小文本文件 。使用文本编辑器打开此文件,并查找您不想重复的语句。
确定二进制日志中的位置以停止并恢复恢复并记下它们。位置被标记为 log_pos后跟一个数字。恢复以前的备份文件后,使用位置号来处理二进制日志文件。例如,您将使用如下命令:
第一个命令恢复所有交易,直到给定的停止位置。
第二个命令从所给出的起始位置恢复所有事务,直到二进制日志结束。由于mysqlbinlog的输出 SET TIMESTAMP在每个SQL语句记录之前都包含语句,恢复的数据和相关的MySQL日志将反映执行事务的原始时间。

遇到的坑:

恢复的时候有可能会报字符集问题,出现这个问题的原因是因为当时设置binlog的时候没有在my.conf中设置字符集导致,解决方法如下:
在执行的sql语句中添加--no-defaults,即可
如: mysqlbinlog --no-defaults --stop-datetime="2019-05-06 23:59:59" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p

评论