【MySQL】【備份】使用XtraBackup物理備份MySQL的流程
? 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的流程