工做須要,要對數據庫(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從建立到如今沒有人刪除過,畢竟備份的日誌,通常不會放過久 :(