下文給大家?guī)?lái)有關(guān)使用xtrabackup工具實(shí)現(xiàn)對(duì)MySQL數(shù)據(jù)庫(kù)備份內(nèi)容,相信大家一定看過(guò)類(lèi)似的文章。我們給大家?guī)?lái)的有何不同呢?一起來(lái)看看正文部分吧,相信看完使用xtrabackup工具實(shí)現(xiàn)對(duì)MySQL數(shù)據(jù)庫(kù)備份你一定會(huì)有所收獲。
目前累計(jì)服務(wù)客戶數(shù)千家,積累了豐富的產(chǎn)品開(kāi)發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹(shù)立企業(yè)形象,為客戶提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷(xiāo)、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。創(chuàng)新互聯(lián)公司始終以務(wù)實(shí)、誠(chéng)信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過(guò)對(duì)領(lǐng)先技術(shù)的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究、對(duì)客戶形象的視覺(jué)傳遞、對(duì)應(yīng)用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。
xtrabackup是由percona提供的MySQL數(shù)據(jù)庫(kù)備份工具,其備份速度快并且可靠;備份過(guò)程不會(huì)打斷正在執(zhí)行的事務(wù);能夠基于壓縮等功能節(jié)約磁盤(pán)空間和流量;自動(dòng)實(shí)現(xiàn)備份檢驗(yàn);還原速度快。
若需要安裝xtrabackup,可以移步其官方網(wǎng)站,在其官網(wǎng)上提供了多種安裝方式。
博文大綱:
- 一、安裝xtrabackup及其插件
- 二、xtrabackup完全備份+binlog增量備份
- 三、xtrabackup完全備份+xtrabackup增量備份
- 四、innobackupex全庫(kù)備份+innobackupex增量備份
注:二、三、四是三種不同的備份方案,在生產(chǎn)環(huán)境中選擇合適的一種即可。
參考官方文檔,在官方文檔上提供了各個(gè)版本的幫助說(shuō)明。
[root@mysql ~]# yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm [root@mysql ~]# yum -y install percona-xtrabackup-24
xtrabackup中主要包含兩個(gè)工具:
- xtrabackup:是用于熱備份innodb,xtradb表中數(shù)據(jù)的工具,支持在線熱備份,可以在不加鎖的情況下備份innodb數(shù)據(jù)表,不過(guò)該工具不能操作myisam引擎表。
- innobackupex:是將xtrabackup進(jìn)行封裝的perl腳本,能同時(shí)處理innodb和myisam,但在處理myisam時(shí)需要加一個(gè)讀鎖,由于操作myisam時(shí)需要加讀鎖,所以會(huì)堵塞線上服務(wù)的寫(xiě)操作,而Innodb沒(méi)有這樣的限制。
[root@mysql test]# yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5 [root@mysql test]# wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm [root@mysql test]# rpm -ivh percona-toolkit-2.2.19-1.noarch.rpm
[root@mysql test]# mkdir -p /opt/mysqlbackup/{full,inc} # full:全備存放的目錄 # inc:增量備份存放的目錄
[root@mysql test]# mysql -uroot -p123.com mysql> create user bakuser@'localhost' identified by '123.com'; mysql> revoke all privileges,grant option from 'bakuser'@'localhost'; mysql> grant reload,lock tables,replication client,process on *.* to bakuser@'localhost'; mysql> flush privileges;
[root@mysql test]# innobackupex --user=bakuser --password=123.com /opt/mysqlbackup/full/ #當(dāng)備份完成后將出現(xiàn)以下提示信息 ............. #忽略部分信息 200116 13:09:21 completed OK!
上述執(zhí)行相關(guān)解釋如下:
- --user:指定連接數(shù)據(jù)庫(kù)的用戶名;
- --password:指定連接數(shù)據(jù)庫(kù)的密碼;
- --defaults-file:指定數(shù)據(jù)庫(kù)的配置文件my.cnf,innobackupex要從其中獲取datadir等信息,如果不指定,則會(huì)默認(rèn)去搜索my.cnf這個(gè)文件,搜索順序和mysql啟動(dòng)時(shí)的搜索順序一樣;
- --database:指定要備份的數(shù)據(jù)據(jù)庫(kù),這里指定的數(shù)據(jù)庫(kù)只對(duì)myisam表有效,對(duì)于innodb數(shù)據(jù)來(lái)說(shuō)都是全備(所有數(shù)據(jù)庫(kù)中的innodb數(shù)據(jù)都進(jìn)行了備份,不是只備份指定的數(shù)據(jù)庫(kù),恢復(fù)時(shí)也一樣);
- /opt/mysqlbackup/full:是備份文件的存放位置。
各個(gè)文件存放的內(nèi)容如下:
在進(jìn)行增量備份前,需要先查看到完全備份時(shí)binlog日志位置(position),如下:
[root@mysql 2020-01-17_10-39-52]# pwd /opt/mysqlbackup/full/2020-01-17_10-39-52 [root@mysql 2020-01-17_10-39-52]# cat xtrabackup_binlog_info bin_log.000001 154 # 得到完全備份是備份到了bin_log.000001二進(jìn)制日志中的154的位置
通過(guò)二進(jìn)制日志進(jìn)行增量備份:
在增量備份前,自行向數(shù)據(jù)庫(kù)中進(jìn)行增刪改等操作,以便產(chǎn)生新的二進(jìn)制日志。
[root@mysql ~]# mysqlbinlog --start-position=154 /usr/local/mysql/data/bin_log.000001 > /opt/mysqlbackup/inc/`date +%F`.sql
[root@mysql ~]# rm -rf /usr/local/mysql/data/* #直接刪除本地所有數(shù)據(jù)
還原完全備份的大概流程如下:
通過(guò)--apply-log選項(xiàng)可用于實(shí)現(xiàn)上述功能,命令如下:
[root@mysql ~]# innobackupex --apply-log /opt/mysqlbackup/full/2020-01-17_10-39-52/ [root@mysql 2020-01-17_10-39-52]# cat xtrabackup_checkpoints backup_type = full-prepared #當(dāng)準(zhǔn)備工作完成后,備份目錄下的此文件內(nèi)容中的備份類(lèi)型會(huì)為:full-prepared from_lsn = 0 to_lsn = 2841752 last_lsn = 2841761 compact = 0 recover_binlog_info = 0 flushed_lsn = 2841761
注:/opt/mysqlbackup/full/2020-01-17_10-39-52/是備份文件所在目錄名稱(chēng),如果執(zhí)行正確,最后幾行輸出的信息如下:
在實(shí)現(xiàn)“準(zhǔn)備”的過(guò)程中,innobackupex通常還可以使用“--user-memory”選項(xiàng)來(lái)指定其可以使用的內(nèi)存大小,默認(rèn)為100M,如果有足夠的內(nèi)存,可以多劃分一些內(nèi)存給prepare的過(guò)程,以提高其完成速度。
在準(zhǔn)備工作完成后,即可使用以下命令進(jìn)行恢復(fù):
[root@mysql ~]# innobackupex --copy-back /opt/mysqlbackup/full/2020-01-17_10-39-52/
確認(rèn)數(shù)據(jù)已恢復(fù):
完全備份的數(shù)據(jù)已經(jīng)恢復(fù),但是需要注意權(quán)限的問(wèn)題,恢復(fù)后的數(shù)據(jù)屬主及屬組都是當(dāng)前用戶root,所以還需要更改其屬主及屬組,如下:
[root@mysql ~]# cd /usr/local/mysql/data/ [root@mysql data]# chown -R mysql.mysql . [root@mysql data]# ll #確認(rèn)當(dāng)前屬組與屬主 總用量 122924 drwxr-x--- 2 mysql mysql 90 1月 17 11:15 data1 -rw-r----- 1 mysql mysql 324 1月 17 11:15 ib_buffer_pool -rw-r----- 1 mysql mysql 12582912 1月 17 11:15 ibdata1 -rw-r----- 1 mysql mysql 50331648 1月 17 11:15 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 1月 17 11:15 ib_logfile1 -rw-r----- 1 mysql mysql 12582912 1月 17 11:15 ibtmp1 drwxr-x--- 2 mysql mysql 4096 1月 17 11:15 mysql drwxr-x--- 2 mysql mysql 8192 1月 17 11:15 performance_schema drwxr-x--- 2 mysql mysql 8192 1月 17 11:15 sys -rw-r----- 1 mysql mysql 20 1月 17 11:15 xtrabackup_binlog_pos_innodb -rw-r----- 1 mysql mysql 481 1月 17 11:15 xtrabackup_info -rw-r----- 1 mysql mysql 1 1月 17 11:15 xtrabackup_master_key_id [root@mysql ~]# systemctl restart mysqld #在數(shù)據(jù)恢復(fù)后,需要重啟云服務(wù)器,否則數(shù)據(jù)不統(tǒng)一
[root@mysql ~]# mysql -uroot -p123.com -e "select * from data1.t1;" +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | | 3 | tom3 | +------+------+
為了防止還原時(shí)產(chǎn)生大量的二進(jìn)制日志,在還原時(shí)最好臨時(shí)關(guān)閉二進(jìn)制日志,如下:
[root@mysql ~]# mysql -uroot -p123.com -e 'set sql_log_bin=0;' #臨時(shí)關(guān)閉二進(jìn)制日志 [root@mysql ~]# mysql -uroot -p123.com < /opt/mysqlbackup/inc/2020-01-17.sql #恢復(fù)二進(jìn)制日志 [root@mysql ~]# mysql -uroot -p123.com -e 'set sql_log_bin=1;' #開(kāi)啟二進(jìn)制日志 [root@mysql ~]# mysql -uroot -p123.com -e "select * from data1.t1;" #確認(rèn)數(shù)據(jù)恢復(fù)正確 +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | | 3 | tom3 | | 4 | tom4 | | 5 | tom5 | +------+------+--+i
在第一個(gè)備份方案中,增量備份使用的是備份二進(jìn)制日志,其實(shí)xtrabackup還支持進(jìn)行增量備份,xtrabackup的備份原理如下:
在innodb內(nèi)部會(huì)維護(hù)一個(gè)redo日志我呢見(jiàn),也可以叫做事務(wù)日志文件(transaction,事務(wù)日志),事務(wù)日志會(huì)存儲(chǔ)每個(gè)innodb表數(shù)據(jù)的記錄修改,當(dāng)innodb啟動(dòng)時(shí),innodb會(huì)檢查數(shù)據(jù)文件和事務(wù)日志,并能執(zhí)行兩個(gè)步驟:它應(yīng)用已經(jīng)提交的事務(wù)日志到數(shù)據(jù)文件,并將修改過(guò)但沒(méi)有提交的數(shù)據(jù)進(jìn)行回滾操作。xtrabackup在啟動(dòng)時(shí)會(huì)記住log sequence number(LSN),并且復(fù)制所有的數(shù)據(jù)文件,復(fù)制過(guò)程需要一些時(shí)間,所以這期間如果數(shù)據(jù)文件有改動(dòng),那么將會(huì)使數(shù)據(jù)庫(kù)處于一個(gè)不同的時(shí)間點(diǎn)。這時(shí),xtrabackup會(huì)運(yùn)行一個(gè)后臺(tái)進(jìn)程,用于監(jiān)視事務(wù)日志,并從事務(wù)日志復(fù)制最新的修改,xtrabackup必須持續(xù)的做這個(gè)操作,是因?yàn)槭聞?wù)日志是會(huì)輪轉(zhuǎn)重復(fù)的寫(xiě)入,并且事務(wù)日志可以被重用。所以xtrabackup自啟動(dòng)開(kāi)始,就不停的將事務(wù)日志中每個(gè)數(shù)據(jù)文件的修改都記錄下來(lái)。這就是xtrabackup的備份過(guò)程。
所以每個(gè)innodb的頁(yè)面都會(huì)包含一個(gè)LSN信息,每當(dāng)相關(guān)的數(shù)據(jù)發(fā)生改變,相關(guān)的頁(yè)面LSN就會(huì)自動(dòng)增長(zhǎng)。這就是innodb表可以進(jìn)行增量備份的基礎(chǔ)。xtrabackup基于innodb的crash-recovery功能,它會(huì)復(fù)制innodb的data file ,由于不鎖表,復(fù)制出來(lái)的數(shù)據(jù)是不一致的,在恢復(fù)的時(shí)候使用crash-recovery,使得數(shù)據(jù)恢復(fù)一致。
mysql> create database test; mysql> use test; mysql> create table xx(id int,name varchar(20)); mysql> insert into xx values(1,'tom1'); mysql> insert into xx values(2,'tom2'); mysql> select * from xx; +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | +------+------+
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --user=bakuser --password="123.com" --port=3306 --backup --target-dir=/opt/mysqlbackup/full/full_incre_$(date '+%F_%T')
上述各個(gè)指令解釋如下:
- --defaults-file:指定數(shù)據(jù)庫(kù)的配置文件,如果使用該參數(shù),必須作為第一個(gè)參數(shù);
- --user:指定連接數(shù)據(jù)庫(kù)的用戶名;
- --password:指定連接數(shù)據(jù)庫(kù)的密碼;
- --port:指定連接數(shù)據(jù)庫(kù)的端口號(hào);
- --backup:實(shí)施備份到target-dir;
- --target-dir=name:備份文件的存放目錄路徑。innobackupex要從其中獲取datadir等信息;
- --database:指定要備份的數(shù)據(jù)庫(kù),這里指定的數(shù)據(jù)庫(kù)只對(duì)myisam和innodb表的表結(jié)構(gòu)有效,對(duì)于innodb數(shù)據(jù)庫(kù)來(lái)說(shuō)都是完全備份(恢復(fù)時(shí)也一樣)。
#先插入新的數(shù)據(jù) [root@mysql full]# mysql -uroot -p123.com -e "insert into test.xx values(3,'tom3');" #再進(jìn)行增量備份 [root@mysql full]# xtrabackup --defaults-file=/etc/my.cnf --user=bakuser --password="123.com" --port=3306 --backup --target-dir=/opt/mysqlbackup/inc/incre_$(date '+%F_%T') --incremental-basedir=/opt/mysqlbackup/full/full_incre_2020-01-17_14\:34\:39/
在上述指令中,--incremental-basedir是指定上次完整備份或者增量備份文件的位置(即如果是第一次增量備份則指向完全備份所在目錄,在執(zhí)行過(guò)增量備份之后再一次進(jìn)行增量備份時(shí),其--incremental-basedir應(yīng)該指向上一次的增量備份所在的目錄)。
查看增量備份文件:
[root@mysql full]# ll /opt/mysqlbackup/inc/ 總用量 0 drwxr-x--- 7 root root 274 1月 17 15:12 incre_2020-01-17_15:12:00 # 注:這里的增量備份只是針對(duì)innodb,對(duì)于myisam來(lái)說(shuō),還是完整備份。
#再插入新的數(shù)據(jù) [root@mysql full]# mysql -uroot -p123.com -e "insert into test.xx values(4,'tom4');" #進(jìn)行第二次增量備份 [root@mysql full]# xtrabackup --defaults-file=/etc/my.cnf --user=bakuser --password="123.com" --port=3306 --backup --target-dir=/opt/mysqlbackup/inc/incre_$(date '+%F_%T') --incremental-basedir=/opt/mysqlbackup/inc/incre_2020-01-17_15\:12\:00/
注:第二次增量備份--incremental-basedir應(yīng)該指向上一次增量備份文件的位置。
恢復(fù)數(shù)據(jù)的大概流程如下:
如果備份文件是tar包,解包命令為:tar -izxf xxx.tar,這里必須使用-i參數(shù),表示忽略存檔中的0字節(jié)。
首先準(zhǔn)備恢復(fù)完全備份:
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=bakuser --password="123.com" --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_2020-01-17_14\:34\:39/
再準(zhǔn)備恢復(fù)到第一次增量備份的時(shí)刻,如下:
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=bakuser --password='123.com' --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_2020-01-17_14\:34\:39/ --incremental-dir=/opt/mysqlbackup/inc/incre_2020-01-17_15\:12\:00/
再準(zhǔn)備恢復(fù)第二次增量備份,如下:
[root@mysql ~]# xtrabackup --defaults-file=/etc/my.cnf --prepare --user=bakuser --password='123.com' --apply-log-only --target-dir=/opt/mysqlbackup/full/full_incre_2020-01-17_14\:34\:39/ --incremental-dir=/opt/mysqlbackup/inc/incre_2020-01-17_15\:20\:32/
然后停止MySQL數(shù)據(jù)庫(kù):
[root@mysql ~]# systemctl stop mysqld
開(kāi)始rsync數(shù)據(jù)文件:
[root@mysql ~]# cd /opt/mysqlbackup/full/full_incre_2020-01-17_14\:34\:39/ [root@mysql full_incre_2020-01-17_14:34:39]# rsync -rvt --exclude 'xtrabackup_checkpoints' --exclude 'xtrabackup_logfile' ./ /usr/local/mysql/data/
當(dāng)數(shù)據(jù)恢復(fù)到mysql的data目錄以后,還需要確保所有數(shù)據(jù)文件的屬主和屬組均為正確的用戶,如我這里需要修改為mysql,如下:
[root@mysql full_incre_2020-01-17_14:34:39]# cd /usr/local/mysql/data/ [root@mysql data]# chown -R mysql.mysql . #更改恢復(fù)后的數(shù)據(jù)屬組和屬主為mysql
確認(rèn)數(shù)據(jù)已恢復(fù):
[root@mysql data]# mysql -uroot -p123.com -e "select * from test.xx;" +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | | 3 | tom3 | | 4 | tom4 | +------+------+
#準(zhǔn)備測(cè)試數(shù)據(jù) [root@mysql data]# mysql -uroot -p123.com -e "select * from test.xx;" +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | | 3 | tom3 | +------+------+ #開(kāi)始完全備份 [root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password='123.com' /opt/mysqlbackup/full/full_incre_$(date '+%F_%H%M%S') --no-timestamp
注:--no-timestamp選項(xiàng)來(lái)阻止命令自動(dòng)創(chuàng)建一個(gè)以時(shí)間命名的目錄,然后即可自定義目錄了;
# 插入測(cè)試數(shù)據(jù) [root@mysql ~]# mysql -uroot -p123.com -e "insert into xx values(4,'tom4'),(5,'tom5');" test #進(jìn)行增量備份 [root@mysql ~]# innobackupex --incremental /opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/full/full_incre_2020-01-17_165254/ --user=bakuser --password='123.com' --no-timestamp # --incremental-basedir:指定的是上次完全備份或者增量備份的目錄 #由于這是第一次增量備份,所以就需要指定上次完全備份的目錄 [root@mysql ~]# ll /opt/mysqlbackup/inc/ #查看增量備份文件 總用量 0 drwxr-x--- 7 root root 274 1月 17 17:04 incre_20200117_170424
#插入新的數(shù)據(jù) [root@mysql ~]# mysql -uroot -p123.com -e "insert into test.xx values(6,'tom6')"; #基于第一次增量備份的目錄文件做第二次增量備份 [root@mysql ~]# innobackupex --incremental /opt/mysqlbackup/inc/incre_$(date +%Y%m%d_%H%M%S) --incremental-basedir=/opt/mysqlbackup/inc/incre_20200117_170424/ --user=bakuser --password='123.com' --no-timestamp
[root@mysql ~]# ll /opt/mysqlbackup/inc/ 總用量 0 drwxr-x--- 7 root root 274 1月 17 17:04 incre_20200117_170424 drwxr-x--- 7 root root 274 1月 17 17:10 incre_20200117_171035
[root@mysql ~]# rm -rf /usr/local/mysql/data/* #恢復(fù)完全備份目錄文件 [root@mysql ~]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_2020-01-17_165254/ # 將第一次增量備份合并到全備目錄 [root@mysql ~]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_2020-01-17_165254/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200117_170424/ # 將第二次增量備份合并到全備目錄 [root@mysql ~]# innobackupex --apply-log --redo-only /opt/mysqlbackup/full/full_incre_2020-01-17_165254/ --incremental-dir=/opt/mysqlbackup/inc/incre_20200117_171035/
[root@mysql ~]# systemctl stop mysqld #停止數(shù)據(jù)庫(kù) #進(jìn)行恢復(fù) [root@mysql ~]# innobackupex --defaults-file=/etc/my.cnf --user=bakuser --password='123.com' --copy-back /opt/mysqlbackup/full/full_incre_2020-01-17_165254/
[root@mysql ~]# cd /usr/local/mysql/data/ [root@mysql data]# chown -R mysql.mysql .
[root@mysql data]# systemctl start mysqld [root@mysql data]# mysql -uroot -p123.com -e "select * from test.xx;" +------+------+ | id | name | +------+------+ | 1 | tom1 | | 2 | tom2 | | 3 | tom3 | | 4 | tom4 | | 5 | tom5 | | 6 | tom6 | +------+------+
數(shù)據(jù)恢復(fù)成功。
Xtrabackup對(duì)備份的數(shù)據(jù)文件支持“流”功能,即可以將備份的數(shù)據(jù)通過(guò)STDOUT傳輸給tar程序進(jìn)行歸檔,而不是默認(rèn)的直接保存至某備份目錄中。要使用此功能,僅需要使用--stream選項(xiàng)即可。如下:
#進(jìn)行完整備份 [root@mysql opt]# innobackupex --user=bakuser --password="123.com" --stream=tar /opt/mysqlbackup/full/ | gzip > /opt/mysqlbackup/full/full_`date +%F_%H%M%S`.tar.gz #上述命令生成的備份文件如下: [root@mysql full]# ll /opt/mysqlbackup/full/ 總用量 640 -rw-r--r-- 1 root root 652578 1月 17 17:45 full_2020-01-17_174513.tar.gz
對(duì)于上文關(guān)于使用xtrabackup工具實(shí)現(xiàn)對(duì)MySQL數(shù)據(jù)庫(kù)備份,大家覺(jué)得是自己想要的嗎?如果想要了解更多相關(guān),可以繼續(xù)關(guān)注我們的行業(yè)資訊板塊。