前言:
现在看官们对“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误删库