序言:

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

场景:

phpmysqli回滚MySQL误删除数据恢复案例 Java

今早刚到公司,沏好茶,就看到开拓的乞助信息,细问之后,原来某开拓职员操作线上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视频

其他