通过binlog如何对误操作(update/delete)的数据来进行恢复

一、场景准备

 1)以下数据恢复是针对delete忘记加where条件误删除恢复(binlog格式必须是row格式)

  1.创建测试的数据表

mysql> create table t1(
    ->  id int not null auto_increment,
    ->  name char(20) not null,
    ->  sex enum('f','m') not null default 'm',
    ->  address varchar(30) not null,
    ->  primary key(id)
    -> );
Query OK, 0 rows affected (0.22 sec)

2、插入测试数据

mysql> insert into t1 (name,sex,address)values('范冰冰','f','北京市朝阳区');
Query OK, 1 row affected (0.05 sec)
mysql> insert into t1 (name,sex,address)values('赵四','m','河北省石家庄市');
Query OK, 1 row affected (0.00 sec)

3、删除数据

mysql> delete from t1;
Query OK, 2 rows affected (0.06 sec)

二、查询当前mysql的binlog文件

  1、查询mysql所有的binlog文件

mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       177 |
| mysql-bin.000002 |       177 |
| mysql-bin.000003 |       597 |
| mysql-bin.000004 |       217 |
| mysql-bin.000005 |       369 |
| mysql-bin.000006 |      3336 |
+------------------+-----------+
6 rows in set (0.00 sec)

 2、查询当前mysql已经记录到哪个binlog子文件中

mysql> show master status;
+------------------+----------+--------------+------------------+-----------------------------------------------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                                                 |
+------------------+----------+--------------+------------------+-----------------------------------------------------------------------------------+
| mysql-bin.000006 |     3336 |              | mysql            | 05abc6e5-f6c6-11e7-b4c7-00163e003b50:1,
66e6f5ed-3ee4-11e8-b871-0050562b0065:1-16 |
+------------------+----------+--------------+------------------+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)

 3、通过binlog文件来删除被恢复的数据

     1)查看binlog的路径:

show variables like "log_%";
+----------------------------------------+----------------------------------------+
| Variable_name                          | Value                                  |
+----------------------------------------+----------------------------------------+
| log_bin                                | ON                                     |
| log_bin_basename                       | /home/data/mysql57/log/mysql-bin       |
| log_bin_index                          | /home/data/mysql57/log/mysql-bin.index |
| log_bin_trust_function_creators        | OFF                                    |
| log_bin_use_v1_row_events              | OFF                                    |
| log_builtin_as_identified_by_password  | OFF                                    |
| log_error                              | /home/data/mysql57/log/mysqld.log      |
| log_error_verbosity                    | 3                                      |
| log_output                             | FILE                                   |
| log_queries_not_using_indexes          | OFF                                    |
| log_slave_updates                      | ON                                     |
| log_slow_admin_statements              | OFF

2)通过mysqlbinlog命令打开binlog文件,并在mysql-bin.000006文件中查找“删除”记录

[root@master etc]# /usr/local/mysql/bin/mysqlbinlog  --no-defaults --base64-output=decode-rows -v -v /home/data/mysql57/log//mysql-bin.000006 | grep -B 15 -A 15 'DELETE FROM'
# at 2971
#180413 21:23:04 server id 24  end_log_pos 3036 CRC32 0xc76df89d 	GTID	last_committed=12	sequence_number=13
SET @@SESSION.GTID_NEXT= '66e6f5ed-3ee4-11e8-b871-0050562b0065:16'/*!*/;
# at 3036
#180413 21:23:04 server id 24  end_log_pos 3108 CRC32 0x7b282a6f 	Query	thread_id=3	exec_time=0	error_code=0
SET TIMESTAMP=1523625784/*!*/;
BEGIN
/*!*/;
# at 3108
#180413 21:23:04 server id 24  end_log_pos 3146 CRC32 0x2629a4e5 	Rows_query
# delete from t1
# at 3146
#180413 21:23:04 server id 24  end_log_pos 3200 CRC32 0xd864e964 	Table_map: `test`.`t1` mapped to number 244
# at 3200
#180413 21:23:04 server id 24  end_log_pos 3305 CRC32 0x2e77ce47 	Delete_rows: table id 244 flags: STMT_END_F
### DELETE FROM `test`.`t1`
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='范冰冰' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='北京市朝阳区' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### DELETE FROM `test`.`t1`
### WHERE
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='赵四' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='河北省石家庄市' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
# at 3305
#180413 21:23:04 server id 24  end_log_pos 3336 CRC32 0x8a4a7fb1 	Xid = 106
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

3)、拷贝mysql-bin.000006文件中的删除记录到指定位置的文件中/home/data/delete.txt

