mysql 物理備份工具之 xtrabackup

之前使用 mysqldump 備份的 http://www.itdecent.cn/p/f34dc0a3c5ce 它是一種備份sql文件的邏輯備份。備份恢復(fù)速度慢而且文件體積也大。mysql可以通過xtrabackup 實現(xiàn)物理備份,備份 frm、idb文件

1、備份速度快,物理備份可靠
2、備份過程不會打斷正在執(zhí)行的事務(wù)(無需鎖表)
3、能夠基于壓縮等功能節(jié)約磁盤空間和流量
4、自動備份校驗
5、還原速度快
6、可以流傳將備份傳輸?shù)搅硗庖慌_機器上
7、在不增加服務(wù)器負(fù)載的情況備份數(shù)據(jù)

xtrabackup一定是安裝在mysql服務(wù)器上的,因為使用它進(jìn)行備份需要指定my.cnf文件

官網(wǎng)安裝最新版 8.0.4

https://www.percona.com/downloads/Percona-XtraBackup-LATEST/

image.png

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm
[root@localhost xtrabackupdata]#  xtrabackup --version
xtrabackup: recognized server arguments: --datadir=/data/mysql/mysql-5.7.31-linux-glibc2.12-x86_64/data --log_bin=mysql-bin --server-id=1 
xtrabackup version 8.0.4 based on MySQL server 8.0.13 Linux (x86_64) (revision id: c2c0777)

幾番周折嘗試備份,發(fā)現(xiàn)不能支持5.7版本的mysql

xtrabackup --defaults-file=/etc/my.cnf --host=192.168.6.128 --user=root --password=Sgl20@14 --databases=iam --target-dir=/data/mysql/xtrabackupdata  --backup=true

This version of Percona XtraBackup can only perform backups and restores against MySQL 8.0 and Percona Server 8.0
Please use Percona XtraBackup 2.4 for this database.

找到了mysql和 xtrabackup版本對應(yīng)關(guān)系
MySQL 5.6及之前的版本需要安裝 Percona XtraBackup 2.3,安裝指導(dǎo)請參見官方文檔Percona XtraBackup 2.3。
MySQL 5.7版本需要安裝 Percona XtraBackup 2.4,安裝指導(dǎo)請參見官方文檔Percona XtraBackup 2.4
MySQL 8.0版本需要安裝 Percona XtraBackup 8.0,安裝指導(dǎo)請參見官方文檔Percona XtraBackup 8.0

卸載:

[root@localhost xtrabackupdata]# rpm -qa | grep xtrabackup
percona-xtrabackup-80-8.0.4-1.el7.x86_64
[root@localhost xtrabackupdata]# rpm -e percona-xtrabackup-80-8.0.4-1.el7.x86_64
[root@localhost xtrabackupdata]# rpm -qa | grep xtrabackup

安裝 percona-xtrabackup 2.4

[root@localhost xtrabackupdata]# xtrabackup --version
xtrabackup version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)

tar壓縮歸檔


innobackupex --defaults-file=/etc/my.cnf --host=192.168.6.128 --user=root --password=Sgl20@14  --stream=tar /data/mysql/xtrabackupdata |gzip >/data/mysql/xtrabackupdata/`date +%F`.tar.gz

發(fā)送到遠(yuǎn)程服務(wù)器

innobackupex --defaults-file=/etc/my.cnf --user=root --password=`Sgl20@14` --host=127.0.0.1 --port=3306 --stream=tar ./ | ssh root@10.0.0.70 -p14573 \ "cat - > /data/dbbackup/backup.tar"

使用腳本定時備份

普通的策略是:每周進(jìn)行一次全備,接下來6天執(zhí)行增量備份,并保留上一周的一套備份。同時全備也復(fù)制一個副本。防止被增量備份應(yīng)用過后無法恢復(fù)。

全量備份

全量備份步驟
innobackupex --defaults-file=/etc/my.cnf --host=192.168.6.128 --user=root --password=Sgl20@14 /data/mysql/xtrabackupdata

備份完成后的目標(biāo)文件夾,這里最好不要指定 --databases 只備份目標(biāo)庫,應(yīng)該把所有庫都備份下來。包括mysql庫。只備份目標(biāo)庫會導(dǎo)致恢復(fù)時后識別不了表,需要重新創(chuàng)建表然后關(guān)聯(lián)表空間。(有個table_id保存在共享表空間文件中)


image.png
全量恢復(fù)步驟

1、執(zhí)行恢復(fù)操作,首先確保mysql data目錄為空??梢韵葘ysql的 data 文件夾更名為其它比如 mv data data.bak,不然恢復(fù)的時候會報錯的。

2、應(yīng)用全量備份

innobackupex --default-file=/etc/my.cnf --apply-log /data/mysql/xtrabackupdata/2020-10-28_17-15-52

