通过binlog文件恢复MySQL数据实验

文章目录 收缩

有时候会不小心误操作,删除了数据,那么如何恢复被删除的数据?如果在开启了binlog的情况下,那么还可以恢复。

最近一次在delete from 表的时候,忘记写where条件,导致整张表的数据全部删除了,这可要了老命了,那么如何恢复被删除的数据?
下面通过实验来模拟一下当时的情况。

数据库里有一张test表,原本有数据100行。

test表结构如下:

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `data` varchar(255) DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

此时先在数据库里运行一次:

flush logs

以方便重新记录binlog日志。执行以上语句,最新的binlog文件,也就是数字最大的文件。我这里是:mysql-bin.000009

现在新产生了5条数据,在mysql中执行以下5句sql命令:

insert into `test` (id,`data`) value (null,'第101行数据');
insert into `test` (id,`data`) value (null,'第102行数据');
insert into `test` (id,`data`) value (null,'第103行数据');
insert into `test` (id,`data`) value (null,'第104行数据');
insert into `test` (id,`data`) value (null,'第105行数据');

此时test表有105条数据。

这时候由于管理员不小心操作了以下语句:

delete from test

现在test表已被清空,现在如何恢复到刚才的105行数据。

还原最近一次完整的数据

通常我们会每天都备份数据库,甚至备份多次。那么首先还原最近的一次备份。
现在还原之前备份的sql文件,还原后,test表恢复到了100条数据,但是缺少了刚插入的5行数据。

导出binlog日志到sql文件

回忆大概清空表的时间,例如我这里是2020-03-06 13:35:00,这个时间也就是我们需要从binlog日志中查到的最后的时间
开始时间则是备份文件的备份时间,例如是2020-03-06 13:00:00

#进入你的mysql的bin文件夹
cd D:\mysql\mysql3310\bin
#执行以下命令
mysqlbinlog --no-defaults --database=wsjsw3 --start-datetime="2020-03-06 13:00:00" --stop-datetime="2020-03-06 13:35:00" D:\mysql\mysql3310\data\mysql-bin.000009 > 9.sql

导入sql文件

登录mysql,通过source命令导入9.sql文件即可

现在已恢复至105条数据。

查看是否开启binlog

查看是否已开启binlog:

如果没有开启,则需要在mysql配置文件中,在[mysqld]后面添加以下三行:

server-id=1
log_bin = mysql-bin
binlog_format = ROW

发表评论

电子邮件地址不会被公开。 必填项已用*标注