一次數據庫誤update以後的數據恢復

工做須要,要對數據庫(mysql)數據進行對比,寫完測試腳本。想在表中修改一條數據,而後運行程序看看效果。正確的sqlupdate table1 set amount = 100 where id=123;。但是實際狀況是沒有寫where條件,就按下了回車,shell很快返回「******條數據已經被修改」,暈了。還好,我不是DBA,我只有權限動測試庫,但是測試庫也是十幾我的公用的。看了下時間21:30,其餘都下班了,不着急本身慢慢搞。mysql

##沒有備份## 數據庫誤操做,數據恢復首先想到備份,測試庫通常都是線上數據的copy,不多有備份,方法不通。sql

##binlog全量恢復太困難## 大體知道mysql的binlog日誌,記錄下全部的操做。關於binlog有幾條命令頗有用,記錄下:shell

  • show variables like 'log_%'; 查看binlog是否打開數據庫

    mysql> show variables like 'log_%';
      +----------------------------------------+----------------------------------------+
      | Variable_name                          | Value                                  |
      +----------------------------------------+----------------------------------------+
      | log_bin                                | ON                                     | 
      | log_bin_basename                       | /home/somename/mysql-bin       | 
      | log_bin_index                          | /home/somename/test/mysql-bin.index | 
      | log_bin_trust_function_creators        | OFF                                    | 
      | log_bin_use_v1_row_events              | OFF                                    | 
      | log_error                              | /home/somename/test/err.log         | 
      | log_output                             | FILE                                   | 
      | log_queries_not_using_indexes          | ON                                     | 
      | log_slave_updates                      | ON                                     | 
      | log_slow_admin_statements              | OFF                                    | 
      | log_slow_slave_statements              | OFF                                    | 
      | log_throttle_queries_not_using_indexes | 0                                      | 
      | log_warnings                           | 1                                      | 
      +----------------------------------------+----------------------------------------+
      13 rows in set (0.00 sec)
  • show binary logs; 查看mysql數據庫中binlog文件列表(這些log基本上都很大)服務器

    mysql> show binary logs;
      +------------------+------------+
      | Log_name         | File_size  |
      +------------------+------------+
      | mysql-bin.000067 | 1074104507 | 
      | mysql-bin.000068 | 1073900275 | 
      | mysql-bin.000069 | 1073742040 | 
      | mysql-bin.000070 | 1073742234 | 
      | mysql-bin.000071 | 1074693303 | 
      | mysql-bin.000072 | 1074476163 | 
      | mysql-bin.000073 | 1073743892 | 
      | mysql-bin.000074 | 1073742728 | 
      | mysql-bin.000075 |   76346728 | 
      +------------------+------------+
      9 rows in set (0.01 sec)
  • `show master status \G;' 查看當前使用的binlog文件工具

    mysql> show master status \G;
      *************************** 1. row ***************************
    		       File: mysql-bin.000075
       		Position: 76352042
      	Binlog_Do_DB: 
      Binlog_Ignore_DB: 
      Executed_Gtid_Set: 
      1 row in set (0.00 sec)
  • `show binlog events;' mysql控制檯查看當前使用的binlong
    這條命令輸入後,基本上都是滿屏滾動的日誌,將近1G的日誌輸出在mysql控制檯中,慎重。這些日誌記錄了對數據庫有增刪改全部操做的sql、時間、行數等信息。測試

  • show binlog events in 'mysql-bin.000002'; 查看指定的binlog。日誌

  • mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456 從binlog恢復日誌,mysqlbinlog不是mysql控制檯命令,是mysql提供的恢復工具,須要在shell或者cmd下執行code

因爲沒有權限登陸到mysql這臺機器,只能經過mysql鏈接執行命令。沒法從數據庫服務器直接拿到binlog日誌。mysql提供-e參數(以前竟不知道),mysql -u root -p root -e "show binlog events" > bin.log將日誌重定向到文件。get

本機拿到了當前庫的binlog,可是徹底沒有備份的狀況下,使用binlog恢復數據,只能將該數據庫從建立到如今產生的binlog所有執行一遍,這就糾結了,binlog太大;而後就是即便咱們有耐心和時間執行binlog中的所有sql,咱們也不能保證binlog從建立到如今沒有人刪除過,畢竟備份的日誌,通常不會放過久 :(

繼續閱讀->

相關文章
相關標籤/搜索