一般情況下,在備份完成后,數(shù)據(jù)尚且不能用于恢復(fù)操作,因為備份的數(shù)據(jù)中可能會包含尚未提交的事務(wù)或者已經(jīng)提交但尚未同步至數(shù)據(jù)文件中的事務(wù)。因此,此時數(shù)據(jù)文件仍處于不一致狀態(tài)。"準(zhǔn)備"的主要作用正是通過回滾未提交的事務(wù)及同步已經(jīng)提交的事務(wù)至數(shù)據(jù)文件也使用得數(shù)據(jù)文件處于一致性狀態(tài)。 在實現(xiàn)"準(zhǔn)備"的過程中,innobackupex通常還可以使用--user-memory選項來指定其可以使用的內(nèi)存的大小,默認(rèn)為100M.如果有足夠的內(nèi)存空間可用,可以多劃分一些內(nèi)存給prepare的過程,以提高其完成備份的速度。

看到innobackupex: completed OK! 表示成功.

3 、拷貝文件

innobackupex  --default-file=/etc/my.cnf  --copy-back /data/mysql/xtrabackupdata/2020-10-28_17-15-52

4、修改文件權(quán)限

chown -R mysql.mysql /data/

5、重啟數(shù)據(jù)庫(數(shù)據(jù)恢復(fù)的mysql需要重啟)

 service mysqld  restart

增量備份

使用innobackupex進(jìn)行增量備份,每個InnoDB的頁面都會包含一個LSN信息,每當(dāng)相關(guān)的數(shù)據(jù)發(fā)生改變,相關(guān)的頁面的LSN就會自動增長。這正是InnoDB表可以進(jìn)行增量備份的基礎(chǔ),即innobackupex通過備份上次完全備份之后發(fā)生改變的頁面來實現(xiàn)。

在進(jìn)行增量備份時,首先要進(jìn)行一次全量備份,第一次增量備份是基于全備的,之后的增量備份都是基于上一次的增量備份的,以此類推。比如增量1基于全備、增量2基于增量1。

但是恢復(fù)的時候卻不是像備份的那樣一層一層的應(yīng)用,而是 增量備份1應(yīng)用到全量備份,然后緊接著增量備份2再應(yīng)用到全量備份,增量備份3應(yīng)用... 依次類推。(增量1、增量2、增量3按時間先后應(yīng)用)

需要注意的是,增量備份僅能應(yīng)用于InnoDB或XtraDB表,對于MyISAM表而言,執(zhí)行增量備份時其實進(jìn)行的是完全備份。因為MyISAM不支持事務(wù),而增量備份確是基于事務(wù)實現(xiàn)的。原理就是在全量備份上面按時間順序依次重新執(zhí)行(重放)各個增量備份中的提交的事務(wù)。

進(jìn)行增量備份步驟

1、執(zhí)行增量備份之前都需進(jìn)行一次全量的備份

innobackupex --defaults-file=/etc/my.cnf --host=192.168.6.128 --user=root --password=Sgl20@14 /data/mysql/xtrabackupdata

2、基于之前的備份來進(jìn)行增量備份

innobackupex --defaults-file=/etc/my.cnf  --user=root--password=Sgl20@14 --incremental /data/mysql/xtrabackupdata --incremental-basedir=/data/mysql/xtrabackupdata/2020-10-28_17-15-52

incremental-basedir 指定基于的備份,第一次增量備份就是基于全量的。以后的增量就是基于上一次的增量。

增量備份的恢復(fù)步驟

1、現(xiàn)在已有1個全量和2個增量


image.png

2、要先準(zhǔn)備基本備份

xtrabackup --prepare --apply-log-only --target-dir=/data/mysql/xtrabackupdata/2020-10-29_16-19-39

target-dir 指定基本備份路徑(全量備份)

"準(zhǔn)備"(prepare)增量備份與整理完全備份有著一些不同,尤其要注意的是:
1、需要在每個備份 (包括完全和各個增量備份)上,將已經(jīng)提交的事務(wù)進(jìn)行"重放"。"重放"之后,所有的備份數(shù)據(jù)將合并到完全備份上。2、基于所有的備份將未提交的事務(wù)進(jìn)行"回滾"

3、將所有的增量應(yīng)用到全量之上,有多個增量則按備份時間順序執(zhí)行。這里有2個增量則執(zhí)行2次。

①、將增量1于全量

xtrabackup --prepare --apply-log-only --target-dir=/data/mysql/xtrabackupdata/2020-10-29_16-19-39 --incremental-dir=/data/mysql/xtrabackupdata/2020-10-29_16-20-37

incremental-dir 指定增量備份路徑。

②、再將增量2應(yīng)用到全量上

xtrabackup --prepare --apply-log-only --target-dir=/data/mysql/xtrabackupdata/2020-10-29_16-19-39 --incremental-dir=/data/mysql/xtrabackupdata/2020-10-29_16-22-02