[root@master log]#/usr/local/mysql/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -v -v /home/data/mysql57/log/mysql-bin.000006| sed -n '/### DELETE FROM `test`.`t1`/,/COMMIT/p' > /home/data/delete.txt

打开/home/data/delete.txt文件,这时可以看到该文件中有之前删除数据的记录了

[root@master data]# cat delete.txt 
### DELETE FROM `test`.`t1`
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='范冰冰' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='北京市朝阳区' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### DELETE FROM `test`.`t1`
### WHERE
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='赵四' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='河北省石家庄市' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
# at 3305
#180413 21:23:04 server id 24  end_log_pos 3336 CRC32 0x8a4a7fb1 	Xid = 106
COMMIT/*!*/;

 4)将delete.txt文件中的记录转换成sql语句 

[root@master data]# cat delete.txt | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT//\1;/g' | sed 's/@[1-9]=//g' > source.sql

 5)在source.sql文件所在的目录下登录mysql并且导入source.sql文件

[root@master data]# mysql -uroot -p <source.sql;

 6)查看数据库test.t1删除的数据是否恢复回来

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from t1;
+----+-----------+-----+-----------------------+
| id | name      | sex | address               |
+----+-----------+-----+-----------------------+
|  1 | 范冰冰    | f   | 北京市朝阳区          |
|  2 | 赵四      | m   | 河北省石家庄市        |
+----+-----------+-----+-----------------------+
2 rows in set (0.00 sec)

可以看见数据已经完全恢复,这种方法的优点是快速,方便

以上所做的操作时针对delete操作进行的恢复,接下来我们针对update操作进行恢复

 

2)、update忘记加where条件误操作恢复数据(binlog格式必须是row格式)

 1.插入测试数据

mysql>  insert into t1 (name,sex,address)values('daiiy','m','guangzhou');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 (name,sex,address)values('tom','f','shanghai');  
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 (name,sex,address)values('liany','m','beijing');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t1 (name,sex,address)values('lilu','m','zhuhai');  
Query OK, 1 row affected (0.00 sec)

 2.现在将id等于3的用户的地址改为zhuhai,update时没有添加条件 

mysql> select * from t1;
+----+-----------+-----+-----------------------+
| id | name      | sex | address               |
+----+-----------+-----+-----------------------+
|  1 | 范冰冰    | f   | 北京市朝阳区          |
|  2 | 赵四      | m   | 河北省石家庄市        |
|  3 | daiiy     | m   | guangzhou             |
|  4 | tom       | f   | shanghai              |
|  5 | liany     | m   | beijing               |
|  6 | lilu      | m   | zhuhai                |
+----+-----------+-----+-----------------------+
6 rows in set (0.00 sec)

mysql> update t1 set address='zhuhai';
Query OK, 5 rows affected (0.05 sec)
Rows matched: 6  Changed: 5  Warnings: 0

mysql> selete * from t1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'selete * from t1' at line 1
mysql> select * from t1;
+----+-----------+-----+---------+
| id | name      | sex | address |
+----+-----------+-----+---------+
|  1 | 范冰冰    | f   | zhuhai  |
|  2 | 赵四      | m   | zhuhai  |
|  3 | daiiy     | m   | zhuhai  |
|  4 | tom       | f   | zhuhai  |
|  5 | liany     | m   | zhuhai  |
|  6 | lilu      | m   | zhuhai  |
+----+-----------+-----+---------+
6 rows in set (0.00 sec)

 3、开始恢复,在线上的话,应该比较复杂,要先进行锁表,以免数据再次被污染。(锁表,查看正在写入哪个二进制日志文件中)

mysql> lock table t1 read;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t1 (name,sex,address)values('lilu','m','zhuhai'); 
ERROR 1099 (HY000): Table 't1' was locked with a READ lock and can't be updated
mysql> show master status;
+------------------+----------+--------------+------------------+-----------------------------------------------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                                                 |
+------------------+----------+--------------+------------------+-----------------------------------------------------------------------------------+
| mysql-bin.000006 |     6113 |              | mysql            | 05abc6e5-f6c6-11e7-b4c7-00163e003b50:1,
66e6f5ed-3ee4-11e8-b871-0050562b0065:1-23 |
+------------------+----------+--------------+------------------+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)

4、分析二进制日志,并且在其中找到相关记录,在更新是address='zhuhai',我们可以在日志中过滤出来。

