学而实习之 不亦乐乎

MySQL 通过 binlog 日志恢复数据

2024-05-07 21:45:42

一、前提条件

这里通过 binlog 日志恢复数据的前提是

  1. 开启了 binlog 日志功能
  2. 数据库有一个正常的备份(在此基础上来恢复指定时间段或位置的数据。当然如果你是刚创建的数据,还没来得及备份,那数据恢复的起始位置可以从创建数据库的时间开始)
  3. 数据恢复的时间点(或位置)信息

二、操作方法

1、查看问题数据的位置 

实际上在操作之前,首先应该查看一下 binlog 中的内容,确定数据出问题的位置,然后根据这些信息进行恢复。操作如下:

# mysqlbinlog --start-position=258586062 --stop-position=259627584 -d zqymtest /data/mysql/mysql-bin.000025 > tmp.sql

命令行解释

  • ./mysqlbinlog:mysqlbinlog命令,不在PATH环境中时,可以去 bin 目录下查找,宝塔的目录为 /www/server/mysql/bin。
  • --start-datetime="2021-06-07 20:33:09":从指定的开始时间输出日志。
  • --stop-datetime="2021-07-12 8:36:00":输出日志的结束时间。
  • -d database:目标数据库,指定数据时,不包含其他数据库的日志。
  • /www/server/data/mysql-bin.000005:binlog 日志。
  • > :管道符号
  • /root/restore-database.sql:输出到 SQL 文件
  • --start-datetime和--stop-datetime也可以使用位置 --start-position 和 --stop-position。

2、恢复数据

(1)将数据恢复到最近的备份点

mysql> source /data/mysql/backup.sql

(2)从最近的备份点恢复数据

数据库还原到最近的备份点后,还需要找到出问题的数据的位置,此时再进行最后的数据恢复。
比如我这里是11:00整做的备份,数据恢复到11点后,找到出问题的时间是 16:25:12 这个位置。恢复的操作方法实际上很简单,如下:

# mysqlbinlog --start-datetime="2024-04-22 11:00:00" --stop-datetime="2024-04-22 16:25:12" -d zqymtest /data/mysql/mysql-bin.000025  | mysql -uroot -p

或者使用位置信息,如下:

# mysqlbinlog --start-position=258586062 --stop-position=259627584 -d zqymtest /data/mysql/mysql-bin.000025 | mysql -uroot -p

三、其他相关操作

1、查看二进制日志配置

mysql> show variables like 'log_bin%';

解释

  • log_bin    ON    这个就是开关
  • log_bin_basename    /www/server/data/mysql-bin    这个是二进制日志的目录
  • log_bin_index    /www/server/data/mysql-bin.index    这个是二进制日志的索引
  • log_bin_trust_function_creators    OFF    
  • log_bin_use_v1_row_events    OFF    

2、显示二进制日志的状态

mysql> show master status;

3、查看日志

mysql> show binlog events in 'mysql_bin.000001';

4、

mysql> flush logs;

执行 flush logs ,会产生一个新 binlog 文件。这样能防止新产生的数据的干扰