mysql 物理備份工具之 xtrabackup

之前使用 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/

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版本對應關系
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保存在共享表空間文件中)


image.png
全量恢復步驟

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個增量


image.png

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 結尾

image.png

恢復壓縮備份

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

會把文件直接解壓到當前目錄


image.png

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í)行增量備份,并保留上一周的一套備份伯病。同時全備也復制一個副本造烁。防止被增量備份應用過后無法恢復。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末狱从,一起剝皮案震驚了整個濱河市膨蛮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌季研,老刑警劉巖敞葛,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異与涡,居然都是意外死亡惹谐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門驼卖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氨肌,“玉大人,你說我怎么就攤上這事酌畜≡跚簦” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恳守。 經(jīng)常有香客問我考婴,道長,這世上最難降的妖魔是什么催烘? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任沥阱,我火速辦了婚禮,結果婚禮上伊群,老公的妹妹穿的比我還像新娘考杉。我一直安慰自己,他們只是感情好舰始,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布崇棠。 她就那樣靜靜地躺著,像睡著了一般蔽午。 火紅的嫁衣襯著肌膚如雪易茬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天及老,我揣著相機與錄音,去河邊找鬼范抓。 笑死骄恶,一個胖子當著我的面吹牛,可吹牛的內容都是我干的匕垫。 我是一名探鬼主播僧鲁,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼象泵!你這毒婦竟也來了寞秃?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤偶惠,失蹤者是張志新(化名)和其女友劉穎春寿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忽孽,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡绑改,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兄一。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厘线。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖出革,靈堂內的尸體忽然破棺而出造壮,到底是詐尸還是另有隱情,我是刑警寧澤骂束,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布耳璧,位于F島的核電站成箫,受9級特大地震影響,放射性物質發(fā)生泄漏楞抡。R本人自食惡果不足惜伟众,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望召廷。 院中可真熱鬧凳厢,春花似錦、人聲如沸竞慢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筹煮。三九已至遮精,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間败潦,已是汗流浹背本冲。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劫扒,地道東北人檬洞。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像沟饥,于是被迫代替她去往敵國和親添怔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344