龙空技术网

MySQL误删除数据恢复案例

思梦PHP 156

前言:

现在看官们对“mysql误删库”大致比较着重,小伙伴们都想要剖析一些“mysql误删库”的相关文章。那么小编同时在网络上汇集了一些对于“mysql误删库””的相关知识,希望小伙伴们能喜欢,咱们一起来了解一下吧!

用厚黑以图谋一己之私利,是极卑劣的行为,用厚黑以图谋众人之公利,是至高无上之道德 -------------林语堂

前言:

在生产环境或测试环境中由于各种原因导致误删除数据,造成数据的丢失,

场景:

今早刚到公司,沏好茶,就看到开发的求助信息,细问之后,原来某开发人员操作线上RDS数据库时误删除某租户id下的店铺信息(由于订单表字段太大,所以本次示例就用店铺表作为演示)

思路:

可以通过MySQL数据库的binlog日志信息对用户操作的DML事务进行回滚,但前提是MySQL需要打开binlog日志信息

实践:

1、误删除数据演示

mysql>use ht_xxxx_01

mysql>delete from `ht_eshop` WHERE `tenantry_id` = "86516" and id = "29063"

2、向运维提供操作的具体时间范围(越精确越好)及执行的SQL语句

执行时间段:2018-09-03 11:00~2018-09-03 11:19

执行的库:ht_xxxx_01

执行sql:delete from `ht_eshop` WHERE `tenantry_id` = "86516" and id = "28615"

3、运维通过时间下载binlog文件,一般binlog大小为200M,可自定义设置

1)通过show master status;确定当前的binlog日志文件及GTID

2)获取binlog二进制日志文件。

如果是本地日志文件,可直接获取

如果是远端服务器可通过主从同步方式获取:

mysqlbinlog -u** -p'**' -h'***' -P3306 --read-from-remote-server --raw mysql-bin.001578 >t.binlog

命令解读可以通过mysqlbinlog --read-from-remote-server --help

注意:必须使用raw模式,否则获取的binlog日志中无数据变更信息

4、处理mysqlbinlog日志信息,截取相应事件,抽取delete操作日志

截取时间段日志的手段有多种,可以通过--start-time或者使用sed过滤,本文通过sed进行截取

[root@iZbp18p3a0dhy9yoki70jtZ elk]# mysqlbinlog -v --base64-output=decode-rows mysql-bin.001578|sed -n '/2018-09-03 11:44/,/2018-09-03 11:46/'p >s.binlog

过滤相应的sql语句,抽取相关sql操作信息

[root@iZbp18p3a0dhy9yoki70jtZ elk]# cat s.binlog |grep -A 30 "DELETE FROM \`ht_maijiayun_01\`.\`ht_eshop\`"

### DELETE FROM `xxx`.`ht_eshop`

### WHERE

### @1=29063

### @2=86516

### @3='100'

### @4='100|ERP_TEST_SHOP_02'

### @5='name'

### @6='00002'

### @7='开放平台测试店铺-描述信息'

### @8=''

### @9=''

### @10=0

### @11='2017-12-29 10:16:37'

### @12='2018-02-05 15:13:30'

### @13=0

### @14='2017-12-29 10:16:41'

### @15=NULL

### @16=NULL

### @17=0

### @18=0

### @19=1

### @20=''

### @21=''

### @22=''

### @23=''

# at 159639188

#180903 11:45:29 server id 1504283078 end_log_pos 159639219 CRC32 0xb87aef1e Xid = 4437015247

COMMIT/*!*/;

# at 159639219

#180903 11:45:29 server id 1504283078 end_log_pos 159639267 CRC32 0x072ef225 GTID last_committed=0 sequence_number=0 rbr_only=no

SET @@SESSION.GTID_NEXT= '88ba2b9a-93ce-11e7-9c03-7cd30ab8a81c:253639198'/*!*/;

5、生产insert语句

我们有了DML操作的详细信息,那么就可以生产insert语句重新插入,生产insert语句的方式有多种,例如自写脚本生产into语句、使用工具生产语句

INSERT INTO `ht_eshop` (`id`,`tenantry_id`,`b2c_identifier`,`b2c_code`,`seller_nick`,`title`,`description`,`bulletin`,`memo`,`is_distribution`,`create_time`,`modify_time`,`goods_total_num`,`goods_sync_time`,`order_request_time`,`order_sync_time`,`import_status`,`deleted`,`enable`,`contactor_name`,`contactor_mobile`,`contactor_telephone`,`address`) VALUES (29063,86516,'100','100|ERP_TEST_SHOP_02','name','00002','开放平台测试店铺-描述信息','','',0,'2017-12-29 10:16:37','2018-02-05 15:13:30',0,'2017-12-29 10:16:41',NULL,NULL,0,0,1,'','','','');

Laravel开发

PHP开发

Linux

Mysql

ThinkPHP

Redis

思梦PHP

Html

微信开发

杂技

PHP视频

其他

标签: #mysql误删库