您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關XtraBackup熱備份原理和XtraBackup的安裝使用的內容。小編覺得挺實用的,因此分享給大家學習。如下資料是關于XtraBackup的內容。
因為LVM的麻煩,所以人們都希望使用專業的工具去做熱備份,這個工具就是XtraBackup。XtraBackup是由Percona開源的免費數據庫熱備份工具,它能對InnoDB數據庫和XtraDB存儲引擎的數據庫非阻塞地備份。因為XtraBackup在備份過程中不會打斷正在執行的事務,而事務日志中記錄了哪些是備份前寫入的數據哪些是備份后寫入的數據,所以無需加鎖。
另外,XtraBackup提供了對備份數據的壓縮功能,可以節約備份文件占用的磁盤空間及網絡帶寬。但XtraBackup在備份使用MyISAM作為存儲引擎的表時會加讀鎖,即表中的數據可讀但不可寫,不過這也不是問題,之前提到了可以使用聯機熱備份的方式來解決加讀鎖的問題。同樣,XtraBackup支持全量備份和增量備份,因為XtraBackup的方便性,所以一般都是采用XtraBackup來做熱備份方案。
因為XtraBackup是主流的MySQL熱備份方案,所以這里簡單介紹一下XtraBackup熱備份原理:
現在已經知道了XtraBackup是通過讀取并復制底層的數據文件,完成物理備份的。其中全量備份比較簡單,直接備份數據文件中的所有內容即可。而增量備份則需要區分新數據和舊數據,然后僅備份新數據,所以稍微復雜以些。
XtraBackup增量備份的原理如下:
增量備份只備份新增的數據,所以XtraBackup會去讀取數據文件中的內容來判斷哪些是舊數據哪些是新數據,然后只去備份新數據。在MySQL的數據文件里,數據是存放在
row
這種結構中的,而row
存放在page
中,page
則存在于extend
中。MySQL會為每一個
page
都標記上一個LSN
編號,通過對比該編號就可以得知哪些數據是新的,哪些數據是舊的。然后XtraBackup只需要從數據文件中,將這些新的page
數據備份出來就行了。示意圖:
那么XtraBackup是如何得知哪些LSN
是新的呢?首先我們要知道LSN
是一個全局遞增的編號,每次對page
中的數據進行修改時都會產生新的LSN
編號。假設現在有6個page
,各自的LSN
編號如下:
上圖中,LSN
編號為3的表示被修改過3次,LSN
編號為5的表示被修改過5次,以此類推。假設此時對這些page
進行一次全量備份,那么這6個page
都會被備份下來。經過一段時間后,其中有三個page
被修改了,LSN
編號發生了變化,如下所示:
當進行增量備份時,XtraBackup就會將之前備份的page
的LSN
編號與數據文件中與之對應的page
的LSN
編號進行對比,若數據文件里的LSN
編號大于備份里的LSN
編號則代表數據文件中的page
是新數據,那么XtraBackup就會對其進行備份。若等于則代表數據沒有發生變化,不進行備份。因為LSN
編號是全局遞增的,所以不存在小于的情況。這就是XtraBackup增量備份的原理。
在了解了XtraBackup和其熱備份的實現原理后,接下來我們實踐一下如何使用該工具。首先需要安裝官方提供的yum
倉庫:
[root@PXC-Node3 ~]# yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
然后激活該yum
倉庫:
[root@PXC-Node3 ~]# percona-release setup ps80
現在就可以直接通過yum
命令本地安裝XtraBackup了:
[root@PXC-Node3 ~]# yum install -y percona-xtrabackup-24
安裝完成后,輸出一下版本信息驗證xtrabackup
命令是否可用:
[root@PXC-Node3 ~]# xtrabackup --version
xtrabackup: recognized server arguments: --server-id=3 --datadir=/var/lib/mysql --log_bin
xtrabackup version 2.4.18 based on MySQL server 5.7.26 Linux (x86_64) (revision id: 29b4ca5)
[root@PXC-Node3 ~]#
XtraBackup命令種類:
序號 | 命令 | 描述 |
---|---|---|
1 | xbcrypt | 用于加密或解密備份的數據 |
2 | xbstream | 用于壓縮或者解壓縮xbstream文件 |
3 | xtrabackup | 用于備份使用InnoDB、XtraDB作為存儲引擎的數據表,該命令僅備份表數據文件,所以通常用在增量備份上 |
4 | innobackupex | 是上面三種命令的perl腳本封裝,可以使用該命令備份MyISAM數據表,并且只有使用該命令才能備份表數據文件、表定義文件、表索引文件,所以通常用在全量備份上 |
使用innobackupex
命令備份InnoDB數據表的流程圖:
使用innobackupex
命令進行全量熱備份示例:
[root@PXC-Node3 ~]# innobackupex --defaults-file=/etc/my.cnf --host=192.168.190.134 --user=admin --password=Abc_123456 --port=3306 /home/backup
--defaults-file
:指定MySQL的配置文件所在路徑,因為XtraBackup需要通過讀取配置文件才能知道數據目錄在哪--host
:指定MySQL服務的ip地址,因為全量備份時需要備份表結構,所以得連接到MySQL加讀鎖--user
:指定使用哪個MySQL用戶進行備份--password
:MySQL用戶的密碼--port
:指定MySQL服務的端口號/home/backup
:備份文件存儲的目錄備份的文件目錄如下:
[root@PXC-Node3 ~]# ls /home/backup/
2020-01-26_10-33-29
[root@PXC-Node3 ~]# ls /home/backup/2020-01-26_10-33-29/
backup-my.cnf ibdata1 performance_schema test xtrabackup_binlog_info xtrabackup_info
ib_buffer_pool mysql sys tpcc xtrabackup_checkpoints xtrabackup_logfile
[root@PXC-Node3 ~]#
以上這是一個最簡單的全量熱備份示例,可以看到備份出來的目錄和文件有很多,并且也沒有對這些備份文件進行壓縮。如果需要備份的數據量比較大的話,不壓縮備份文件就會很占用存儲空間。但使用常規的壓縮命令,如tar
、zip
等,則需要兩次I/O操作,因為得先使用XtraBackup備份了數據之后,才能對產生的備份文件進行壓縮。因此備份的數據量較大時,對系統I/O和CPU的影響就比較明顯。
好在XtraBackup提供了流式壓縮的功能,通過流式壓縮可以將備份數據直接寫到壓縮文件中,而不用先備份再壓縮,所以只需要一次I/O操作。如下:
想在備份時使用流式壓縮只需要指定--stream
參數即可,如下示例:
[root@PXC-Node3 ~]# innobackupex --defaults-file=/etc/my.cnf --host=192.168.190.134 --user=admin --password=Abc_123456 --port=3306 --no-timestamp --stream=xbstream -> /home/backup/backup.xbstream
--no-timestamp
:指定不生成時間戳目錄--stream
:指定使用的壓縮類型,目前只支持tar
和xbstream
/home/backup/backup.xbstream
:指定生成的壓縮文件名稱當備份一些涉及隱私的數據時,我們希望對備份文件進行加密,以防備份文件意外泄露時所帶來的影響。而XtraBackup也提供了加密備份的功能,與加密相關的參數如下:
序號 | 參數 | 描述 |
---|---|---|
1 | --encrypt | 指定用于加密的算法:AES123、AES192、AES256 |
2 | --encrypt-threads | 指定執行加密的線程數 |
3 | --encrypt-chunk-size | 指定加密線程的緩存大小,默認64kb,大小不超過1M |
4 | --encrypt-key | 指定用于加解密的密鑰字符串,長度至少24個字符 |
5 | --encrypt-key-file | 指定密鑰文件的路徑 |
加密備份示例:
[root@PXC-Node3 ~]# innobackupex --defaults-file=/etc/my.cnf --host=192.168.190.134 --user=admin --password=Abc_123456 --port=3306 --no-timestamp --stream=xbstream --encrypt=AES256 --encrypt-threads=10 --encrypt-chunk-size 512 --encrypt-key='1K!cNoq&RUfQsY&&LAczTjco' -> /home/backup/encrypt-backup.xbstream
其他常用參數:
序號 | 參數 | 描述 |
---|---|---|
1 | --compress | 針對InnoDB數據文件進行壓縮,可以與--stream 參數同時使用 |
2 | --compress-threads | 指定執行壓縮的線程數 |
3 | --compress-chunk-size | 指定壓縮線程的緩存大小,默認64kb,大小不超過1M |
4 | --include | 指定需要備份的數據表的正則表達式 |
5 | --galera-info | 指定備份PXC節點狀態文件 |
使用示例:
[root@PXC-Node3 ~]# innobackupex --defaults-file=/etc/my.cnf --host=192.168.190.134 --user=admin --password=Abc_123456 --port=3306 --no-timestamp --stream=xbstream --encrypt=AES256 --encrypt-threads=10 --encrypt-chunk-size 512 --encrypt-key='1K!cNoq&RUfQsY&&LAczTjco' --compress --compress-threads=10 --include=test.student,test.t_orders --galera-info -> /home/backup/backup2.xbstream
--include
:指明了僅備份test
庫下的student
和t_orders
表,也可以寫正則表達式上面介紹了全量熱備份后,我們來看下如何將XtraBackup備份的文件進行還原。在還原這塊只能冷還原,所謂冷還原就是得把數據庫停機后進行還原。之所以不存在熱還原,是因為對一個正在運行中的數據庫進行在線還原操作,而同時用戶又在讀寫數據,這就有可能導致數據互相覆蓋,使得數據庫的數據發生錯亂。
因此,還原這塊就只能是冷還原,本小節將逐步演示如何使用XtraBackup還原備份文件。首先關閉MySQL服務:
[root@PXC-Node3 ~]# systemctl stop mysqld
清空數據目錄及表分區的數據目錄:
[root@PXC-Node3 ~]# rm -rf /var/lib/mysql/*
[root@PXC-Node3 ~]# rm -rf /mnt/p0/data/*
[root@PXC-Node3 ~]# rm -rf /mnt/p1/data/*
rm
刪除了,如果是實際的運行環境,建議先使用mv
重命名需要刪除的目錄,最后還原完備份文件并驗證沒有問題后,再使用rm
刪除,以避免刪庫跑路的悲劇發生因為是熱備份,所以事務日志中可能會存在一些未完成的事務,這就需要回滾沒有提交的事務,以及同步已經提交的事務到數據文件。這里以2020-01-26_10-33-29
這個全量備份目錄作為示例,執行如下命令:
[root@PXC-Node3 ~]# innobackupex --apply-log /home/backup/2020-01-26_10-33-29/
然后使用以下命令進行備份文件的還原:
[root@PXC-Node3 ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /home/backup/2020-01-26_10-33-29/
接著給還原后的目錄文件賦予mysql
用戶權限:
[root@PXC-Node3 ~]# chown -R mysql:mysql /var/lib/mysql/*
[root@PXC-Node3 ~]# chown -R mysql:mysql /mnt/p0/data/*
[root@PXC-Node3 ~]# chown -R mysql:mysql /mnt/p1/data/*
到此為止就完成了冷還原,最后啟動MySQL服務并自行驗證下數據是否正常即可:
[root@PXC-Node3 ~]# systemctl start mysqld
以上是對沒有使用流式壓縮,也沒有使用加密的備份文件做的演示。如果是備份文件使用了流式壓縮,則需要先使用xbstream
命令對其進行解壓。如下示例:
# 創建解壓后文件的存儲目錄
[root@PXC-Node3 ~]# mkdir /home/backup/temp
[root@PXC-Node3 ~]# xbstream -x < /home/backup/backup2.xbstream -C /home/backup/temp/
如果備份文件使用了加密,則在解壓之后還需要對其進行解密:
[root@PXC-Node3 ~]# innobackupex --decompress --decrypt=AES256 --encrypt-key='1K!cNoq\&RUfQsY\&\&LAczTjco' /home/backup/temp
&
是特殊字符,所以需要使用\
轉義一下。其中--decompress
是與--compress
對應的,用于解壓被壓縮的InnoDB數據文件,與解密無關增量熱備份必須以全量熱備份為基礎進行備份,所以在了解了XtraBackup的全量熱備份和全量冷還原后,接下來就可以實踐XtraBackup的增量熱備份了。
注意事項:
這里以2020-01-26_10-33-29
這個全量備份目錄作為示例,增量熱備份命令如下:
[root@PXC-Node3 ~]# innobackupex --defaults-file=/etc/my.cnf --host=192.168.190.134 --user=admin --password=Abc_123456 --port=3306 --incremental-basedir=/home/backup/2020-01-26_10-33-29/ --incremental /home/backup/increment
--incremental-basedir
:指定全量備份文件所存儲的目錄,即基于哪個全量備份進行增量備份--incremental
:指定采用增量備份/home/backup/increment
:增量備份文件所存放的目錄增量備份的文件目錄如下:
[root@PXC-Node3 ~]# ls /home/backup/increment/
2020-01-26_17-02-21
[root@PXC-Node3 ~]# ls /home/backup/increment/2020-01-26_17-02-21/
backup-my.cnf ibdata1.delta mysql sys tpcc xtrabackup_checkpoints xtrabackup_logfile
ib_buffer_pool ibdata1.meta performance_schema test xtrabackup_binlog_info xtrabackup_info
[root@PXC-Node3 ~]#
可以使用du
命令對比一下全量熱備份與增量熱備份的目錄大小:
[root@PXC-Node3 ~]# du -sh /home/backup/increment/2020-01-26_17-02-21/
3.3M /home/backup/increment/2020-01-26_17-02-21/ # 增量熱備份的目錄大小
[root@PXC-Node3 ~]# du -sh /home/backup/2020-01-26_10-33-29/
836M /home/backup/2020-01-26_10-33-29/ # 全量熱備份的目錄大小
[root@PXC-Node3 ~]#
之后的第二次增量備份就可以不基于全量備份,而是基于第一次的增量備份,這樣每次的增量備份都是一個備份點就像快照一樣。如下示例:
[root@PXC-Node3 ~]# innobackupex --defaults-file=/etc/my.cnf --user=admin --password=Abc_123456 --incremental-basedir=/home/backup/increment/2020-01-26_17-02-21/ --incremental /home/backup/increment
如果增量備份時需要使用流式壓縮和內容加密,則添加相關參數即可。如下示例:
[root@PXC-Node3 ~]# innobackupex --defaults-file=/etc/my.cnf --user=admin --password=Abc_123456 --incremental-basedir=/home/backup/increment/2020-01-26_17-02-21/ --incremental --stream=xbstream --encrypt=AES256 --encrypt-threads=10 --encrypt-chunk-size 512 --encrypt-key='1K!cNoq&RUfQsY&&LAczTjco' ./ > /home/backup/increment
./
表示將增量備份所有的內容都寫到流式壓縮文件里,壓縮文件則存放在/home/backup/increment
目錄下經過以上小節可以得知增量熱備份僅備份新數據,并且生成的備份目錄體積也要比全量熱備份生成的目錄體積要小很多。那么XtraBackup要如何將增量備份的數據還原到數據庫呢?其實也很簡單,就是先將增量熱備份的數據與全量熱備份的數據合并,然后基于合并后的備份數據去還原即可。
增量熱備份可以有很多個備份點,因為除第一次增量熱備份外,其余的增量熱備份都是基于上一次增量熱備份進行的。所以在還原的時候也可以選擇任意一個備份點去還原,但事務日志的處理步驟與全量冷還原不一樣。
在之前演示全量冷還原的時候,有一個處理事務日志的步驟,同樣增量冷還原也有這個步驟,但是有些差異。上面提到增量熱備份是可以有多個備份點的,那么在還原某一個備份點時就需要處理該備份點及其之前備份點的事務日志,否則就會出現數據混亂的情況。如下圖,有三個備份點:
例如,當還原“增量備份1”時,需要先處理其前一個備份點的事務日志,即圖中的“全量熱備份”。接著再處理“增量備份1”這個備份點的事務日志,然后合并“增量備份1”的數據到“全量熱備份”中。這樣才能保證多個備份點合并到全量備份點后的數據是一致的,最后還原“全量熱備份”中的數據即可。
再例如,要還原的是“增量備份2”,那么就得先處理“全量熱備份”,然后處理“增量備份1”,接著處理“增量備份2”,按從前往后的順序依次將這三個備份點的事務日志都給處理了后,才能合并備份點的數據到全量備份中,最后還原“全量熱備份”中的數據。其余則以此類推......
接下來實操一下增量冷還原,這里有三個與上圖對應的備份點目錄:
/home/backup/2020-01-26_10-33-29/ # 全量熱備份
/home/backup/increment/2020-01-27_10-11-24/ # 增量備份1
/home/backup/increment/2020-01-27_10-15-11/ # 增量備份2
因為是冷還原,所以得先關閉MySQL服務:
[root@PXC-Node3 ~]# systemctl stop mysqld
在本例中要還原的是“增量備份2”這個備份點的數據,按照之前的說明,首先處理全量備份點的事務日志,執行如下命令:
[root@PXC-Node3 ~]# innobackupex --apply-log --redo-only /home/backup/2020-01-26_10-33-29/
--redo-only
:指定不回滾未提交的事務,因為下個備份點的事務日志里可能會提交該備份點未提交的事務。如果回滾了就會導致下個備份點無法正常提交然后處理“增量備份1”的事務日志,并將"增量備份1"的數據合并到全量備份點上:
[root@PXC-Node3 ~]# innobackupex --apply-log --redo-only /home/backup/2020-01-26_10-33-29/ --incremental-dir=/home/backup/increment/2020-01-27_10-11-24/
--incremental-dir
:指定要合并到全量備份的增量備份目錄接著處理“增量備份2”的事務日志,并將"增量備份2"的數據合并到全量備份點上。由于只還原到“增量備份2”這個備份點,所以就不需要加上--redo-only
參數了,因為沒有下個備份點了:
[root@PXC-Node3 ~]# innobackupex --apply-log /home/backup/2020-01-26_10-33-29/ --incremental-dir=/home/backup/increment/2020-01-27_10-15-11/
與全量冷還原一樣,也需清空數據目錄及表分區的數據目錄:
[root@PXC-Node3 ~]# rm -rf /var/lib/mysql/*
[root@PXC-Node3 ~]# rm -rf /mnt/p0/data/*
[root@PXC-Node3 ~]# rm -rf /mnt/p1/data/*
完成以上步驟后,就可以使用如下命令完成備份文件的還原了:
[root@PXC-Node3 ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /home/backup/2020-01-26_10-33-29/ # 注意這里指定的是全量備份點的目錄
接著給還原后的目錄文件賦予mysql
用戶權限:
[root@PXC-Node3 ~]# chown -R mysql:mysql /var/lib/mysql/*
[root@PXC-Node3 ~]# chown -R mysql:mysql /mnt/p0/data/*
[root@PXC-Node3 ~]# chown -R mysql:mysql /mnt/p1/data/*
到此為止還原就完成了,最后啟動MySQL服務并自行驗證下數據是否正常即可:
[root@PXC-Node3 ~]# systemctl start mysqld
看完上述內容,你們對XtraBackup有進一步的了解嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。