MySQL之delete 忘加where条件误删除恢复方法二

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL之delete 忘加where条件误删除恢复方法二相关的知识,希望对你有一定的参考价值。

和昨天介绍的mysql之delete 忘加where条件误删除恢复的mysql的环境条件是一样的:
mysql数据库指定字符集位utf8,同时表的字符集也得为utf8,同时mysql要开启row模式的bin-log日志

创建一张测试表测试:

create table MyClass(
   id int(4) not null primary key auto_increment,
   name char(20) not null,
   sex varchar(10) not null default ‘0‘,
    degree varchar(10) not null );

插入数据:

insert into myclass (id,name,sex,degree) values (21,‘小王‘,‘男‘,‘学士‘);
insert into myclass (id,name,sex,degree) values (22,‘小花‘,‘女‘,‘学士‘);
insert into myclass (id,name,sex,degree) values (23,‘小李‘,‘女‘,‘硕士‘);
insert into myclass (id,name,sex,degree) values (24,‘王雪‘,‘女‘,‘硕士‘);
insert into myclass (id,name,sex,degree) values (25,‘小强‘,‘男‘,‘博士‘);

MySQL [zixun3]> select * from myclass;
+----+--------+-----+--------+
| id | name   | sex | degree |
+----+--------+-----+--------+
| 20 | 张三   | 男  | 学士   |
| 21 | 小王   | 男  | 学士   |
| 22 | 小花   | 女  | 学士   |
| 23 | 小李   | 女  | 硕士   |
| 24 | 王雪   | 女  | 硕士   |
| 25 | 小强   | 男  | 博士   |
+----+--------+-----+--------+
6 rows in set (0.00 sec)

查看binlog位置点:

MySQL [zixun3]> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000037
         Position: 1803
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

从二级制binlog日志文件中导出DELETE误操作的sql语句

 /usr/local/mysql/bin/mysqlbinlog  --no-defaults  --base64-output=decode-rows  -v -v /data/mysql/data/mysql-bin.000037|sed -n ‘/### DELETE FROM `zixun3`.`myclass`/,/COMMIT/p‘ >/tmp/delete.txt

sql语句内容如下:

[[email protected] ~]# cat /tmp/delete.txt 
### DELETE FROM `zixun3`.`myclass`
### WHERE
###   @1=20 /* INT meta=0 nullable=0 is_null=0 */
###   @2=‘张三‘ /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=‘男‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
###   @4=‘学士‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### DELETE FROM `zixun3`.`myclass`
### WHERE
###   @1=21 /* INT meta=0 nullable=0 is_null=0 */
###   @2=‘小王‘ /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=‘男‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
###   @4=‘学士‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### DELETE FROM `zixun3`.`myclass`
### WHERE
###   @1=22 /* INT meta=0 nullable=0 is_null=0 */
###   @2=‘小花‘ /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=‘女‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
###   @4=‘学士‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### DELETE FROM `zixun3`.`myclass`
### WHERE
###   @1=23 /* INT meta=0 nullable=0 is_null=0 */
###   @2=‘小李‘ /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=‘女‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
###   @4=‘硕士‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### DELETE FROM `zixun3`.`myclass`
### WHERE
###   @1=24 /* INT meta=0 nullable=0 is_null=0 */
###   @2=‘王雪‘ /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=‘女‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
###   @4=‘硕士‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
### DELETE FROM `zixun3`.`myclass`
### WHERE
###   @1=25 /* INT meta=0 nullable=0 is_null=0 */
###   @2=‘小强‘ /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=‘男‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
###   @4=‘博士‘ /* VARSTRING(30) meta=30 nullable=0 is_null=0 */
# at 428
#180517 18:30:08 server id 1  end_log_pos 459 CRC32 0x29e84ce6  Xid = 8
COMMIT/*!*/;

然后通过sed命令替换字符串进行拼接的方式,把原来的delete语句转换成insert 语句

cat /tmp/delete.txt | sed -n ‘/###/p‘ | sed ‘s/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;‘ | sed -r ‘s/(@5.*),/\1;/g‘ | sed ‘s/@[1-5]=//g‘ > /tmp/test.txt

[[email protected] ~]# cat /tmp/test.txt 
INSERT INTO `zixun3`.`myclass`
SELECT
  20 ,
  ‘张三‘ ,
  ‘男‘ ,
  ‘学士‘ ;
INSERT INTO `zixun3`.`myclass`
SELECT
  21 ,
  ‘小王‘ ,
  ‘男‘ ,
  ‘学士‘ ;
INSERT INTO `zixun3`.`myclass`
SELECT
  22 ,
  ‘小花‘ ,
  ‘女‘ ,
  ‘学士‘ ;
INSERT INTO `zixun3`.`myclass`
SELECT
  23 ,
  ‘小李‘ ,
  ‘女‘ ,
  ‘硕士‘ ;
INSERT INTO `zixun3`.`myclass`
SELECT
  24 ,
  ‘王雪‘ ,
  ‘女‘ ,
  ‘硕士‘ ;
INSERT INTO `zixun3`.`myclass`
SELECT
  25 ,
  ‘小强‘ ,
  ‘男‘ ,
  ‘博士‘ ;

登录mysql导入数据

use zixun3;
直接导入 
source /tmp/test.txt
MySQL [zixun3]> select * from myclass;
+----+--------+-----+--------+
| id | name   | sex | degree |
+----+--------+-----+--------+
| 20 | 张三   | 男  | 学士   |
| 21 | 小王   | 男  | 学士   |
| 22 | 小花   | 女  | 学士   |
| 23 | 小李   | 女  | 硕士   |
| 24 | 王雪   | 女  | 硕士   |
| 25 | 小强   | 男  | 博士   |
+----+--------+-----+--------+
6 rows in set (0.00 sec)

当然此种sed命令拼接的方式也是一种思路,但是这种方式的恢复,也只适合表结构字段都是基本的简单的字段的表进行恢复数据,并不适合复杂的表结构的数据的恢复

以上是关于MySQL之delete 忘加where条件误删除恢复方法二的主要内容,如果未能解决你的问题,请参考以下文章

mysql"闪回"技术恢复误删除误更改的数据

MySQL安全更新之safe_updates介绍说明

MySQL 误操作后如何快速恢复数据~!~!~

MySQL 之删除数据(DELETE)

北亚数据库数据恢复使用delete命令未添加where子句删除全表数据的Mysql数据库数据恢复

MySQL删除表数据