MySQL 通过 binlog 日志恢复数据
一、前提条件
这里通过 binlog 日志恢复数据的前提是
- 开启了 binlog 日志功能
- 数据库有一个正常的备份(在此基础上来恢复指定时间段或位置的数据。当然如果你是刚创建的数据,还没来得及备份,那数据恢复的起始位置可以从创建数据库的时间开始)
- 数据恢复的时间点(或位置)信息
二、操作方法
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 文件。这样能防止新产生的数据的干扰