实际的在线场景更加复杂。当时,截断和删除涉及两个操作。确认后,他们几乎失去了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秒)




完全恢复。