1、若在一次恢復(fù)數(shù)據(jù)后又有增量備份3出現(xiàn),那么現(xiàn)在像想要恢復(fù)到增量備份3的話直接將增量3應(yīng)用到全量上就行了,之前增量1、增量2應(yīng)用過一次就ok了不需要重復(fù)應(yīng)用。
2、也就是說已經(jīng)應(yīng)用了增量備份的全量備份就是等于 全量+增量,再也不能回到之前的全量快照了!所以說想要保持之前的全量備份就必須自己手動copy一份防止出現(xiàn)意外。

4、恢復(fù)備份,指定的是第一個基本備份

 xtrabackup --copy-back --target-dir=/data/mysql/xtrabackupdata/2020-10-29_16-19-39

同樣恢復(fù)數(shù)據(jù)時需要保證data文件夾為空!不然報如下錯誤:

xtrabackup version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
Original data directory /data/mysql/mysql-5.7.31-linux-glibc2.12-x86_64/data is not empty!

5、修改權(quán)限

 chown mysql:mysql  ./data -R *

6、重啟數(shù)據(jù)庫

 service mysqld  restart

可以通過查看xtrabackup_checkpoints文件來區(qū)分 備份文件是全量還是增量

全量

[root@localhost 2020-10-28_18-28-36]# cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 22917932
last_lsn = 22917941
compact = 0
recover_binlog_info = 0

增量

[root@localhost 2020-10-29_14-09-10]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 22916945
to_lsn = 22924162
last_lsn = 22924171
compact = 0
recover_binlog_info = 0

主從復(fù)制下使用需注意

在主從環(huán)境,那將master進(jìn)行恢復(fù)后,因恢復(fù)過程中沒有產(chǎn)生二進(jìn)制日志(xtrabackup恢復(fù)畢竟只是磁盤文件的恢復(fù),并不會寫binlog),slave不會恢復(fù)到跟master一致,所以也要在slave使用同樣的方式進(jìn)行恢復(fù)。

壓縮備份

Percona XtraBackup實施了對壓縮備份的支持。它可用于使用xbstream壓縮/解壓縮本地或流式備份。

創(chuàng)建壓縮備份

為了進(jìn)行壓縮備份,您需要使用xtrabackup --compress 選項:

innobackupex --defaults-file=/etc/my.cnf --host=192.168.6.128 --user=root --password=Sgl20@14 --compress /data/mysql/xtrabackupdata

如果你想加快壓縮速度,你可以使用并行壓縮,這可以通過xtrabackup --compress-threads選項啟用。以下示例將使用四個線程進(jìn)行壓縮:

innobackupex --defaults-file=/etc/my.cnf --host=192.168.6.128 --user=root --password=Sgl20@14 --compress --compress-threads=4   /data/mysql/xtrabackupdata

壓縮過的備份文件相對于沒有壓縮的備份文件多了 .qp 結(jié)尾

image.png

恢復(fù)壓縮備份

1、在準(zhǔn)備備份之前,您需要解壓所有文件。 Percona XtraBackup已經(jīng)實現(xiàn)了可用于解壓縮備份的選項 xtrabackup --decompress,但是Innobackupex默認(rèn)沒有集成安裝qpress,不安裝報錯

201030 14:59:35 [01] decompressing ./xtrabackup_logfile.qp
sh: qpress: 未找到命令
Error: thread 0 failed.

因此需要先手動安裝qpress

wget http://www.quicklz.com/qpress-11-linux-x64.tar
tar xvf qpress-11-linux-x64.tar
cp qpress /usr/bin

2、然后指定壓縮備份進(jìn)行解壓

innobackupex --decompress --remove-original  /data/mysql/xtrabackupdata/2020-10-30_14-28-07

會把文件直接解壓到當(dāng)前目錄


image.png

Percona XtraBackup不會自動刪除壓縮文件。為了清理備份目錄,您應(yīng)該使用 xtrabackup --remove-original 移除原始選項。

之后的恢復(fù)操作就和上面介紹的一樣了。

tar壓縮歸檔


innobackupex --defaults-file=/etc/my.cnf --host=192.168.6.128 --user=root --password=Sgl20@14  --stream=tar /data/mysql/xtrabackupdata |gzip >/data/mysql/xtrabackupdata/`date +%F`.tar.gz

發(fā)送到遠(yuǎn)程服務(wù)器

innobackupex --defaults-file=/etc/my.cnf --user=root --password=`Sgl20@14` --host=127.0.0.1 --port=3306 --stream=tar ./ | ssh root@10.0.0.70 -p14573 \ "cat - > /data/dbbackup/backup.tar"

使用腳本定時備份

普通的策略是:每周進(jìn)行一次全備,接下來6天執(zhí)行增量備份,并保留上一周的一套備份。同時全備也復(fù)制一個副本。防止被增量備份應(yīng)用過后無法恢復(fù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容