Mysql 徹底恢復、基於時間點恢復、基於位置恢復mysql
(注意根據實際環境調整)sql
1.刷新binlog (取得最後1份有價值的2進制日誌),或執行一次增量備份的腳本。數據庫
#mysqladmin -u**** -p**** flush-logside
2.全備當前要操做的數據庫,防止2次破壞。(如 lsws)spa
# mysqldump lsws > lsws.sql日誌
3.恢復時間最近的全備數據。(db121019爲最近的全備數據庫)排序
#mysql lsws < db121019 it
4.恢復從db121019數據庫後全部的binlog,到出問題的日誌爲止(這裏假設1-20爲正常,21爲錯誤的日誌。)io
#ls -t -r -l /data/dbbak/daily/mysql-bin.* | xargs mysqlbinlog | mysql class
(此操做ls -t -r -l /data/dbbak/daily/mysql-bin.* ,確保顯示的日誌順序是按正常排序。若是順序不對則用下一條命令,或者手動按順序依次恢復,注意不要包含了錯的日誌)
#mysqlbinlog mysql-bin.000001 (省略mysql-bin.00002-19 ......) mysql-bin.000020 | mysql
5.恢復有錯誤的binlog,爲不徹底恢復(假設爲mysql-bin.000021)
⑴基於時間點的恢復。(首先找到出錯的時間,如:2012-10-19 17:25:44 45 46 秒的操做都是錯誤的,而後跳過故障時間點,進行恢復。)
#mysqlbinlog --stop-date="2012-10-19 17:25:44" mysql-bin.000021 | mysql
#mysqlbinlog --start-date="2012-10-19 17:25:47" mysql-bin.000021 | mysql
⑵基於位置的恢復。(首先找到出錯的位置,而後跳過故障位置點,進行恢復。)
咱們發現故障先後的位置號是分別是413到517。就是end_log_pos後邊顯示的。
#mysqlbinlog --stop-position="413" mysql-bin-3306.000021 | mysql
#mysqlbinlog --start-position="517" mysql-bin-3306.000021 | mysql
假若有報錯 ERROR 1062 (23000) at line 32: Duplicate entry '27' for key 'PRIMARY'
找到正確操做的那條語句,找準原先操做語句的位置點end_log_pos,再執行一次就好了。
好比正確操做的位置點爲"175"到"398"
下面這條語句,就實現了恢復
mysqlbinlog --start-position="175" --stop-position="398" mysql-bin-3306.000021 | mysql -uroot -proot