内容如下
# at 197210475#200610 10:59:05 server id 1023306end_log_pos 197210536 CRC32 0xee919b04Rows_query# update update_test set user_id='ture'# at 197210536#200610 10:59:05 server id 1023306end_log_pos 197210598 CRC32 0xeb431251Table_map: `tc01`.`update_test` mApped to number 120# at 197210598#200610 10:59:05 server id 1023306end_log_pos 197211734 CRC32 0x5f211a8dUpdate_rows: table id 120 flags: STMT_END_F### UPDATE `tc01`.`update_test`### WHERE###@1=1 /* INT meta=0 nullable=0 is_null=0 */###@2='ddddddddddd' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */###@3=4502 /* INT meta=0 nullable=0 is_null=0 */###@4=2 /* INT meta=0 nullable=0 is_null=0 */###@5=1 /* TINYINT meta=0 nullable=0 is_null=0 */###@6='2020-06-04 11:34:17' /* DATETIME(0) meta=0 nullable=0 is_null=0 */### SET###@1=1 /* INT meta=0 nullable=0 is_null=0 */###@2='ture' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */###@3=4502 /* INT meta=0 nullable=0 is_null=0 */###@4=2 /* INT meta=0 nullable=0 is_null=0 */###@5=1 /* TINYINT meta=0 nullable=0 is_null=0 */###@6='2020-06-04 11:34:17' /* DATETIME(0) meta=0 nullable=0 is_null=0 */### UPDATE `tc01`.`update_test`### WHERE###@1=2 /* INT meta=0 nullable=0 is_null=0 */###@2='ddddddddddd' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */###@3=5564 /* INT meta=0 nullable=0 is_null=0 */###@4=1 /* INT meta=0 nullable=0 is_null=0 */###@5=1 /* TINYINT meta=0 nullable=0 is_null=0 */###@6='2020-06-04 11:34:17' /* DATETIME(0) meta=0 nullable=0 is_null=0 */### SET###@1=2 /* INT meta=0 nullable=0 is_null=0 */###@2='ture' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */###@3=5564 /* INT meta=0 nullable=0 is_null=0 */###@4=1 /* INT meta=0 nullable=0 is_null=0 */###@5=1 /* TINYINT meta=0 nullable=0 is_null=0 */###@6='2020-06-04 11:34:17' /* DATETIME(0) meta=0 nullable=0 is_null=0 */..........................
找出位置后,把binlog的记录导出来 。
/usr/local/mysql/bin/mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWSmysql-bin.000003 | sed -n '/# at 197210598/,/COMMIT/p' > ./update_test.txt
这些是误操作之前的数据
【MySQL 5.7 update误操作后数据恢复详解】###@1=19 /* INT meta=0 nullable=0 is_null=0 */###@2='ddddddddddd' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */###@3=2505 /* INT meta=0 nullable=0 is_null=0 */###@4=0 /* INT meta=0 nullable=0 is_null=0 */###@5=1 /* TINYINT meta=0 nullable=0 is_null=0 */###@6='2020-06-04 11:34:17' /* DATETIME(0) meta=0 nullable=0 is_null=0 */
这些是误操作之后的数据
###@1=19 /* INT meta=0 nullable=0 is_null=0 */###@2='ture' /* VARSTRING(60) meta=60 nullable=0 is_null=0 */###@3=2505 /* INT meta=0 nullable=0 is_null=0 */###@4=0 /* INT meta=0 nullable=0 is_null=0 */###@5=1 /* TINYINT meta=0 nullable=0 is_null=0 */###@6='2020-06-04 11:34:17' /* DATETIME(0) meta=0 nullable=0 is_null=0 */
替换成需要的SQL语句下一步转换成需要的SQL语句:
sed '/WHERE/{:a;N;/SET/!ba;s/([^n]*)n(.*)n(.*)/3n2n1/}' update_test.txt|sed -r '/WHERE/{:a;N;/@6/!ba;s/###@2.*//g}'|sed 's/### //g;s//*.*/,/g' | sed '/WHERE/{:a;N;/@1/!ba;s/,/;/g};s/#.*//g;s/COMMIT,//g'|sed '/^$/d' > ./update_test_recover.sql
SQL内容如下:
[mysql@tc02 binlog]$ cat update_test_recover.sqlUPDATE `tc01`.`update_test`SET@1=1 ,@2='ddddddddddd' ,@3=4502 ,@4=2 ,@5=1 ,@6='2020-06-04 11:34:17' ,WHERE@1=1 ;UPDATE `tc01`.`update_test`SET@1=2 ,@2='ddddddddddd' ,@3=5564 ,@4=1 ,@5=1 ,@6='2020-06-04 11:34:17' ,WHERE@1=2 ;UPDATE `tc01`.`update_test`SET@1=3 ,@2='ddddddddddd' ,@3=3521 ,@4=2 ,@5=1 ,@6='2020-06-04 11:34:17' ,WHERE@1=3 ;..................................................
需要进一步替换@1,@2,@3…@6.
CREATE TABLE `update_test` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`user_id` varchar(20) NOT NULL DEFAULT '',`vote_num` int(10) unsigned NOT NULL DEFAULT '0',`group_id` int(10) unsigned NOT NULL DEFAULT '0',`status` tinyint(2) unsigned NOT NULL DEFAULT '1',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ,PRIMARY KEY (`id`),KEY `index_user_id` (`user_id`) USING HASH) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
根据这个表结构替换:
sed -i 's/@1/id/g;s/@2/user_id/g;s/@3/vote_num/g;s/@4/group_id/g;s/@5/status/g;s/@6/create_time/g' update_test_recover.sql
修改后的内容如下:
UPDATE `tc01`.`update_test`SETid=1 ,user_id='ddddddddddd' ,vote_num=4502 ,group_id=2 ,status=1 ,create_time='2020-06-04 11:34:17' ,WHEREid=1 ;UPDATE `tc01`.`update_test`SETid=2 ,user_id='ddddddddddd' ,vote_num=5564 ,group_id=1 ,status=1 ,create_time='2020-06-04 11:34:17' ,WHEREid=2 ;UPDATE `tc01`.`update_test`SETid=3 ,user_id='ddddddddddd' ,vote_num=3521 ,group_id=2 ,status=1 ,create_time='2020-06-04 11:34:17' ,WHEREid=3 ;.........................................................................
推荐阅读
- MySQL查看连接数
- Linux下的MySQL Proxy 读写分离该怎么操作?
- 数据更新删除与排序:横向对比 Python、PowerBI、Excel、MySQL
- 20000 字干货笔记,一天搞定 MySQL
- 把MySQL中的各种锁及其原理都画出来
- MySQL的用户权限管理的应用总结
- MySQL数据库运维的基本命令
- Mysql写入频繁,怎么破?这是我见过的最清晰的“神操作”
- MySQL数据库表结构快速导出成MarkDown文档
- MySQL数据库架构和同步复制流程