[root@master ~]#  /usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS /home/data/mysql57/log//mysql-bin.000006 | grep -B 15 'zhuhai'
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='beijing' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
# at 5182
#180413 22:41:36 server id 24  end_log_pos 5213 CRC32 0xa5d74212 	Xid = 131
COMMIT/*!*/;
# at 5213
#180413 22:41:42 server id 24  end_log_pos 5278 CRC32 0xd2de884f 	GTID	last_committed=18	sequence_number=19
SET @@SESSION.GTID_NEXT= '66e6f5ed-3ee4-11e8-b871-0050562b0065:22'/*!*/;
# at 5278
#180413 22:41:42 server id 24  end_log_pos 5350 CRC32 0xa625e46e 	Query	thread_id=16	exec_time=0	error_code=0
SET TIMESTAMP=1523630502/*!*/;
BEGIN
/*!*/;
# at 5350
#180413 22:41:42 server id 24  end_log_pos 5434 CRC32 0x351792e1 	Rows_query
# insert into t1 (name,sex,address)values('lilu','m','zhuhai')
# at 5434
#180413 22:41:42 server id 24  end_log_pos 5488 CRC32 0x8f5474bf 	Table_map: `test`.`t1` mapped to number 244
# at 5488
#180413 22:41:42 server id 24  end_log_pos 5541 CRC32 0xb1e14604 	Write_rows: table id 244 flags: STMT_END_F
### INSERT INTO `test`.`t1`
### SET
###   @1=6 /* 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 5541
#180413 22:41:42 server id 24  end_log_pos 5572 CRC32 0x854ae387 	Xid = 132
COMMIT/*!*/;
# at 5572
#180413 22:45:07 server id 24  end_log_pos 5637 CRC32 0x804341c4 	GTID	last_committed=19	sequence_number=20
SET @@SESSION.GTID_NEXT= '66e6f5ed-3ee4-11e8-b871-0050562b0065:23'/*!*/;
# at 5637
#180413 22:45:07 server id 24  end_log_pos 5709 CRC32 0x75119db3 	Query	thread_id=16	exec_time=0	error_code=0
SET TIMESTAMP=1523630707/*!*/;
BEGIN
/*!*/;
# at 5709
#180413 22:45:07 server id 24  end_log_pos 5763 CRC32 0xdf50d048 	Rows_query
# update t1 set address='zhuhai'
# at 5763
#180413 22:45:07 server id 24  end_log_pos 5817 CRC32 0xcc17c4fd 	Table_map: `test`.`t1` mapped to number 244
# at 5817
#180413 22:45:07 server id 24  end_log_pos 6082 CRC32 0xaefe4c06 	Update_rows: table id 244 flags: STMT_END_F
### UPDATE `test`.`t1`
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='范冰冰' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='北京市朝阳区' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='范冰冰' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### UPDATE `test`.`t1`
### WHERE
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='赵四' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='河北省石家庄市' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### SET
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='赵四' /* 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 */
### UPDATE `test`.`t1`
### WHERE
###   @1=3 /* 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 */
### SET
###   @1=3 /* 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='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### UPDATE `test`.`t1`
### WHERE
###   @1=4 /* 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 */
### SET
###   @1=4 /* 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='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### UPDATE `test`.`t1`
### WHERE
###   @1=5 /* 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 */
### SET
###   @1=5 /* 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='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */

  可以看见里面记录了每一行的变化,这也是binglog格式要一定是row才行的原因。其中@1,@2,@3,@4,分别对应表中id,name,sex,address字段。相信大家看到这里有点明白了吧,对,没错,你猜到了,我们将相关记录转换为sql语句,重新导入数据库。  

 4、处理要分析处理的二进制日志

[root@master data]# /usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS /home/data/mysql57/log//mysql-bin.000006 | sed -n '/# at 5763/,/COMMIT/p' > t1.txt  
[root@master data]# ll
total 16
-rw-r--r-- 1 root  root   695 Apr 13 22:09 delete.txt
drwxr-xr-x 6 mysql mysql 4096 Apr  9 03:43 mysql57
-rw-r--r-- 1 root  root   168 Apr 13 22:21 source.sql
-rw-r--r-- 1 root  root  3023 Apr 13 23:06 t1.txt
[root@master data]# cat t1.txt 
# at 5763
#180413 22:45:07 server id 24  end_log_pos 5817 CRC32 0xcc17c4fd 	Table_map: `test`.`t1` mapped to number 244
# at 5817
#180413 22:45:07 server id 24  end_log_pos 6082 CRC32 0xaefe4c06 	Update_rows: table id 244 flags: STMT_END_F
### UPDATE `test`.`t1`
### WHERE
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='范冰冰' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='北京市朝阳区' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### SET
###   @1=1 /* INT meta=0 nullable=0 is_null=0 */
###   @2='范冰冰' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### UPDATE `test`.`t1`
### WHERE
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='赵四' /* STRING(60) meta=65084 nullable=0 is_null=0 */
###   @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
###   @4='河北省石家庄市' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### SET
###   @1=2 /* INT meta=0 nullable=0 is_null=0 */
###   @2='赵四' /* 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 */
### UPDATE `test`.`t1`
### WHERE
###   @1=3 /* 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 */
### SET
###   @1=3 /* 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='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### UPDATE `test`.`t1`
### WHERE
###   @1=4 /* 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 */
### SET
###   @1=4 /* 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='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### UPDATE `test`.`t1`
### WHERE
###   @1=5 /* 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 */
### SET
###   @1=5 /* 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='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
# at 6082
#180413 22:45:07 server id 24  end_log_pos 6113 CRC32 0x718f8ad3 	Xid = 134
COMMIT/*!*/;

  

