第八章 備份與恢復(學習筆記)
1. 備份
1.1 根據備份方法不同可以劃分為:
- 熱備(Hot Backup)
ibbackup是InnoDB儲存引擎備份的首選方式,只不過是收費軟體。其工作原理如下:
1) 記錄備份開始時,InnoDB儲存引擎重做日誌檔案檢查點的LSN
2) 複製共享表空間檔案以及獨立表空間檔案
3) 記錄複製完表空間檔案後,InnoDB儲存引擎重做日誌檔案檢查點的LSN
4) 複製在備份時產生的重做日誌
ibbackup對InnoDB儲存引擎表的恢復步驟為:
1) 恢復表空間檔案
2) 應用重做日誌檔案
XtraBackup實現增量備份
XtraBackup是一款開源的備份工具,支援對於InnoDB儲存引擎的增量備份,工作原理如下:
1) 完成一個全備,並記錄下此時檢查點的LSN
2) 在進行增量備份時,比較表空間中每個頁的LSN是否大於上次備份的LSN,如果是則備份該頁
- 冷備(Cold Backup)
需要備份MySQL資料庫的frm檔案,共享表空間檔案,獨立表空間檔案(*.ibd),重做日誌檔案。定期備份MySQL資料庫的配置檔案my.cnf,這樣有利於恢復的操作。
也需要做好遠端異地備份,即容災防範。
優點:
1. 備份簡單,只需要複製相關檔案即可
2. 備份檔案易於在不同作業系統,不同MySQL版本上進行恢復
3. 恢復簡單,只需要把檔案恢復到指定位置即可
4. 恢復速度快,不需要執行SQL語句,也不需要重建索引
缺點:
1. InnoDB儲存引擎冷備的檔案通常比邏輯檔案大很多,因為表空間中存放著很多其他資料,如undo段,插入緩衝等資訊
2. 冷備不總是可以輕易跨平臺。作業系統、MySQL版本、檔案大小寫敏感和浮點數格式都會成為問題
- 溫備(Warm Backup)
備份同樣在資料庫執行中進行,但是會對當前資料庫的操作有影響,如加一個全域性讀鎖以保證備份資料的一致性
1.2 按照備份後文件的內容,可以分為:
- 邏輯備份
邏輯備份是指備份出來的檔案內容是可讀的,一般是文字檔案。內容一般是由一條條SQL語句,或者表內實際資料組成。優點是可以觀察匯出檔案的內容,一般適用於資料庫的升級、遷移等工作。缺點是恢復所需要的時間往往較長。
1. mysqldump備份工具用來完成轉存(dump)、資料庫備份及不同資料庫之間的移植,如從MySQL低版本資料庫升級到MySQL高版本資料庫,又或者從MySQL資料庫移植到Oracle、Microsoft SQL Server資料庫等。mysqldump語法如下:
mysqldump [arguments] >file_name
例如: mysqldump --all-databases > dump.sql / mysqldump --databases db1 db2 db3 > dump.sql / mysqldump --single-transaction(保證備份的一致性,僅對InnoDB儲存引擎有效) --where='b>2' test a > a.sql (完成一張表的匯出)
邏輯備份的恢復語句:
mysql -uroot -p <test_backup.sql
注: mysqldump不能匯出檢視,故而用mysqldump備份完資料庫後,還需要匯出檢視的定義,或者備份檢視定義的frm檔案,並在恢復時進行匯入,以保證mysqldump資料庫的完全恢復
2. SELECT....INTO OUTFILE
該語句主要用於匯出一張表中的資料。語法如下:
SELECT [column 1], [column 2] ...
INTO
OUTFILE 'file_name'
[{FIELDS | COLUMNS}
[TERMINATED BY 'string' ] //表示每個列的分隔符
[ [OPTIONALLY] ENCLOSED BY 'char' ] //表示字串包含哪些字元
[ ESCAPED BY 'char'] // 轉義符
]
[ LINES
[ STARTING BY 'string'] // 每行開始的字元
[ TERMINATED BY 'string' ] 每行的結束符
]
FROM TABLE WHERE....
沒有指定任何FIELDS和LINES選項的預設設定如下:
FIELDS TERMINATED BY '\t' ENCLOSED BY ' ' ESCAPED '\\'
LINES TERMINATED BY '\n' STARTING BY ' '
對SELECT INTO OUTFILE 匯出的資料進行恢復使用如下語句:
LOAD DATA INTO TABLE a IGNORE1 LINES INFILE '/home/mysql/a.txt/' (其他設定與匯出類似)
- 裸檔案備份
複製資料庫的物理檔案,既可以在資料庫執行中複製(如ibbackup、xtrabackup這類工具),也可以在資料庫停止執行時直接進行資料檔案複製
1.3 按照備份資料庫的內容來分,可以分為:
- 完全備份
對資料庫進行完整的備份
- 增量備份
在上次完全備份的基礎上,對更改的資料進行備份。(MySQL資料庫沒有實現基於LSN的增量備份功能,其通過二進位制日誌實現該功能,效率較低)
- 日誌備份
對MySQL資料庫二進位制日誌的備份,通過對一個完全備份進行二進位制日誌的重做(replay)來完成資料庫的point-in-time的恢復工作。MySQL資料庫複製(replication)的原理就是非同步實時的將二進位制日誌重做傳送並應用到從(slave/standby)資料庫。推薦的二進位制日誌的伺服器配置應該是:
[mysqld]
log-bin = mysql-bin
sync-binlog = 1
innodb_support_xa = 1
還原binlog.000001, 可以使用如下命令:
mysqlbinlog binlog.000001 | mysql -uroot -p test
1.4 快照備份
MySQL資料庫本身並不支援快照功能,因此快照備份是指通過檔案系統支援的快照功能對資料庫進行備份。備份的前提是將所有資料庫檔案放在同一檔案分割槽中,然後對該分割槽進行快照操作。支援快照功能的檔案系統有GNU/Linux的邏輯管理器(Logical Volume Manager, LVM)。下圖為LVM工作原理:
若干個磁碟分割槽連線為一個整塊的卷組(Volume Group),形成一個儲存池。管理員可以在卷組上任意建立邏輯卷,並進一步在邏輯捲上建立檔案系統。
·LVM使用了寫時複製(copy-on-write)技術來建立快照。當建立一個快照時,僅複製原始卷中資料的元資料(meta data),並不會有資料的物理操作,因此快照的建立過程是非常快的。
當快照建立完成,原始捲上有寫操作時,快照會跟蹤原始卷塊的改變,將要改變的資料在改變之前複製到快照預留的空間裡,即寫時複製。對於快照的讀取操作,如果讀取的資料塊是建立快照後沒有修改過的,那麼會將讀操作直接重定向到原始捲上,如果要讀取的是已經修改過的塊,則將讀取儲存在快照中該塊在原始捲上改變之前的資料。採用寫時複製機制保證了讀取快照時得到的資料與快照建立時一致。
2. 複製
2.1 複製
複製(replication)是MySQL資料庫提供的一種高可用高效能的解決方案,一般用來建立大型的應用。工作原理分為三個步驟:
1)主伺服器(master)把資料更改記錄到二進位制日誌(binlog)中。
2)從伺服器(slave)把主伺服器的二進位制日誌複製到自己的中繼日誌(relay log)中。
3)從伺服器重做中繼日誌中的日誌,把更改應用到自己的資料庫中,以達到資料的最終一致性。
2.2 快照+複製的備份架構
複製除了可以作為備份,還有如下主要功能:
- 資料分佈 由於MySQL資料庫提供的複製並不需要很大的頻寬需求,因此可以在不同的資料中心之間實現資料的複製
- 讀取的負載平衡 通過建立多個從伺服器,可將讀取平均地分佈到這些從伺服器中,並且減少了主伺服器的壓力。
- 資料庫備份 複製對備份很有幫助,但是從伺服器不是備份,不能完全替代備份
- 高可用性和故障轉移 通過複製建立的從伺服器有助於故障轉移,減少故障的停機時間和恢復時間
通過對從伺服器上的資料庫所在分割槽進行快照,可以避免誤操作對複製的影響。當發生主伺服器上的誤操作時,只需要將從伺服器上的快照進行恢復,然後再根據二進位制日誌進行point-in-time的恢復即可