mysqldump備份和還原應注意的點和過程

  mysqldump是MySQL自帶的邏輯備份工具,可以進行溫備也可以進行熱備,兩者都是在數據庫服務不停止的情況下進行的備份

對於myisam只能進行溫備

  • myisam不支持事務,加鎖也比較快,沒有熱備機制

對於InnoDB最好使用熱備份

  • InnoDB支持事務,在生產環境中,使用熱備加鎖可能要很久,事務要從緩存中同步到日誌文件,日誌文件最後還要同步到數據庫文件當中,即使鎖上了也要等寫完

  • 寫鎖優先級可能大於讀鎖

  • 而且如果啓動了一個很大的事務的話,可能很久都鎖不上

  • 若真的要使用熱備,要等很久的時間加鎖,可以SHOW ENGINE INNODB STATUS查看InnoDB寫入狀態,寫入完成了纔可dump

可以對InnoDB做熱備的原因

  • 使用--single-transaction參數,可以開啓一個直到備份結束的大事務,事務隔離級別默認爲REPEATABLE-READ,所以大事務在整個讀取過程當中數據是一致的,可以做到備份的過程中數據一直處於備份開始時的狀態


過程:

一般使用mysqldump進行完全備份,之後再通過二進制日誌的方式進行後續增量備份

對於myisam引擎

1:鎖表

  • 備份的時候,可能有用戶正往當中寫數據,需加讀鎖 # FLUSH TABLES WITH READ LOCK; 

2:記錄二進制日誌位置

  • 當前二進制日誌是哪一個以及事件所處的位置是哪裏,這樣做即時點恢復的時候就知道從哪個事件之後需要導入進行恢復,一般先做日誌滾動 # FLUSH LOGS;  SHOW MASTER STATUS;

3:開始備份

4:備份完解鎖 # UNLOCK TABLES;

5:增量備份

  • 直接複製二進制文件即可

其實可以在使用mysqldump命令時直接使用參數,不用進行上述1,2,4步驟

  • --lock-all-tables:鎖定所有表

  • --master-data=2:以CHANGE MASTER TO的方式記錄位置,默認被註釋

  • --flush-logs:刷新日誌

  • --all-databases:備份所有庫

  • --databases db_name1,db_name2:備份多個庫

  • 以上也是常用參數

對於InnoDB存儲引擎

使用--single-transaction參數實現熱備,無需使用-lock-all-tables加鎖


例子:溫備份+完全備份+增量備份(週期視情況而定)

備份:

1:完全備份

  • mysqldump -uroot -hlocalhost -p --all-databases --lock-all-tables --flush-logs --master-data=2 > /backup/all`date +%F`.sql

2:若備份週期爲一天,增量備份

  • 先滾動日誌 # FLUSH LOGS;

  • 直接在數據目錄下cp -a當天的二進制日誌

  • 或者最好使用mysqlbinlog命令重定向 # mysqlbinlog mysql-bin.000015 > /backup/increment`date +%F`.sql

3:根據週期進行備份

還原:

1:最嚴重的情況是數據庫完全奔潰,這種情況需要數據庫進行初始化

  • scripts/mysql_install_db --user=mysql --datadir/mysql/data/ #利用初始化腳本

2:導入之前的完全備份

  • mysql -uroot -hlocalhost -p < all2015-03-22.sql

3:導入增量備份

  • mysql -uroot -hlocalhost -p ...

4:當天的數據利用二進制日誌即時點還原(一般二進制日誌文件應存放在不同的存儲中,保證安全性)

  • mysqlbinlog mysql-bin.000016 | mysql -uroot -hlocalhost -p


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章