5、这里的sed有点复杂了,大家自行研究

[root@master data]#  sed '/WHERE/{:a;N;/SET/!ba;s/\([^\n]*\)\n\(.*\)\n\(.*\)/\3\n\2\n\1/}' t1.txt | sed -r '/WHERE/{:a;N;/@4/!ba;s/###   @2.*//g}' | sed 's/### //g;s/\/\*.*/,/g' | sed '/WHERE/{:a;N;/@1/!ba;s/,/;/g};s/#.*//g;s/COMMIT,//g' | sed '/^$/d' > recover.sql
[root@master data]# cat recover.sql 
UPDATE `test`.`t1`
SET
  @1=1 ,
  @2='范冰冰' ,
  @3=1 ,
  @4='北京市朝阳区' ,
WHERE
  @1=1 ;
UPDATE `test`.`t1`
SET
  @1=2 ,
  @2='赵四' ,
  @3=2 ,
  @4='河北省石家庄市' ,
WHERE
  @1=2 ;
UPDATE `test`.`t1`
SET
  @1=3 ,
  @2='daiiy' ,
  @3=2 ,
  @4='guangzhou' ,
WHERE
  @1=3 ;
UPDATE `test`.`t1`
SET
  @1=4 ,
  @2='tom' ,
  @3=1 ,
  @4='shanghai' ,
WHERE
  @1=4 ;
UPDATE `test`.`t1`
SET
  @1=5 ,
  @2='liany' ,
  @3=2 ,
  @4='beijing' ,
WHERE
  @1=5 ;

6、将文件中的@1,@2,@3,@4替换为t1表中id,name,sex,address字段,并删除最后字段的","号

[root@master data]#  sed -i 's/@1/id/g;s/@2/name/g;s/@3/sex/g;s/@4/address/g' recover.sql
[root@master data]# sed -i -r 's/(address=.*),/\1/g' recover.sql
[root@master data]# cat recover.sql 
UPDATE `test`.`t1`
SET
  id=1 ,
  name='范冰冰' ,
  sex=1 ,
  address='北京市朝阳区' 
WHERE
  id=1 ;
UPDATE `test`.`t1`
SET
  id=2 ,
  name='赵四' ,
  sex=2 ,
  address='河北省石家庄市' 
WHERE
  id=2 ;
UPDATE `test`.`t1`
SET
  id=3 ,
  name='daiiy' ,
  sex=2 ,
  address='guangzhou' 
WHERE
  id=3 ;
UPDATE `test`.`t1`
SET
  id=4 ,
  name='tom' ,
  sex=1 ,
  address='shanghai' 
WHERE
  id=4 ;
UPDATE `test`.`t1`
SET
  id=5 ,
  name='liany' ,
  sex=2 ,
  address='beijing' 
WHERE
  id=5 ;

7.到这里日志就处理好了,现在导入即可(导入数据后,解锁表);

mysql> source recover.sql;
Query OK, 1 row affected (4 min 40.59 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

  查看数据,是否恢复完整

mysql> select * from t1;
+----+-----------+-----+-----------------------+
| id | name      | sex | address               |
+----+-----------+-----+-----------------------+
|  1 | 范冰冰    | f   | 北京市朝阳区          |
|  2 | 赵四      | m   | 河北省石家庄市        |
|  3 | daiiy     | m   | guangzhou             |
|  4 | tom       | f   | shanghai              |
|  5 | liany     | m   | beijing               |
|  6 | lilu      | m   | zhuhai                |
+----+-----------+-----+-----------------------+
6 rows in set (0.00 sec)