900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > MySQL误删数据后快速恢复的方法

MySQL误删数据后快速恢复的方法

时间:2023-05-10 15:41:14

相关推荐

MySQL误删数据后快速恢复的方法

传统解法

用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态。然后跳过误操作的SQL,再继续应用binlog。

利用binlog2sql快速闪回

首先,确认你的MySQL server开启了binlog,设置了以下参数:

[mysqld]

server-id = 1

log_bin = /var/log/mysql/mysql-bin.log

max_binlog_size = 100M

binlog-format = row

如果没有开启binlog,也没有预先生成回滚SQL,那真的无法快速回滚了。对存放重要业务数据的MySQL,强烈建议开启binlog。

随后,安装开源工具binlog2sql。binlog2sql是一款简单易用的binlog解析工具,其中一个功能就是生成回滚SQL。

shell> git clone /danfengcao/binlog2sql.git

shell> pip install -r requirements.txt

然后,我们就可以生成回滚SQL了。

背景:小明在20点多时误删了test库tbl表整张表的数据,需要紧急回滚。

| 1 | 小赵 | -12-10 00:04:33 |

| 2 | 小钱 | -12-10 00:04:48 |

| 3 | 小孙 | -12-13 20:25:00 |

| 4 | 小李 | -12-12 00:00:00 |

+----+--------+---------------------+

4 rows in set (0.00 sec)

mysql> delete from tbl;

Query OK, 4 rows affected (0.00 sec)

20:28时,tbl表误操作被清空

mysql> select * from tbl;

Empty set (0.00 sec)

恢复数据步骤:

1、登录mysql,查看目前的binlog文件

mysql> show master status;

2、最新的binlog文件是mysql-bin.000052,我们再定位误操作SQL的binlog位置。误操作人只能知道大致的误操作时间,我们根据大致时间过滤数据。

shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-datetime='-12-13 20:25:00' --stop-datetime='-12-13 20:30:00' 输出:

INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('-12-13 20:25:00', 3, '小孙'); #start 4 end 290 time -12-13 20:25:46 INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('-12-13 20:26:00', 4, '小李'); #start 317 end 487 time -12-13 20:26:26

UPDATE `test`.`tbl` SET `addtime`='-12-12 00:00:00', `id`=4, `name`='小李' WHERE `addtime`='-12-13 20:26:00' AND `id`=4 AND `name`='小李' LIMIT 1; #start 514 end 701 time -12-13 20:27:07

DELETE FROM `test`.`tbl` WHERE `addtime`='-12-10 00:04:33' AND `id`=1 AND `name`='小赵' LIMIT 1; #start 728 end 938 time -12-13 20:28:05

DELETE FROM `test`.`tbl` WHERE `addtime`='-12-10 00:04:48' AND `id`=2 AND `name`='小钱' LIMIT 1; #start 728 end 938 time -12-13 20:28:05

DELETE FROM `test`.`tbl` WHERE `addtime`='-12-13 20:25:00' AND `id`=3 AND `name`='小孙' LIMIT 1; #start 728 end 938 time -12-13 20:28:05

DELETE FROM `test`.`tbl` WHERE `addtime`='-12-12 00:00:00' AND `id`=4 AND `name`='小李' LIMIT 1; #start 728 end 938 time -12-13 20:28:05

3、我们得到了误操作sql的准确位置在728-938之间,再根据位置进一步过滤,使用flashback模式生成回滚sql,检查回滚sql是否正确

shell> python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-pos=3346 --end-pos=3556 -B 输出:

INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('-12-12 00:00:00', 4, '小李'); #start 728 end 938 time -12-13 20:28:05

INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('-12-13 20:25:00', 3, '小孙'); #start 728 end 938 time -12-13 20:28:05

INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('-12-10 00:04:48', 2, '小钱'); #start 728 end 938 time -12-13 20:28:05

INSERT INTO `test`.`tbl`(`addtime`, `id`, `name`) VALUES ('-12-10 00:04:33', 1, '小赵'); #start 728 end 938 time -12-13 20:28:05

确认回滚sql正确,执行回滚语句。登录mysql确认,数据回滚成功。

shell> python binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -ttbl --start-file='mysql-bin.000052' --start-pos=3346 --end-pos=3556 -B | mysql -h127.0.0.1 -P3306 -uadmin -p'admin'

| 1 | 小赵 | -12-10 00:04:33 |

| 2 | 小钱 | -12-10 00:04:48 |

| 3 | 小孙 | -12-13 20:25:00 |

| 4 | 小李 | -12-12 00:00:00 |

+----+--------+---------------------+

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。