1. 程式人生 > >delete和truncate/drop恢復資料的過程

delete和truncate/drop恢復資料的過程

使用myflash工具恢復delete操作資料,myflash工具注意事項:
該工具注意事項

1.binlog格式必須為row,binlog_row_image=full

2.僅支援5.65.7

3.只能回滾DML(增、刪、改)

 

binlog格式確定為row:
mysql> show variables like '%binlog_format%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW   | +---------------+-------+ 1 row in set (0.00 sec)
    delete後恢復資料的過程:       查看錶的資料:
 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 | +----+-----------+------+
         delete兩條資料:
 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.
   查詢刪除資料時的pos點:
 [[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後一行的資料)
   使用myflash反寫sql:
 [[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檔案。
    檢視myflash產生的檔案:
 在當前目錄會產生二進位制檔案 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 | +----+-----------+------+ 至此資料成功找回。
    使用全備和binlog恢復truncate和drop操作的資料:    基礎表資料:  
 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 | +----+------+------+  
  開始truncate表lbg,drop表test:
 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)
    發現誤刪資料和表開始找回:    將全備和binlog拷貝到測試庫:
[[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)
  通過備份檔案裡的pos點確定應用binlog開始的pos點:
[[email protected] ~]# vim /tmp/all.sql  在/tmp/all.sql裡找到如下一行: -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=4601; 可以確定pos點是4601  
  在binlog裡找到truncate和drop時的pos點:
 [[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。
    根據pos點使用binlog恢復資料:
 [[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 | +----+------+------+ 至此被刪除的資料已恢復,最後可選擇資料匯出再匯入到正式庫裡。
     另外還可使用全備加binlog追回delete操作誤刪的資料:
  1.先應用全備,並找到全備的pos點。   2.在binlog中刪除掉delete那段的亂碼資料。   3.根據全備的pos點應用已在第2步修改的binlog檔案從而找回資料。