MySQL误删数据后切勿跑路

MySQL误删数据后切勿跑路,第1张

误删数据的几种 *** 作

如何事前预防误删数据?

误删行数据恢复

误删行数据恢复可以使用 Flashback工具

Flashback恢复数据的原理是通过修改binlog内容,拿回原库进行回放,前提是 binlog_format=row和binlog_row_image=FULL

在使用Flashback进行恢复的时候, 不建议在主库上进行 *** 作 ,比较安全的做法是恢复出一个备份,或者找一个从库作为临时库,在这个临时库上执行 *** 作,然后再将确认过的临时库的数据恢复到主库。

误删库/表

drop table或者truncate table误删数据表 无法通过Flashback工具恢复 ,因为binlog_format的格式即使是ROW模式,在binlog中记录的也只是一条drop table或者truncate语句,因此无法进行恢复。

此时恢复的方式需要 全量备份加增量日志的方式进行恢复 ,因此要求数据有定期的全量备份,并且实时备份binlog。

假如某人在中午12点误删除了一个库里的某张表,恢复数据的流程如下:

mysqlbinlog恢复数据慢的原因?

如何更快的恢复误删的表?

在用备份恢复出临时实例以后,将这个临时实例设置成线上备库的从库:

假设此时备库的binlog已经被删除,那么需要去binlog备份系统找到删掉的日志文件拷贝到日志目录下,假设文件名是master.000001,打开日志目录下的binlog的index文件,在开头加入master.000001,让备库重新识别此日志文件

延迟复制备库

以上恢复都具有时间不可控性,如果采用上述步骤进行恢复,建议开发成工具(甚至可以做自己的DBA自动化平台),并大量测试后进行使用,避免手动误 *** 作带来更大的问题。

一般的主备复制存在的问题是,假设主库上的表被删除,这个命令很快会被发给所有从库,进而导致从库的数据表也被一起误删除。

延迟复制备库 是可以持续保持与主库有N秒延迟的备库

假设这里N=3600,那么表示只要在1个小时以内发现了误删除,就可以的到备库上执行stop slave,再通过之前讲到的方法,跳过误 *** 作的命令(比如将误删除的GTID加到实例集合中),就可以恢复出需要的数据。

rm误删

只要你的集群是高可用,如果rm删除了某个节点(只要不是恶意删除所有节点),HA系统会自动开始工作,选出一个新的主库,从而保证集群工作。

1、首先构建测试环境数据create table t1(a varchar(10),b varchar(10))insert into t1 values('1','1')insert into t1 values('2','2')commit。

2、模拟误修改,将t1表中的b字段更新为错误数据 "123456"update t1 set b='123456' where a='1'commitselect * from t1。

3、将恢复工具上传到服务器并进行解压。unzip binlog2sql-master.zip。

4、得到误修改时的binlog文件(show binary logs),实验环境是mysql-bin.000011。

5、通过 binlog2sql.py 脚本的到所有 对表 t1 的修改 *** 作。python binlog2sql.py -hlocalhost -P23307 -ubinlog2sql -p'binlog2sql' -dtest -tt1 --start-file='mysql-bin.000011'。

6、得到了误删除的sql的准确位置在1382-1615之间,使用 _**-B**_ 选项生成回滚sql。python binlog2sql.py -hlocalhost -P23307 -ubinlog2sql -p'binlog2sql' -dtest -tt1 --start-file='mysql-bin.000011' --start-position=1382 --stop-position=1615 -B。

7、执行得到的回滚语句进行误 *** 作恢复。就完成了。

打开mysql的bin log功能:

对于mysql也是支持增量备份,但要打开mysql的bin log功能。

我们修改mysql的配置文件。linux是/etc/my.cnf,windows是mysql的安装目录/my.ini

我们在[mysqld]下面加上log-bin一行代码,如下面。

[mysqld]

log-bin=mysql-bin

复制代码

加完后重起mysql即可。

某客户更新数据的时候,误删了数据库的内容,因为数据库做了主从,但是没有做备份(备份很重要啊!)幸好开启了bin-log,之后只好把整个日志的记录拿回来本地进行恢复。

之后自己也做了一个简单的测试,对数据进行恢复,具体如下:

1、新建一个表

CREATE TABLE `lynn`.`sn_test` ( `name` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL , `age` INT( 3 ) NOT NULL ) ENGINE = MYISAM

2、插入多条数据

INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn1', '1')

INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn2', '2')

INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn3', '3')

INSERT INTO `lynn`.`sn_test` (`name`, `age`) VALUES ('lynn4', '4')

3、查看数据并删除

mysql>select * from sn_test

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

| name | age |

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

| lynn1 | 1 |

| lynn2 | 2 |

| lynn3 | 3 |

| lynn4 | 4 |

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

4 rows in set (0.00 sec)

mysql>delete from sn_test

Query OK, 4 rows affected (0.00 sec)

mysql>select * from sn_test

Empty set (0.00 sec)

4、mysqlbinlog恢复数据

mysqlbinlog mysql-bin.000006 >1.sql

查看1.txt里面数据插入的纪录,把删除之前的数据进行恢复

mysqlbinlog mysql-bin.000006 --start-position=2471 --stop-position=2876 | mysql -uroot -p123

重新登录,查看数据,OK,已经成功恢复了

对于数据库 *** 作,应该注意如下问题:

1、要常备份(全备,增量备份),出了问题可以最快恢复数据;

2、 *** 作数据库前,要把需要 *** 作的数据库或者表dump出来;

3、需要把bin-log打开,就算没有做上面的两步,也可以通过日志恢复数据


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7462571.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存