之前使用 mysqldump 備份的 http://www.reibang.com/p/f34dc0a3c5ce 它是一種備份sql文件的邏輯備份差导。備份恢復速度慢而且文件體積也大。mysql可以通過xtrabackup 實現(xiàn)物理備份,備份 frm、idb文件
1、備份速度快采桃,物理備份可靠
2、備份過程不會打斷正在執(zhí)行的事務(無需鎖表)
3、能夠基于壓縮等功能節(jié)約磁盤空間和流量
4西轩、自動備份校驗
5、還原速度快
6脑沿、可以流傳將備份傳輸?shù)搅硗庖慌_機器上
7藕畔、在不增加服務器負載的情況備份數(shù)據(jù)
xtrabackup一定是安裝在mysql服務器上的,因為使用它進行備份需要指定my.cnf文件
官網(wǎng)安裝最新版 8.0.4
https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
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版本對應關系
MySQL 5.6及之前的版本需要安裝 Percona XtraBackup 2.3注服,安裝指導請參見官方文檔Percona XtraBackup 2.3。
MySQL 5.7版本需要安裝 Percona XtraBackup 2.4措近,安裝指導請參見官方文檔Percona XtraBackup 2.4溶弟。
MySQL 8.0版本需要安裝 Percona XtraBackup 8.0,安裝指導請參見官方文檔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ā)送到遠程服務器
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"
使用腳本定時備份
普通的策略是:每周進行一次全備辜御,接下來6天執(zhí)行增量備份,并保留上一周的一套備份屈张。同時全備也復制一個副本擒权。防止被增量備份應用過后無法恢復。
全量備份
全量備份步驟
innobackupex --defaults-file=/etc/my.cnf --host=192.168.6.128 --user=root --password=Sgl20@14 /data/mysql/xtrabackupdata
備份完成后的目標文件夾阁谆,這里最好不要指定 --databases 只備份目標庫碳抄,應該把所有庫都備份下來。包括mysql庫笛厦。只備份目標庫會導致恢復時后識別不了表纳鼎,需要重新創(chuàng)建表然后關聯(lián)表空間。(有個table_id保存在共享表空間文件中)
全量恢復步驟
1裳凸、執(zhí)行恢復操作贱鄙,首先確保mysql data目錄為空∫坦龋可以先將mysql的 data 文件夾更名為其它比如 mv data data.bak逗宁,不然恢復的時候會報錯的。
2梦湘、應用全量備份
innobackupex --default-file=/etc/my.cnf --apply-log /data/mysql/xtrabackupdata/2020-10-28_17-15-52
一般情況下瞎颗,在備份完成后件甥,數(shù)據(jù)尚且不能用于恢復操作,因為備份的數(shù)據(jù)中可能會包含尚未提交的事務或者已經(jīng)提交但尚未同步至數(shù)據(jù)文件中的事務哼拔。因此引有,此時數(shù)據(jù)文件仍處于不一致狀態(tài)。"準備"的主要作用正是通過回滾未提交的事務及同步已經(jīng)提交的事務至數(shù)據(jù)文件也使用得數(shù)據(jù)文件處于一致性狀態(tài)倦逐。 在實現(xiàn)"準備"的過程中譬正,innobackupex通常還可以使用--user-memory選項來指定其可以使用的內存的大小,默認為100M.如果有足夠的內存空間可用檬姥,可以多劃分一些內存給prepare的過程曾我,以提高其完成備份的速度。
看到innobackupex: completed OK! 表示成功.
3 健民、拷貝文件
innobackupex --default-file=/etc/my.cnf --copy-back /data/mysql/xtrabackupdata/2020-10-28_17-15-52
4抒巢、修改文件權限
chown -R mysql.mysql /data/
5、重啟數(shù)據(jù)庫(數(shù)據(jù)恢復的mysql需要重啟)
service mysqld restart
增量備份
使用innobackupex進行增量備份秉犹,每個InnoDB的頁面都會包含一個LSN信息蛉谜,每當相關的數(shù)據(jù)發(fā)生改變,相關的頁面的LSN就會自動增長凤优。這正是InnoDB表可以進行增量備份的基礎悦陋,即innobackupex通過備份上次完全備份之后發(fā)生改變的頁面來實現(xiàn)。
在進行增量備份時筑辨,首先要進行一次全量備份俺驶,第一次增量備份是基于全備的,之后的增量備份都是基于上一次的增量備份的棍辕,以此類推暮现。比如增量1基于全備、增量2基于增量1楚昭。
但是恢復的時候卻不是像備份的那樣一層一層的應用栖袋,而是 增量備份1應用到全量備份,然后緊接著增量備份2再應用到全量備份抚太,增量備份3應用... 依次類推塘幅。(增量1、增量2尿贫、增量3按時間先后應用)
需要注意的是电媳,增量備份僅能應用于InnoDB或XtraDB表,對于MyISAM表而言庆亡,執(zhí)行增量備份時其實進行的是完全備份匾乓。因為MyISAM不支持事務,而增量備份確是基于事務實現(xiàn)的又谋。原理就是在全量備份上面按時間順序依次重新執(zhí)行(重放)各個增量備份中的提交的事務拼缝。
進行增量備份步驟
1娱局、執(zhí)行增量備份之前都需進行一次全量的備份
innobackupex --defaults-file=/etc/my.cnf --host=192.168.6.128 --user=root --password=Sgl20@14 /data/mysql/xtrabackupdata
2、基于之前的備份來進行增量備份
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 指定基于的備份咧七,第一次增量備份就是基于全量的衰齐。以后的增量就是基于上一次的增量。
增量備份的恢復步驟
1猪叙、現(xiàn)在已有1個全量和2個增量
2娇斩、要先準備基本備份
xtrabackup --prepare --apply-log-only --target-dir=/data/mysql/xtrabackupdata/2020-10-29_16-19-39
target-dir 指定基本備份路徑(全量備份)
"準備"(prepare)增量備份與整理完全備份有著一些不同,尤其要注意的是:
1穴翩、需要在每個備份 (包括完全和各個增量備份)上,將已經(jīng)提交的事務進行"重放"锦积。"重放"之后芒帕,所有的備份數(shù)據(jù)將合并到完全備份上。2丰介、基于所有的備份將未提交的事務進行"回滾"
3背蟆、將所有的增量應用到全量之上,有多個增量則按備份時間順序執(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應用到全量上
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、若在一次恢復數(shù)據(jù)后又有增量備份3出現(xiàn)柜某,那么現(xiàn)在像想要恢復到增量備份3的話直接將增量3應用到全量上就行了嗽元,之前增量1、增量2應用過一次就ok了不需要重復應用喂击。
2剂癌、也就是說已經(jīng)應用了增量備份的全量備份就是等于 全量+增量,再也不能回到之前的全量快照了翰绊!所以說想要保持之前的全量備份就必須自己手動copy一份防止出現(xiàn)意外佩谷。
4、恢復備份监嗜,指定的是第一個基本備份
xtrabackup --copy-back --target-dir=/data/mysql/xtrabackupdata/2020-10-29_16-19-39
同樣恢復數(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、修改權限
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
主從復制下使用需注意
在主從環(huán)境稚补,那將master進行恢復后,因恢復過程中沒有產生二進制日志(xtrabackup恢復畢竟只是磁盤文件的恢復框喳,并不會寫binlog)课幕,slave不會恢復到跟master一致厦坛,所以也要在slave使用同樣的方式進行恢復。
壓縮備份
Percona XtraBackup實施了對壓縮備份的支持乍惊。它可用于使用xbstream壓縮/解壓縮本地或流式備份杜秸。
創(chuàng)建壓縮備份
為了進行壓縮備份,您需要使用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選項啟用。以下示例將使用四個線程進行壓縮:
innobackupex --defaults-file=/etc/my.cnf --host=192.168.6.128 --user=root --password=Sgl20@14 --compress --compress-threads=4 /data/mysql/xtrabackupdata
壓縮過的備份文件相對于沒有壓縮的備份文件多了 .qp
結尾
恢復壓縮備份
1莉撇、在準備備份之前呢蛤,您需要解壓所有文件。 Percona XtraBackup已經(jīng)實現(xiàn)了可用于解壓縮備份的選項 xtrabackup --decompress棍郎,但是Innobackupex默認沒有集成安裝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、然后指定壓縮備份進行解壓
innobackupex --decompress --remove-original /data/mysql/xtrabackupdata/2020-10-30_14-28-07
會把文件直接解壓到當前目錄
Percona XtraBackup不會自動刪除壓縮文件涂佃。為了清理備份目錄励翼,您應該使用 xtrabackup --remove-original 移除原始選項。
之后的恢復操作就和上面介紹的一樣了辜荠。
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ā)送到遠程服務器
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"
使用腳本定時備份
普通的策略是:每周進行一次全備汽抚,接下來6天執(zhí)行增量備份,并保留上一周的一套備份伯病。同時全備也復制一個副本造烁。防止被增量備份應用過后無法恢復。