delete和truncate/drop恢復資料的過程
阿新 • • 發佈:2018-12-12
使用myflash工具恢復delete操作資料,myflash工具注意事項:
delete後恢復資料的過程:
查看錶的資料:
delete兩條資料:
模擬資料庫依舊在插入資料:
開始找回刪除的資料:
查詢刪除資料時的pos點:
使用myflash反寫sql:
檢視myflash產生的檔案:
恢復資料:
使用全備和binlog恢復truncate和drop操作的資料:
基礎表資料:
全備操作:
模擬資料繼續插入:
開始truncate表lbg,drop表test:
繼續其他操作:
發現誤刪資料和表開始找回:
將全備和binlog拷貝到測試庫:
在測試庫應用全備:
通過備份檔案裡的pos點確定應用binlog開始的pos點:
在binlog裡找到truncate和drop時的pos點:
根據pos點使用binlog恢復資料:
另外還可使用全備加binlog追回delete操作誤刪的資料:
該工具注意事項 1.binlog格式必須為row,且binlog_row_image=full 2.僅支援5.6與5.7 3.只能回滾DML(增、刪、改) |
binlog格式確定為row:
mysql> show variables like '%binlog_format%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+ 1 row in set (0.00 sec) |
mysql> select * from lbg; +----+-----------+------+ | id | name | ha | +----+-----------+------+ | 1 | 1,2,3,4,5 | 1 | | 2 | 1,2,3,4,5 | 1 | | 3 | 1,2,3,4,5 | 2 | | 4 | 1,2,3,4,5 | 2 | | 5 | 1,2,3,4,5 | 3 | | 9 | 1,2,3,4,5 | 4 | | 10 | 1,2,3,4,5 | 4 | | 81 | 1,2,3,4,5 | 4 | +----+-----------+------+ |
mysql> delete from lbg where id >=10; Query OK, 2 rows affected (0.01 sec) 再檢視: mysql> select * from lbg; +----+-----------+------+ | id | name | ha | +----+-----------+------+ | 1 | 1,2,3,4,5 | 1 | | 2 | 1,2,3,4,5 | 1 | | 3 | 1,2,3,4,5 | 2 | | 4 | 1,2,3,4,5 | 2 | | 5 | 1,2,3,4,5 | 3 | | 9 | 1,2,3,4,5 | 4 | +----+-----------+------+ |
mysql> insert into lbg values (77,'a',77); Query OK, 1 row affected (0.01 sec) mysql> insert into lbg values (88,'b',88); Query OK, 1 row affected (0.01 sec) mysql> insert into lbg values (99,'c',99); Query OK, 1 row affected (0.00 sec) mysql> select * from lbg; +----+-----------+------+ | id | name | ha | +----+-----------+------+ | 1 | 1,2,3,4,5 | 1 | | 2 | 1,2,3,4,5 | 1 | | 3 | 1,2,3,4,5 | 2 | | 4 | 1,2,3,4,5 | 2 | | 5 | 1,2,3,4,5 | 3 | | 9 | 1,2,3,4,5 | 4 | | 77 | a | 77 | | 88 | b | 88 | | 99 | c | 99 | +----+-----------+------+ 9 rows in set (0.00 sec) |
1.找到當前binlog.(注意也可能不是當前binlog) mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000009 | 12178 | | mysql-bin.000010 | 177 | | mysql-bin.000011 | 3356 | | mysql-bin.000012 | 1245 | +------------------+-----------+ 4 rows in set (0.00 sec) 發現當前binlog是000012. |
[[email protected] mysql3306]# mysqlbinlog mysql-bin.000012 -vv >/tmp/lbg.binlog [[email protected] mysql3306]# vim /tmp/lbg.binlog 找到這段: #181108 13:28:58 server id 88083306 end_log_pos 416 CRC32 0x8e01100e Delete_rows: table id 108 flags: STMT_END_F BEGIN ; # at 292 #181108 13:28:58 server id 88083306 end_log_pos 343 CRC32 0xed8c903f Table_map: `test1`.`lbg` mapped to number 108 # at 343 #181108 13:28:58 server id 88083306 end_log_pos 416 CRC32 0x8e01100e Delete_rows: table id 108 flags: STMT_END_F BINLOG ' msnjWxNqC0AFMwAAAFcBAAAAAGwAAAAAAAEABXRlc3QxAANsYmcAAwMPAwJQAAY/kIzt msnjWyBqC0AFSQAAAKABAAAAAGwAAAAAAAEAAgAD//gKAAAACTEsMiwzLDQsNQQAAAD4UQAAAAkx LDIsMyw0LDUEAAAADhABjg== '; ### DELETE FROM `test1`.`lbg` ### WHERE ### @1=10 ### @2='1,2,3,4,5' ### @3=4 ### DELETE FROM `test1`.`lbg` ### WHERE ### @1=81 ### @2='1,2,3,4,5' ### @3=4 # at 416 #181108 13:28:58 server id 88083306 end_log_pos 447 CRC32 0x06d673a3 Xid = 11 COMMIT; # at 447 #181108 13:30:39 server id 88083306 end_log_pos 512 CRC32 0x4a005c6d Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=yes 可知開始和截止pos是292和447.(分別是BEGIN和COMMIT後一行的資料) |
[[email protected] ~]# /soft/MyFlash-master/binary/flashback --start-position=292 --stop-position=447 --sqlTypes='DELETE' --binlogFileNames=/home/mysql3306/mysql3306/mysql-bin.000012 注意使用myflash的檔案不能是之前匯出的tmp/lbg.binlog,而是源binlog檔案或者拷貝出來的binlog檔案。 |
在當前目錄會產生二進位制檔案 binlog_output_base.flashback: [[email protected] ~]# ls anaconda-ks.cfg binlog_output_base.flashback c.py e.py g.py initial-setup-ks.cfg j.py a.py b.py d.py f.py h.py i.py test.py 檢視該二進位制檔案: [[email protected] ~]# mysqlbinlog binlog_output_base.flashback -vv >/tmp/myflash.binlog [[email protected] ~]# vim /tmp/myflash.binlog 發現有insert資料了: BINLOG ' msnjWxNqC0AFMwAAAK4AAAAAAGwAAAAAAAEABXRlc3QxAANsYmcAAwMPAwJQAAY/kIzt msnjWx5qC0AFSQAAAPcAAAAAAGwAAAAAAAEAAgAD//gKAAAACTEsMiwzLDQsNQQAAAD4UQAAAAkx LDIsMyw0LDUEAAAADhABjg== '; ### INSERT INTO `test1`.`lbg` ### SET ### @1=10 ### @2='1,2,3,4,5' ### @3=4 |
mysql> source /tmp/myflash.binlog 檢視資料: mysql> select * from lbg; +----+-----------+------+ | id | name | ha | +----+-----------+------+ | 1 | 1,2,3,4,5 | 1 | | 2 | 1,2,3,4,5 | 1 | | 3 | 1,2,3,4,5 | 2 | | 4 | 1,2,3,4,5 | 2 | | 5 | 1,2,3,4,5 | 3 | | 9 | 1,2,3,4,5 | 4 | | 10 | 1,2,3,4,5 | 4 | | 77 | a | 77 | | 81 | 1,2,3,4,5 | 4 | | 88 | b | 88 | | 99 | c | 99 | +----+-----------+------+ 至此資料成功找回。 |
mysql> select * from lbg; +----+------+------+ | id | name | ha | +----+------+------+ | 1 | a | 1 | | 2 | b | 2 | | 3 | c | 3 | +----+------+------+ mysql> select * from test; +----+------+------+ | id | name | ha | +----+------+------+ | 11 | aa | 11 | | 22 | bb | 22 | | 33 | cc | 33 | +----+------+------+ |
[[email protected] mysql3306]# mysqldump -uroot -proot -S /tmp/mysql3306.sock --master-data=2 --single-transaction -A > /tmp/all.sql |
mysql> insert into lbg values (4,'d',4); Query OK, 1 row affected (0.00 sec) mysql> insert into lbg values (5,'e',5); Query OK, 1 row affected (0.01 sec) mysql> insert into test values (44,'dd',44); Query OK, 1 row affected (0.00 sec) mysql> insert into test values (55,'ee',55); Query OK, 1 row affected (0.29 sec) 查詢資料: mysql> select * from lbg; +----+------+------+ | id | name | ha | +----+------+------+ | 1 | a | 1 | | 2 | b | 2 | | 3 | c | 3 | | 4 | d | 4 | | 5 | e | 5 | +----+------+------+ mysql> select * from test; +----+------+------+ | id | name | ha | +----+------+------+ | 11 | aa | 11 | | 22 | bb | 22 | | 33 | cc | 33 | | 44 | dd | 44 | | 55 | ee | 55 | +----+------+------+ |
mysql> truncate table lbg; Query OK, 0 rows affected (0.31 sec) mysql> drop table test; Query OK, 0 rows affected (0.30 sec) |
mysql> insert into lbg values (111,'aaa',111); Query OK, 1 row affected (0.10 sec) mysql> insert into lbg values (222,'bbb',222); Query OK, 1 row affected (0.01 sec) |
[[email protected] mysql3306]# scp /home/mysql3306/mysql3306/mysql-bin.000012 [email protected]:/tmp [[email protected] mysql3306]# scp /tmp/all.sql [email protected]:/tmp |
mysql> source /tmp/all.sql 此時資料如下: mysql> select * from lbg; +----+------+------+ | id | name | ha | +----+------+------+ | 1 | a | 1 | | 2 | b | 2 | | 3 | c | 3 | +----+------+------+ 3 rows in set (0.00 sec) mysql> select * from test; +----+------+------+ | id | name | ha | +----+------+------+ | 11 | aa | 11 | | 22 | bb | 22 | | 33 | cc | 33 | +----+------+------+ 3 rows in set (0.00 sec) |
[[email protected] ~]# vim /tmp/all.sql 在/tmp/all.sql裡找到如下一行: -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=4601; 可以確定pos點是4601 |
[[email protected] ~]# mysqlbinlog /tmp/mysql-bin.000012 -vv > /tmp/lbg.binlog [[email protected] ~]# vim /tmp/lbg.binlog 摘要內容如下: COMMIT; # at 6203 #181108 13:28:58 server id 88083306 end_log_pos 6268 CRC32 0xe6be1409 Anonymous_GTID last_committed=23 sequence_number=24 rbr_only=no SET @@SESSION.GTID_NEXT= 'ANONYMOUS'; # at 6268 #181108 13:28:58 server id 88083306 end_log_pos 6354 CRC32 0x685261c5 Query thread_id=6 exec_time=7113 error_code=0 SET TIMESTAMP=1541654938; truncate table lbg ; # at 6354 #181108 13:28:58 server id 88083306 end_log_pos 6419 CRC32 0xfc171fb0 Anonymous_GTID last_committed=24 sequence_number=25 rbr_only=no SET @@SESSION.GTID_NEXT= 'ANONYMOUS'; # at 6419 #181108 13:28:58 server id 88083306 end_log_pos 6538 CRC32 0x901f7138 Query thread_id=6 exec_time=7131 error_code=0 SET TIMESTAMP=1541654938; DROP TABLE `test` ; # at 6538 確定truncate時的binlog的pos點大致為6203。 |
[[email protected] ~]# mysqlbinlog /tmp/mysql-bin.000012 --start-position=4601 --stop-position=6203 -vv > /tmp/mysql.binlog mysql> source /tmp/mysql.binlog mysql> select * from lbg; +----+------+------+ | id | name | ha | +----+------+------+ | 1 | a | 1 | | 2 | b | 2 | | 3 | c | 3 | | 4 | d | 4 | | 5 | e | 5 | +----+------+------+ 5 rows in set (0.00 sec) mysql> select * from test; +----+------+------+ | id | name | ha | +----+------+------+ | 11 | aa | 11 | | 22 | bb | 22 | | 33 | cc | 33 | | 44 | dd | 44 | | 55 | ee | 55 | +----+------+------+ 至此被刪除的資料已恢復,最後可選擇資料匯出再匯入到正式庫裡。 |
1.先應用全備,並找到全備的pos點。 2.在binlog中刪除掉delete那段的亂碼資料。 3.根據全備的pos點應用已在第2步修改的binlog檔案從而找回資料。 |