mysql不小心把表清空_mysql 清空表 delete后怎么恢复

当在MySQL中不慎执行`delete from table`导致数据清空,可以通过binlog进行恢复。首先,通过`mysqlbinlog`找出误删除的记录,然后将记录转换为`INSERT`语句,最后导入数据以恢复原状。这种方法依赖于binlog格式为ROW,因为ROW模式能记录每一行的变化。
摘要由CSDN通过智能技术生成

展开全部

|

delete 忘加where条件误删除恢复(binglog格式必须是ROW)

1.模拟误删除数据mysql> select * from t1;

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

|62616964757a686964616fe59b9ee7ad9431333363383961 id | name  | sex | address   |

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

|  1 | daiiy | m   | guangzhou |

|  2 | tom   | f   | shanghai  |

|  3 | liany | m   | beijing   |

|  4 | lilu  | m   | zhuhai    |

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

rows in set (0.00 sec)

mysql> delete from t1;

Query OK, 4 rows affected (0.03 sec)

mysql> select * from t1;

Empty set (0.00 sec)

mysql>

2、在binglog中去查找相关记录[root@localhost mysql]# mysqlbinlog --no-defaults --base64-output=decode-rows -v -v mysql-bin.000024 | sed -n '/### DELETE FROM db01.t1/,/COMMIT/p' > delete.txt

[root@localhost mysql]# cat delete.txt

### DELETE FROM db01.t1

### WHERE

###   @1=1 /* INT meta=0 nullable=0 is_null=0 */

###   @2='daiiy' /* STRING(60) meta=65084 nullable=0 is_null=0 */

###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */

###   @4='guangzhou' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */

### DELETE FROM db01.t1

### WHERE

###   @1=2 /* INT meta=0 nullable=0 is_null=0 */

###   @2='tom' /* STRING(60) meta=65084 nullable=0 is_null=0 */

###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */

###   @4='shanghai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */

### DELETE FROM db01.t1

### WHERE

###   @1=3 /* INT meta=0 nullable=0 is_null=0 */

###   @2='liany' /* STRING(60) meta=65084 nullable=0 is_null=0 */

###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */

###   @4='beijing' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */

### DELETE FROM db01.t1

### WHERE

###   @1=4 /* INT meta=0 nullable=0 is_null=0 */

###   @2='lilu' /* STRING(60) meta=65084 nullable=0 is_null=0 */

###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */

###   @4='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */

# at 2719

#140305 11:41:00 server id 1  end_log_pos 2746  Xid = 78

COMMIT/*!*/;

[root@localhost mysql]#

3、将记录转换成sql语句[root@localhost mysql]# cat delete.txt | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' | sed -r 's/(@4.*),/\1;/g' | sed 's/@[1-9]=//g' > t1.sql

[root@localhost mysql]# cat t1.sql

INSERT INTO db01.t1

SELECT

,

'daiiy' ,

,

'guangzhou' ;

INSERT INTO db01.t1

SELECT

,

'tom' ,

,

'shanghai' ;

INSERT INTO db01.t1

SELECT

,

'liany' ,

,

'beijing' ;

INSERT INTO db01.t1

SELECT

,

'lilu' ,

,

'zhuhai' ;

[root@localhost mysql]#

4、导入数据,验证数据完整性。mysql> source t1.sql;

Query OK, 1 row affected (0.00 sec)

Records: 1  Duplicates: 0  Warnings: 0

Query OK, 1 row affected (0.02 sec)

Records: 1  Duplicates: 0  Warnings: 0

Query OK, 1 row affected (0.02 sec)

Records: 1  Duplicates: 0  Warnings: 0

Query OK, 1 row affected (0.01 sec)

Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from t1;

ERROR 1046 (3D000): No database selected

mysql> select * from db01.t1;

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

| id | name  | sex | address   |

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

|  1 | daiiy | m   | guangzhou |

|  2 | tom   | f   | shanghai  |

|  3 | liany | m   | beijing   |

|  4 | lilu  | m   | zhuhai    |

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

rows in set (0.00 sec)

mysql>

到这里数据就完整回来了。

将binglog格式设置为row有利有弊,好处是记录了每一行的实际变化,在主从复制时也不容易出问题。但是由于记录每行的变化,会占用大量磁盘,主从复制时带宽占用会有所消耗。到底是使用row还是mixed,需要在实际工作中自己去衡量,但从整体上来说,binglog的格式设置为row,都是不二的选择

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值