MySQL截断误操作后的数据恢复实例

MySQL截断误操作后的数据恢复实例
实际的在线场景更加复杂。当时,截断和删除涉及两个操作确认后,他们几乎失去了7万多行。当它们停止时,几乎写了1万行以上的数据。

测试环境:percona-server-5.6.16

日志格式:混合不启动gtid

表结构如下:

创建表(` tb_wubx `
` ID ` int(11)不为空auto_increment,
`名字` varchar(32)默认为空,
主键(id)
InnoDB引擎= = 2 auto_increment默认的字符集utf8)

创建表(` tb_wubx `
` ID ` int(11)不为空auto_increment,
`名字` varchar(32)默认为空,
主键(id)
InnoDB引擎= = 2 auto_increment默认的字符集utf8)
备份或基于时间点binlog全额是唯一保证可以恢复数据。例如,我们的备份是一个表结构创建报表,binlog POS相关信息:mysql-bin.000004,4,遵循:

- T1时间程序写入:

插入tb_wubx(名字)值('zhang三'),(李四);
插入tb_wubx(名字)值(老国王隔壁);
-一个人犯错的时间

TRUNCATETABLE tb_wubx;
- T3时间程序写入

插入tb_wubx(名字)值(赵);
更新tb_wubx集名称=ID = 1的赵赵;
本表格中的数据情况

MySQL SELECT * FROM tb_wubx >;
+——+ ----------- +
| ID |名字|
+——+ ----------- +
1 | |赵朝|
+——+ ----------- +
1行集(0秒)

MySQL SELECT * FROM tb_wubx >;
+——+ ----------- +
| ID |名字|
+——+ ----------- +
1 | |赵朝|
+——+ ----------- +
1行集(0秒)
当您可以看到截断表操作时,表的自添加ID被更改为从1开始,原始数据应该是:

+ + +—
| ID |名字|
+ + +—
| 1 |三|
+ + +—
2李四| | |
+ + +—
| 3 |法老|
+ + +—
如果不生成截断表操作,则实际数据应为:

+ + +—
| ID |名字|
+ + +—
| 1 |三|
+ + +—
2李四| | |
+ + +—
| 3 |法老|
+ + +—
4 | |赵朝|
+ + +—
此外,在线恢复未知时的表的时间和顺序开发者知道,原来的ID和缓存等地依靠它,因为身份混乱也会导致程序混乱。这段时间在程序级身份的混乱,修复,和交给开发商,我们会给他们一个清晰的了解,恢复结果是,我们的任务是恢复数据。好了,接下来的工作就是从binlog恢复数据。

用途:显示二进制日志;看日志文件的分布,然后用binlog事件显示的二进制日志文件;查看日志文件的内容,目的是为了找到二进制发生日志位置

此外,由于基于备份(从起始位置日志)或从日志中,如果起始位置备份基于日志,则需要处理日志文件的起始位置是截断值(在数据处理之后,主架构将发生冲突,截断数据后发生的错误无法恢复),

如果它是一个完整的卷日志,在将MySQL构建到当前的截断位置后就必须处理日志。

还原制备,创建库恢复数据,创建一个re_wubx和原结构表:tb_wubx,这相当于恢复备份的过程。

显示二进制日志;
------------------ ----------- + + +
| log_name | file_size |
------------------ ----------- + + +
| mysql-bin.000001 | 143 |
| mysql-bin.000002 | 261 |
| mysql-bin.000003 | 562 |
| mysql-bin.000004 | 1144 |
------------------ ----------- + + +
4行(0秒)

显示二进制日志;
------------------ ----------- + + +
| log_name | file_size |
------------------ ----------- + + +
| mysql-bin.000001 | 143 |
| mysql-bin.000002 | 261 |
| mysql-bin.000003 | 562 |
| mysql-bin.000004 | 1144 |
------------------ ----------- + + +
4行(0秒)
我有一个备份文件是SQL语句创建表,位置是mysql-bin.000004,4

