如果不小心對數據庫進行誤操作,而又沒有及時備份怎么辦?這恐怕是廣大的coder經常遇到的一類問題。
我今天就因為不小心刪除了某個數據庫,但最后的備份是1個禮拜前的,唯一能解決的辦法就是通過mysqlbinlog來恢復了。解決方案如下:
如果MySQL服務器啟用了二進制日志,你可以使用mysqlbinlog工具來恢復從指定的時間點開始(例如,從你最后一次備份)直到現在或另一個指定的時間點的數據。
關於啟用二進制日志的信息,參見5.11.3節,“二進制日志”。對於mysqlbinlog的詳細信息,參見mysql手冊8.6節,“mysqlbinlog:用於處理二進制日志文件的實用工具”。
要想從二進制日志恢復數據,你需要知道當前二進制日志文件的路徑和文件名。
一般可以從配置文件(一般情況,Linux下為my.cnf ,windows系統下為my.ini,取決於你的系統)中找到路徑。如果未包含在選項文件中,當服務器啟動時,可以在命令行中以選項的形式給出。
啟用二進制日志的選項為–log-bin。
要想確定當前的二進制日志文件的文件名,輸入下面的MySQL語句:
SHOW BINLOG EVENTS \G;
或者還可以從命令行輸入下面的內容:
mysql –user=root -pmypasswd -e ‘SHOW BINLOG EVENTS \G’ 將密碼mypasswd替換為你的MySQL服務器的root密碼。
比如得到的日志文件名為:
mysql-bin.000001 1. 指定恢復時間 對於MySQL5.1.54,可以在mysqlbinlog語句中通過–start-date和–stop-date選項指定DATETIME格式的起止時間。
舉例說明,比如在今天下午14:02(今天是2012年3月15日),不小心執行SQL語句刪除了一個數據表,但發現沒有最新的備份(當然,這只是開發環境,並不是正式的生產環境,正式環境還得定時做數據備份)。要想恢復表和數據,可以通過mysqlbinlog恢復指定時間的備份,輸入:
mysqlbinlog –stop-date=”2012-03-15 14:02:00″ /data1/log/mysql/mysql-bin.000001 | mysql -u root -pmypasswd
該命令將恢復截止到在–stop-date選項中以DATETIME格式給出的日期和時間的所有數據。
如果你沒有檢測到輸入的錯誤的SQL語句,可能你想要恢復后面發生的數據庫活動。
根據這些,你可以用起使日期和時間再次運行mysqlbinlog:
mysqlbinlog –start-date=”2012-03-15 00:01:00″ /data1/log/mysql/mysql-bin.000001 | mysql -u root -pmypasswd
在該行中,從今天凌晨0:01登錄的SQL語句將運行,組合執行前夜的轉儲文件和mysqlbinlog的兩行可以將所有數據恢復到今天凌晨0:01前一秒鍾。
你應檢查日志以確保時間確切。下一節介紹如何實現。
2. 指定時間段恢復 通過mysqlbinlog –start-date 和–stop-date恢復指定時間段的數據庫活動記錄,如下:
mysqlbinlog –start-date=”2012-03-09 02:00:00″ –stop-date=”2012-03-15 14:00:00″ /data1/log/mysql/mysql-bin.000001 > /tmp/mysql_restore_030915.sql
通過這種方式,就能獲取最后一個備份的文件時間2012-03-09 02:00:00到今天刪除數據庫之前2012-03-15 14:02這段時間的數據庫活動事務操作