前言mysql
操做系統崩潰、電源故障、文件系統崩潰和硬件故障等異常情況均可能致使咱們正在使用的數據庫出現故障而產生數據庫中數據不一致的狀況。爲了保證數據庫使用安全,必須按期備份數據庫;數據庫備份能夠分爲:徹底備份、日誌備份、增量備份和文件備份。對於一個大型數據庫,頻繁執行徹底備份可能會須要太多的時間,並且徹底備份常常會屢次備份一些沒有更新過的數據,會形成資源浪費。如今最經常使用的數據庫備份策略是在徹底備份的基礎上進行較頻繁的增量備份。例如,咱們能夠在數據庫使用較少的時段每週進行一次徹底備份,而後天天進行一次增量備份,備份下這段時間中可能修改數據庫內容的操做,以便在發生文件系統故障、硬件問題等問題致使數據庫發生災難性崩潰的時候利用備份數據進行數據庫的恢復。sql
u 技術分析數據庫
MySQL數據庫對上述幾種致使數據庫崩潰的故障都給出了很好的解決辦法以保證數據的一致性。安全
對於操做系統崩潰和電源故障致使的MySQL數據庫崩潰,使用MySQL提供的內置方法,在大多數狀況下均可以很是有效的恢復:若是咱們使用的是MyISAM數據庫,可使用REPAIR TABLE
或者myisamchk –r 對可能損毀的數據庫表進行修補;若是咱們使用的是InnoDB,則InnoDB會自動找到掛起的提交了的或未提交的事務列表,並自動回滾未提交的事務和刷新已提交的事務。服務器
若是咱們使用前面的方面未能正確恢復被損害的數據,或者對於文件系統崩潰和硬件故障致使的數據庫嚴重毀壞的狀況,咱們就須要從其餘安全備份恢復。這種恢復方法基於前面提到的徹底備份和增量備份。spa
在MySQL中,咱們可使用mysqldump方法將數據庫導出爲一個.sql文件,這個方法能夠將咱們正在使用的整個數據庫或者多個數據庫徹底拷備到一個文件中從而實現對數據庫的徹底備份。咱們再把這個文件保存到其餘安全的地方,就能夠在須要的時候使用該徹底備份進行數據庫恢復。操作系統
雖然MySQL沒有提供直接的增量備份方法,但咱們能夠經過MySQL提供的二進制日誌(binary logs)間接實現增量備份。二進制日誌保存了全部更新或者可能更新數據庫的操做(例如,當一個沒有匹配行的delete操做也會被記錄在二進制日誌中),二進制日誌在啓動MySQL服務器後開始記錄,並在文件達到max_binlog_size
或者接收到flush logs命令後從新建立新的日誌文件進行記錄。基於二進制日誌以上特性,咱們使用二進制日誌進行增量備份是很是方便和有效的。咱們只需定時執行flush logs方法從新建立新的日誌,生成二進制文件序列,並及時把這些日誌保存到安全的地方就完成了一個時間段的增量備份。
日誌
在按期徹底備份和及時增量備份的策略中進行數據庫備份須要兩步:首先經過執行徹底備份的.sql文件恢復數據庫,而後用mysqlbinlog恢復上次徹底備份至數據庫崩潰時的二進制日誌文件序列恢復此時間段內對數據庫的更新。
code
通常來講,咱們採用的徹底+增量備份的頻率爲每週進行一次徹底備份,每日進行增量備份。根據實際應用的不一樣,能夠適當調整。
orm
u 實現步驟
經過上一節的分析,咱們能夠總結出MySQL的徹底+增量備份策略主要包括如下幾個步驟:
Ø 首先,咱們須要開啓MySQL服務器的二進制日誌功能,其實現方法有不少種,最經常使用的是在MySQL的配置文件的mysqld項中加入log-bin=[filepath]項;也可使用mysqld –log-bin=[filepath]從新啓動MySQL服務器。
Ø 其次,使用mysqldump對數據庫進行徹底備份,它能夠實現對數據據的聯機,非阻塞的熱備份,不會影響其餘進程對數據庫的讀寫操做。(參考指令:mysqldump -uroot --password=123 --single-transaction --flush-logs --master-data=2 --all-databases --delete-master-logs > d:/mysql5.0/full_%date:~0,10%_1500_PM.sql)
Ø 第三,使用flush logs指令刷新建立新的二進制日誌。能夠經過mysqladmin flush logs或者flush logs語句實現。最方便有效的方法是將它作成批處理文件,而後讓操做系統按期執行。
Ø
使用mysql < *.sql
進行徹底備份的恢復。
Ø 使用mysqlbinlog logs-bin.[0-9]* | mysql進行增量備份的恢復。通常的,假設咱們週日下午三點進行了徹底備份並生成備份文件full_backup_20100415_3_PM.sql,週一週二中午一點進行了兩次增量備份,分別生成增量備份文件inc_backup_1_PM.0007和inc_backup_1_PM.0008,週三上午10:00數據庫發生崩潰,須要進行數據庫恢復,此時正在記錄的二進制日誌爲inc_backup_1_PM.0009,咱們還須要恢復其中記錄的操做。具體的恢復操做爲:
mysql < full_backup_20100415_3_PM.sql
mysqlbinlog inc_backup_1_PM.0007 inc_backup_1_PM.0008 inc_backup_1_PM.0009
u 具體應用(結合T8項目)
根據上述分析,咱們在T8項目使用MySQL增量備份,也須要三個步驟:
Ø 首選修改MySQL啓動配置文件my.cnf,在其中的mysqld項中增長log-bin選項,從新啓動MySQL 服務器以開啓二進制日誌功能,在生成文件/usr/data/mysql/ t8server-bin.index和t8server-bin..000001。如圖所示:
Ø 編寫徹底備份可執行文件腳本:
Ø 編寫增量備份可執行文件腳本:
Ø 執行full_backup_20100417_1_pm,生成/usr/data/mysql/full_backup_20100417_1_pm. sql文件。
Ø 執行inc_backup_1_pm,生成/usr/data/mysql/t8server-bin..000002。
其中full_backup_20100417_1_pm. sql和t8server-bin..000002分別是徹底備份和增量備份文件。
要進行備份文件的恢復,只需執行命令:
u 總結
MySQL提供了很方便的徹底+增量備份實現方法,咱們只需調用系統內置的方法或者做出一些細微的配置就能夠對MySQL數據庫進行備份和恢復。對於MyISAM數據庫和InnoDB數據庫,均可以經過mysqldump實現數據庫的徹底邏輯備份,經過啓動二進制日誌(binary logs),能夠記錄一個時間段內對數據庫的全部可能更新的操做,從而經過flush logs建立新的日誌而實現增量備份。
MySQL也提供了很是方便的恢復方法,因爲mysqldump的輸出結果爲可執行的.sql文件,咱們能夠直接運行該文件實現對徹底備份的恢復。而後經過mysqlbinlog命令恢復崩潰以前的二進制日誌序列,就能夠將數據庫恢復至崩潰前的狀態。