1. 程式人生 > >【MySQL】【備份】使用XtraBackup物理備份MySQL的流程

【MySQL】【備份】使用XtraBackup物理備份MySQL的流程

一致性 結構 邏輯 pass 麻煩 mysql class table pex

簡介:

? XtraBackup包含兩個主要的工具即:xtrabackup和innobackupex

? xtrabackup:只能備份InnoDB和XtraDB兩種事務引擎的表,不支持備份非事務引擎的表。

? innobackupex:封裝了xtrabackup的perl腳本,支持在全局讀鎖下的非事務表備份,支持無全局讀鎖下的事務表。

安裝:

? 推薦安裝percona公司的源然後yum安裝

yum -y install https://www.percona.com/redir/downloads/percona-release/redhat/percona-release-0.1-4.noarch.rpm
yum -y install percona-xtrabackup-24

innobackupex備份流程:

? 1.備份開始時先開啟一個後臺檢測進程,實時監測redo的變化,一但發現redo中有新日誌寫入,立刻將日誌記入其的後臺日誌文件(xtrabackup_log)中,

? 2.復制InnoDB表的數據文件,系統表空間文件ibdata1,完成後進入下一步,

? 3.執行全局讀鎖,鎖住所有的表(事務,非事務),拷貝非事務表的文件(.frm .MYI .MYD),獲取binlog位置,解鎖全部表

? 4.停止xtrabackup_log,結束備份

階段 解釋
生成xtrabackup日誌文件 軟件本身開啟一個用來保存redo的日誌
拷貝InnoDB相關文件(.ibd表數據文件,ibdata1回滾空間)
FTWRL,全局讀鎖 非事務表不支持用事務保證一致性,需要讀鎖
拷貝innodb表結構文件frm,非事務表的全部文件
獲取binlog位置 以此位置作為備份的全局位置
釋放全局讀鎖 備份初步結束
停止xtrabackup的日誌工作。 備份結束

? 備份語句:

innobackupex --defaults-file=/etc/my.cnf --user=bak --password=bak123 --stream=xbstream .|gzip cat ->xtrabak.xb.gz

?

innobackupex恢復流程:

? 啟動XtraBackup軟件包自帶的InnoDB實例,回放xtrabackup過程中收集的xtrabackup_log:

? 根據binlog,回放binlog中已經登記,但redo中未提交但已經prepare的事務。

? 根據binlog,回滾binlog中未登記,但redo中已經prepare的事務

? 將應用好的文件拷回要被恢復實例的數據目錄,賦予mysql用戶的權限即可。

#解壓
gunzip all.xb.gz -c|xbstream -x -C /data/full
#應用xtrabackup_log
innobackupex --apply-log --use-memory=1G /data/full
#拷回預備恢復的文件,也可以用手工拷貝代替
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/full
#將拷回的文件所有權賦給mysql用戶
chown -R mysql.mysql /data/mysql/3306
#啟動數據庫
mysqld --defaults-file=/etc/my.cnf

附:

1.使用xbstream而不是tar的原因:

? 傳統復制的情況下,從從庫備份,需要獲得從庫的復制信息,可以使用--slave-info參數,這樣復制信息會附加在備份文件包中,但是用tar的時候總是會截斷一部分復制信息的描述文件。轉用xbstream流傳輸後沒有問題/另外,如果使用GTID,不考慮獲取binlog file和pos的話,tar或者xbstream都可以接受。

2.不推薦使用增備的原因:

? 1.增備恢復步驟繁瑣(需要在最後一個增備之前,只應用redo,最後一個才應用全部xtrabackup_log,拷回也麻煩)

? 2.與全備加binlogserver相比,不能恢復增備之間任意時間點的數據。

3.總的來看,XtraBackup仍是物理備份為主,輔以邏輯備份完成數據一致性的備份方式。

?

?

【MySQL】【備份】使用XtraBackup物理備份MySQL的流程