MySQL5.7備份恢復(fù)工具—Xtrabackup實(shí)戰(zhàn)
一、基礎(chǔ)知識(shí)
1、mysql邏輯備份與物理備份的區(qū)別
MySQL 備份通常分為兩種類型:邏輯備份和物理備份。這兩種備份方法各有優(yōu)缺點(diǎn),適用于不同的場(chǎng)景。
邏輯備份:
邏輯備份是從數(shù)據(jù)庫(kù)中導(dǎo)出數(shù)據(jù)和結(jié)構(gòu)的 SQL 語(yǔ)句。這種備份通常使用 mysqldump 工具來完成。邏輯備份的主要優(yōu)點(diǎn)是它具有較高的可移植性,可以在不同架構(gòu)和版本的 MySQL 服務(wù)器上還原。但是,邏輯備份可能需要更長(zhǎng)的時(shí)間來完成,特別是在處理大型數(shù)據(jù)庫(kù)時(shí)。
邏輯備份的主要特點(diǎn):
- 生成的備份文件是文本文件,包含 SQL 語(yǔ)句。
- 備份和恢復(fù)速度相對(duì)較慢。
- 可移植性好,可以在不同版本和架構(gòu)的 MySQL 服務(wù)器上使用。
- 可以選擇性地備份和恢復(fù)特定的數(shù)據(jù)庫(kù)、表或記錄。
物理備份:
物理備份是直接復(fù)制數(shù)據(jù)庫(kù)的數(shù)據(jù)文件、索引文件和日志文件。這種備份方法通常使用文件系統(tǒng)快照或第三方工具(如 Percona XtraBackup)來完成。物理備份的主要優(yōu)點(diǎn)是它通常更快,因?yàn)樗恍枰D(zhuǎn)換數(shù)據(jù)。然而,物理備份可能不如邏輯備份可移植,因?yàn)樗蕾囉谔囟ǖ奈募到y(tǒng)和操作系統(tǒng)。
物理備份的主要特點(diǎn):
- 生成的備份文件是二進(jìn)制文件,包含數(shù)據(jù)庫(kù)的實(shí)際數(shù)據(jù)文件、索引文件和日志文件。
- 備份和恢復(fù)速度相對(duì)較快。
- 可移植性較差,通常只能在相同版本和架構(gòu)的 MySQL 服務(wù)器上使用。
- 通常需要停止數(shù)據(jù)庫(kù)或在讀鎖模式下進(jìn)行備份,以確保數(shù)據(jù)的一致性。
總之,邏輯備份和物理備份有各自的優(yōu)缺點(diǎn),根據(jù)不同的應(yīng)用場(chǎng)景和需求來選擇合適的備份方法。
今天我們分享的主角就是大名鼎鼎的mysql物理備份神器-Percona XtraBackup
二、Percona XtraBackup的安裝
1、環(huán)境描述
- 操作系統(tǒng)版本:CENTOS 7.9
- MYSQL數(shù)據(jù)庫(kù)版本:5.7
- 數(shù)據(jù)庫(kù)實(shí)例端口:3307
2、安裝過程
(1)安裝yum源
yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
(2)安裝XtraBackup 2.4版本的percona-xtrabackup
安裝mysql對(duì)應(yīng)版本的xtrabackup,不同服務(wù)器安裝不同的版本
- mysql 5.1 – xtrabackup2.0
- mysql5.6 –xtrabackup 2.2
- mysql5.7 –xtrabackup2.4
yum install -y percona-xtrabackup-24.x86_64
(3)常用參數(shù)說明
--defaults-file
同xtrabackup的--defaults-file參數(shù)
--apply-log
在備份目錄下,通過應(yīng)用名稱為xtrabackup_logfile的交易日志文件來準(zhǔn)備備份。同時(shí),創(chuàng)建新的交易日志。
--copy-back
做數(shù)據(jù)恢復(fù)時(shí)將備份數(shù)據(jù)文件拷貝到MySQL服務(wù)器的datadir ;
--remote-host=HOSTNAME
通過ssh將備份數(shù)據(jù)存儲(chǔ)到進(jìn)程服務(wù)器上;
--stream=[tar]
備 份文件輸出格式, tar時(shí)使用tar4ibd , 該文件可在XtarBackup binary文件中獲得.如果備份時(shí)有指定--stream=tar, 則tar4ibd文件所處目錄一定要在$PATH中(因?yàn)槭褂玫氖莟ar4ibd去壓縮, 在XtraBackup的binary包中可獲得該文件)。
在 使用參數(shù)stream=tar備份的時(shí)候,你的xtrabackup_logfile可能會(huì)臨時(shí)放在/tmp目錄下,如果你備份的時(shí)候并發(fā)寫入較大的話 xtrabackup_logfile可能會(huì)很大(5G+),很可能會(huì)撐滿你的/tmp目錄,可以通過參數(shù)--tmpdir指定目錄來解決這個(gè)問題。
--tmpdir=DIRECTORY
當(dāng)有指定--remote-host or --stream時(shí), 事務(wù)日志臨時(shí)存儲(chǔ)的目錄, 默認(rèn)采用MySQL配置文件中所指定的臨時(shí)目錄tmpdir
--redo-only --apply-log組,
強(qiáng)制備份日志時(shí)只redo ,跳過rollback。這在做多個(gè)增量備份合并時(shí)非常必要。
--use-memory=#
指定數(shù)據(jù)庫(kù)恢復(fù)時(shí)使用的內(nèi)存大小,需要搭配--apply-log參數(shù)
--throttle=IOS
同xtrabackup的--throttle參數(shù)
--sleep=是給ibbackup使用的,指定每備份1M數(shù)據(jù),過程停止拷貝多少毫秒,也是為了在備份時(shí)盡量減小對(duì)正常業(yè)務(wù)的影響,具體可以查看ibbackup的手冊(cè) ;
--compress[=LEVEL]
對(duì)備份數(shù)據(jù)迚行壓縮,僅支持ibbackup,xtrabackup還沒有實(shí)現(xiàn);
--include=REGEXP
對(duì) xtrabackup參數(shù)--tables的封裝,也支持ibbackup。備份包含的庫(kù)表,例如:--include="test.*",意思是要備份 test庫(kù)中所有的表。如果需要全備份,則省略這個(gè)參數(shù);如果需要備份test庫(kù)下的2個(gè)表:test1和test2,則寫 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。
--databases=LIST
列出需要備份的databases,如果沒有指定該參數(shù),所有包含MyISAM和InnoDB表的database都會(huì)被備份;
--uncompress
解壓備份的數(shù)據(jù)文件,支持ibbackup,xtrabackup還沒有實(shí)現(xiàn)該功能;
--slave-info,
當(dāng)備份一個(gè)作為復(fù)制環(huán)境的服務(wù)器時(shí),這個(gè)參數(shù)會(huì)自動(dòng)將CHANGE MASTER語(yǔ)句寫到備份中,在恢復(fù)備份后,不必執(zhí)行CHANGE MASTER語(yǔ)句。
--socket=SOCKET
指定mysql.sock所在位置,以便備份進(jìn)程登錄mysql.
--compact
創(chuàng)建一個(gè)不包含第二索引(除了主鍵之外的索引)的備份
--incremental-basedir
以上一次全量或增量備份的路徑,作為增量備份的基礎(chǔ)。指定這個(gè)參數(shù)的同時(shí),應(yīng)該同樣指定--incremental參數(shù)
--incremental
創(chuàng)建增量備份,當(dāng)指定這個(gè)參數(shù)的時(shí)候,應(yīng)該指定--incremental-lsn或--incremental-basedir參數(shù),否則將會(huì)備份到--incremental-basedir路徑
--incremental-dir=DIRECTORY
指定增量備份的目錄,需要搭配--incremental參數(shù)。
--no-timestamp
這個(gè)參數(shù)會(huì)讓xtrabackup在備份的時(shí)候不創(chuàng)建帶有時(shí)間格式的子文件夾。當(dāng)指定了這個(gè)參數(shù),備份會(huì)直接創(chuàng)建在指定的備份目錄下。
--tables-file=FILE
這個(gè)參數(shù)會(huì)接受一個(gè)字符串,這個(gè)字符串指定了一個(gè)文件,這個(gè)文件包含了要備份的表名,格式如database.table,一行一個(gè)。
--use-memory=# -apply-log 調(diào)節(jié)內(nèi)存使用
--parallel= 多線程拷貝數(shù)據(jù)文件,使用該參數(shù)要考慮線上的數(shù)據(jù)庫(kù)的壓力的問題,如果線程開啟較多,會(huì)對(duì)硬盤產(chǎn)生交大的壓力。
三、 備份與恢復(fù)過程
備份目錄:/backup/mysql
1、全量備份與恢復(fù)
全量備份
innobackupex --defaults-file=/etc/my3307.cnf --host=localhost --port=3307 -S /tmp/mysql.sock --user=root --password='Rootasdf2023' --no-timestamp /backup/mysql/full_`date +%Y-%m-%d_%H-%M-%S_%w`
全量恢復(fù)
1、刪庫(kù)并停止數(shù)據(jù)庫(kù)。
service mysqld stop
2、備份myql數(shù)據(jù)目錄。
cp -rpf /data/3307/data /data/3307/data_bak
3、日志包含了redo以及undo的操作,應(yīng)用過程類似與mysql hang機(jī)后的recovery操作,完成后備份處于一致性狀態(tài)。
innobackupex --apply-log /backup/mysql/full_2023-05-10_14-08-36_3
4、拷貝備份數(shù)據(jù)至my.cnf文件規(guī)定的位置。
innobackupex --defaults-file=/etc/my3307.cnf --copy-back --rsync /backup/mysql/full_2023-05-10_14-08-36_3
5、更改mysql數(shù)據(jù)目錄的權(quán)限為mysql。
chown -R mysql:mysql /data/3307/data
6、啟動(dòng)數(shù)據(jù)庫(kù),至此數(shù)據(jù)恢復(fù)完成
/etc/init.d/mysql3307 start
2、增量備份與恢復(fù)
(1)增量備份原理
增量備份有兩種方法:
方法一:針對(duì)全量的basedir做增量。
總是針對(duì)全量的basedir做增量,這個(gè)方式恢復(fù)起來就特別簡(jiǎn)單了,只需要將最后一次的增量備份合并到全量備份里,就可以恢復(fù)了。
第一種方法示例圖: 總是將1月1日的全備作為basedir,所以FROM_LSN號(hào)總是5000。
方法二:總是針對(duì)上一次增量,做增量備份。
總是針對(duì)上一次的增量,做增量備份。這個(gè)方式的恢復(fù),就要逐一合并了。總是把上一次(最近一次)的備份作為basedir
方法二示意圖:
下面介紹的方法是針對(duì)第二種的。
(2)增量恢復(fù)實(shí)驗(yàn)過程
先來一次全備,兩次增備
#全備
innobackupex --defaults-file=/etc/my3307.cnf --host=localhost --port=3307 -S /tmp/mysql.sock --user=root --password='Rootasdf2023' --no-timestamp /backup/mysql/full_`date +%Y-%m-%d_%H-%M-%S_%w`
#第一次增備
innobackupex --defaults-file=/etc/my3307.cnf --host=localhost --port=3307 -S /tmp/mysql.sock --user=root --password='Rootasdf2023' --no-timestamp --incremental-basedir=/backup/mysql/full_2023-05-10_14-08-36_3 --incremental /backup/mysql/incr_`date +%Y-%m-%d_%H-%M-%S_%w`
#第二次增備
innobackupex --defaults-file=/etc/my3307.cnf --host=localhost --port=3307 -S /tmp/mysql.sock --user=root --password='Rootasdf2023' --no-timestamp --incremental-basedir=/backup/mysql/incr_2023-05-10_14-11-28_3 --incremental /backup/mysql/incr_`date +%Y-%m-%d_%H-%M-%S_%w`
#備份文件查看
[root@mysqlserver mysql]# ls -l /backup/mysql/
total 4
drwxr-x--- 7 root root 4096 May 10 14:15 full_2023-05-10_14-08-36_3
drwxr-x--- 7 root root 318 May 10 14:11 incr_2023-05-10_14-11-28_3
drwxr-x--- 7 root root 318 May 10 14:14 incr_2023-05-10_14-13-17_3
[root@mysqlserver mysql]#
prepare準(zhǔn)備過程
這就是增量備份最麻煩的地方,因?yàn)榭偣沧隽巳蝹浞?,所以先做三次prepare
對(duì)全備做prepare:
innobackupex --apply-log --redo-only /backup/mysql/full_2023-05-10_14-08-36_3
對(duì)第一次增量prepare:
innobackupex --apply-log --redo-only /backup/mysql/full_2023-05-10_14-08-36_3 --incremental-dir=/backup/mysql/incr_2023-05-10_14-11-28_3
對(duì)第二次增量prepare:
注意,第二次的增備是最后一次,所以不需要加上–redo-only參數(shù):
innobackupex --apply-log /backup/mysql/full_2023-05-10_14-08-36_3 --incremental-dir=/backup/mysql/incr_2023-05-10_14-13-17_3
最后一步將兩次增量備份和全量做一次合并。
innobackupex --apply-log /backup/mysql/full_2023-05-10_14-08-36_3
3、恢復(fù)數(shù)據(jù)
(1) 停止mysql服務(wù)。
/etc/init.d/mysql3307 stop
(2)模擬刪除庫(kù)(刪除之前先備份一下目錄 )。
rm -rf /data/3307/data
(3)恢復(fù)數(shù)據(jù)。
innobackupex --defaults-file=/etc/my3307.cnf --copy-back --rsync /backup/mysql/full_2023-05-10_14-08-36_3
(4)修改權(quán)限。
chown -R mysql:mysql /data/3307/data
(5)啟動(dòng)數(shù)據(jù)庫(kù),驗(yàn)證相關(guān)數(shù)據(jù)。
/etc/init.d/mysql3307 start
四、常見問題匯總
問題1:
恢復(fù)時(shí)報(bào)Xtrabackup –copy-back fail Can’t create/write to file ‘./undo_001’。
解決方法:
/etc/my.cnf配置文件中注釋掉如下代碼:
#innodb_undo_directory=.