mysqlbinlog恢復MySQL數據庫

若是不當心對數據庫進行誤操做,而又沒有及時備份怎麼辦?這恐怕是廣大的coder常常遇到的一類問題。
我今天就由於不當心刪除了某個數據庫,但最後的備份是1個禮拜前的,惟一能解決的辦法就是經過mysqlbinlog來恢復了。解決方案以下:mysql

若是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密碼。sql

好比獲得的日誌文件名爲:
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格式給出的日期和時間的全部數據。windows

#備註,可使用mysqlbinlog 先查看binlog日誌文件的全部操做肯定時間點服務器

若是你沒有檢測到輸入的錯誤的SQL語句,可能你想要恢復後面發生的數據庫活動。
根據這些,你能夠用起使日期和時間再次運行mysqlbinlog:
mysqlbinlog –start-date=」2012-03-15 00:01:00″ /data1/log/mysql/mysql-bin.000001  | mysql -u root -pmypasswdide

在該行中,從今天凌晨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這段時間的數據庫活動事務操做spa