在这种情况下,我只能用盖住在mysql-bin.000004文件。
MySQL >显示binlog in'mysql-bin 00000 4事件;
+ + + + ------------------ ------ ------------- ----------- ------------- ---------------------------------------------------- + + +
log_name POS event_type | | | | server_id | end_log_pos |信息|
+ + + + ------------------ ------ ------------- ----------- ------------- ---------------------------------------------------- + + +
| mysql-bin.000004 | 4 | format_desc | 753306 | 120 |服务器版本:5.6.16-64.2-rel64.2-log,binlog版本:4 |
| mysql-bin.000004 | 120 |查询| 753306 | 209 |使用` wubx `;截断表tb_wubx |
| mysql-bin.000004 | 209 |查询| 753306 | 281 |开始|
| mysql-bin.000004 | 281 | table_map | 753306 | | 334 table_id:91(wubx。tb_wubx)|
| mysql-bin.000004 | 334 | write_rows | 753306 | | 393 table_id:91旗:stmt_end_f |
| mysql-bin.000004 | 393 | XID | 753306 | 424 |犯 / * XID = 1073 * |
| mysql-bin.000004 | 424 |查询| 753306 | 496 |开始|
| mysql-bin.000004 | 496 | table_map | 753306 | | 549 table_id:91(wubx。tb_wubx)|
| mysql-bin.000004 | 549 | write_rows | 753306 | | 602 table_id:91旗:stmt_end_f |
| mysql-bin.000004 | 602 | XID | 753306 | 633 |犯 / * XID = 1074 * |
| mysql-bin.000004 | 633 |查询| 753306 | 722 |使用` wubx `;截断表tb_wubx |
| mysql-bin.000004 | 722 |查询| 753306 | 794 |开始|
| mysql-bin.000004 | 794 | table_map | 753306 | | 847 table_id:92(wubx。tb_wubx)|
| mysql-bin.000004 | 847 | Write_rows | 753306 | | 894 table_id: 92 flags: STMT_END_F |
| mysql-bin.000004 | 894 | XID | 753306 | 925 |犯 / * XID = 1081 * |
| mysql-bin.000004 | 925 |查询| 753306 | 997 |开始|
| mysql-bin.000004 | 997 | table_map | 753306 | | 1050 table_id:92(wubx。tb_wubx)|
| mysql-bin.000004 | 1050 | update_rows | 753306 | | 1113 table_id:92旗:stmt_end_f |
| mysql-bin.000004 | 1113 | XID | 753306 | 1144 |犯 / * XID = 1084 * |
+ + + + ------------------ ------ ------------- ----------- ------------- ---------------------------------------------------- + + +
19行(0秒)

MySQL >显示binlog in'mysql-bin 00000 4事件;
+ + + + ------------------ ------ ------------- ----------- ------------- ---------------------------------------------------- + + +
log_name POS event_type | | | | server_id | end_log_pos |信息|
+ + + + ------------------ ------ ------------- ----------- ------------- ---------------------------------------------------- + + +
| mysql-bin.000004 | 4 | format_desc | 753306 | 120 |服务器版本:5.6.16-64.2-rel64.2-log,binlog版本:4 |
| mysql-bin.000004 | 120 |查询| 753306 | 209 |使用` wubx `;截断表tb_wubx |
| mysql-bin.000004 | 209 |查询| 753306 | 281 |开始|
| mysql-bin.000004 | 281 | table_map | 753306 | | 334 table_id:91(wubx。tb_wubx)|
| mysql-bin.000004 | 334 | write_rows | 753306 | | 393 table_id:91旗:stmt_end_f |
| mysql-bin.000004 | 393 | XID | 753306 | 424 |犯 / * XID = 1073 * |
| mysql-bin.000004 | 424 |查询| 753306 | 496 |开始|
| mysql-bin.000004 | 496 | table_map | 753306 | | 549 table_id:91(wubx。tb_wubx)|
| mysql-bin.000004 | 549 | write_rows | 753306 | | 602 table_id:91旗:stmt_end_f |
| mysql-bin.000004 | 602 | XID | 753306 | 633 |犯 / * XID = 1074 * |
| mysql-bin.000004 | 633 |查询| 753306 | 722 |使用` wubx `;截断表tb_wubx |
| mysql-bin.000004 | 722 |查询| 753306 | 794 |开始|
| mysql-bin.000004 | 794 | table_map | 753306 | | 847 table_id:92(wubx。tb_wubx)|
| mysql-bin.000004 | 847 | write_rows | 753306 | | 894 table_id:92旗:stmt_end_f |
| mysql-bin.000004 | 894 | XID | 753306 | 925 |犯 / * XID = 1081 * |
| mysql-bin.000004 | 925 |查询| 753306 | 997 |开始|
| mysql-bin.000004 | 997 | table_map | 753306 | | 1050 table_id:92(wubx。tb_wubx)|
| mysql-bin.000004 | 1050 | update_rows | 753306 | | 1113 table_id:92旗:stmt_end_f |
| mysql-bin.000004 | 1113 | XID | 753306 | 1144 |犯 / * XID = 1084 * |
+ + + + ------------------ ------ ------------- ----------- ------------- ---------------------------------------------------- + + +
19行(0秒)

