6 mysql備份和還原

raid在硬件級別保證硬件損壞而不會導致業務中止。

一 備份類型
按是否離線
1)熱備份,在線備份,讀寫不受影響;難度大
2)溫備份,能讀不能寫
3)冷備份,離線備份,讀寫均中止

物理備份,複製數據文件
邏輯備份,複製數據導出至文本文件中

完全備份:備份全部數據,可能是一個數據庫的全部數據
增量備份:僅備份上次完全備份或增量備份以後變化的數據;
差異備份:僅備份上次完全備份以來變化的數據;

備份方式可自由組合

二 備份需考慮的問題
1 備份什麼?
    數據、配置文件、二進制日誌、事務日誌

2 離線備份還是在線備份?
    MyISAM不宜進行熱備,一旦備份中出現問題,不能用於還原,推薦使用溫備份(以共享方式鎖定所有表
如果必須使用熱備,使用LVM進行快照
    InnoDB熱備工具:xtrabackup(物理備份), mysqldump(邏輯備份)

    最好使用離線備份,較爲安全,使用主從實現,可以在某一時刻停掉從服務器的服務,進行離線備份

3 物理備份還是邏輯備份?
物理備份,
優勢:直接複製數據文件,速度快 
缺點:有些數據依賴文件系統,移植能力有限
邏輯備份
優勢:方便使用文本處理工具直接對其處理,移植能力強
缺點:複製數據導出至文本文件中,數據慢,丟失浮點數精度(轉化爲文本時丟失)

4 備份策略選擇?
完全備份+增量備份 或者 完全備份+差異備份

三 mysql備份工具
mysqldump,邏輯備份工具,MyISAN(溫備),InnoDB(熱備)
mysqlhotcopy,物理備份工具,冷備

文件系統備份工具
cp:冷備
lvm:邏輯卷快照,幾乎熱備   
    mysql> lock tables user read;
#   mysql> unlock tables;
    mysql> FLUSH TABLES;
創建快照:釋放鎖,而後複製數據
注意:
InnoDB有一個問題:flush和lock tables後,數據庫還可能有數據操作,比如沒有commit的事物
    所以要確保數據完全寫入磁盤後才能進行快照

ibback,商業工具
extrabackup,開源工具

網絡備份工具

porconna-tool


四 mysqldump實現備份
1 備份一個庫
mysqldump DB_NAME [tb1] [tb2]備份單個數據庫,或庫中特定表;恢復時,需要手動創建數據庫

mysql> LOCK TABLES;鎖表
mysql> FLUSH TABLES;數據寫入磁盤
mysql> flush logs;二進制文件日誌
mysql> show bianry log;顯示二進制日誌
備份:mysqldump -u root -h localhost -p jiaowu > jiaowu_bak.sql
還原:mysql jiaowu < jiaowu_bak.sql

--master-data={0|1|2}
0: 不記錄二進制日誌文件及路位置;
1:以CHANGE MASTER TO的方式記錄位置,可用於恢復後直接啓動從服務器;
2:以CHANGE MASTER TO的方式記錄位置,但默認爲被註釋;

--lock-all-tables:鎖定所有表
--flush-logs: 執行日誌flush;

如果指定庫中的表類型均爲InnoDB,可使用--single-transaction啓動熱備,不需要鎖表

2 備份多個庫:
--all-databases: 備份所有庫
--databases DB_NAME,DB_NAME,...: 備份指定庫
--events
--routines
--triggers

五 即時點還原
1 備份策略:每週完全+每日增量
完全備份:mysqldump
增量備份:備份二進制日誌文件(flush logs)
2 完全備份
mysqldump -u root -p --flush-logs --master-data=2 --flush-logs --all-databases --lock-all-tables [--triggers --routines] --events > alldb.sql

時間過去一天

3 增量備份
# cd /data/mysql/
# mysqladmin flush-logs
# mysqlbinlog mysql-bin.000019 > /root/monday-increment.sql
3.1 增量備份
# mysqladmin flush-logs
# mysqlbinlog mysql-bin.000020 > /root/tuesday-increment.sql

4 數據庫損壞mysql無法啓動
初始化mysql數據庫
4.1 恢復完全備份
# mysql < alldb.sql
4.2 恢復增量備份即可
4.3 導出最後的二進制日誌並恢復
mysql> mysqlbinlog mysql-bin.000020 | mysql

說明:清除二進制文件至
mysql> show binary logs;
mysql> purge binary logs to 'mysql-bin.000019';

# mysqladmin flush-logs






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