可以看到,截断发生在表的开头,也可以指示在错误之后,我从开始开始的截断符和截断表语句之间的数据是缺失的数据。

这个恢复可以从mysql-bin.000004 POS获得:4 mysql-bin.000004名次:633:

mysqlbinlog --改写DB = 'wubx -> re_wubx --开始位置= 4 = 633 mysql-bin.000004停止位置| MySQL的 / /到re_wubx TMP
mysqlbinlog --改写DB = 'wubx -> re_wubx --开始位置= 4 = 633 mysql-bin.000004停止位置| MySQL的 / /到re_wubx TMP

恢复的结果如下:

MySQL的 / /到re_wubx TMP;
MySQL >选择计数(*)从tb_wubx;
---------- + +
|计数(*)|
---------- + +
3 | |
---------- + +
1行集(0.02秒)

MySQL SELECT * FROM tb_wubx >;
+——+ -------------- +
| ID |名字|
+——+ -------------- +
| 1 |三|
2李四| | |
| 3 |法老|
+——+ -------------- +
3行(0秒)

MySQL >插入tb_wubx(名字)选择的名字从wubx.tb_wubx;
查询OK,1行受影响(0秒)
记录:1个重复:0个警告:0

MySQL >重命名表wubx.tb_wubx到wubx.bak_tb_wubx;
查询OK,0行受影响(0.04秒)

MySQL >重命名表re_wubx.tb_wubx到wubx.tb_wubx;
查询OK,0行受影响(0.03秒)

MySQL SELECT * FROM wubx.tb_wubx >;
+——+ -------------- +
| ID |名字|
+——+ -------------- +
| 1 |三|
2李四| | |
| 3 |法老|
4 | |赵朝|
+——+ -------------- +
4行(0秒)

MySQL的 / /到re_wubx TMP;
MySQL >选择计数(*)从tb_wubx;
---------- + +
|计数(*)|
---------- + +
3 | |
---------- + +
1行集(0.02秒)

MySQL SELECT * FROM tb_wubx >;
+——+ -------------- +
| ID |名字|
+——+ -------------- +
| 1 |三|
2李四| | |
| 3 |法老|
+——+ -------------- +
3行(0秒)

MySQL >插入tb_wubx(名字)选择的名字从wubx.tb_wubx;
查询OK,1行受影响(0秒)
记录:1个重复:0个警告:0

MySQL >重命名表wubx.tb_wubx到wubx.bak_tb_wubx;
查询OK,0行受影响(0.04秒)

MySQL >重命名表re_wubx.tb_wubx到wubx.tb_wubx;
查询OK,0行受影响(0.03秒)

MySQL SELECT * FROM wubx.tb_wubx >;
+——+ -------------- +
| ID |名字|
+——+ -------------- +
| 1 |三|
2李四| | |
| 3 |法老|
4 | |赵朝|
+——+ -------------- +
4行(0秒)

完全恢复。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部