Xtrabackup备份与恢复
-
一、Xtrabackup介紹
Percona-xtrabackup是 Percona公司開發(fā)的一個用于MySQL數(shù)據(jù)庫物理熱備的備份工具,支持MySQL、Percona server和MariaDB,開源免費,是目前較為受歡迎的主流備份工具。xtrabackup只能備份innoDB和xtraDB兩種數(shù)據(jù)引擎的表,而不能備份MyISAM數(shù)據(jù)表。
MySQL冷備、mysqldump、MySQL熱拷貝都無法實現(xiàn)對數(shù)據(jù)庫進行增量備份。在實際生產(chǎn)環(huán)境中增量備份是非常實用的,如果數(shù)據(jù)大于50G或100G,存儲空間足夠的情況下,可以每天進行完整備份,如果每天產(chǎn)生的數(shù)據(jù)量較大,需要定制數(shù)據(jù)備份策略。例如每周實用完整備份,周一到周六實用增量備份。而Percona-Xtrabackup就是為了實現(xiàn)增量備份而出現(xiàn)的一款主流備份工具,
xtrabackup包含兩個主要的工具,即xtrabackup和innobackupex,二者區(qū)別如下:
(1)xtrabackup只能備份innodb和xtradb兩種引擎的表,而不能備份myisam引擎的表;
(2)innobackupex是一個封裝了xtrabackup的Perl腳本,支持同時備份innodb和myisam,但在對myisam備份時需要加一個全局的讀鎖。還有就是myisam不支持增量備份
-
二、Xtrabackup優(yōu)點
(1)備份速度快,物理備份可靠
(2)備份過程不會打斷正在執(zhí)行的事務(wù)(無需鎖表)
(3)能夠基于壓縮等功能節(jié)約磁盤空間和流量
(4)自動備份校驗
(5)還原速度快
(6)可以流傳將備份傳輸?shù)搅硗庖慌_機器上
(7)在不增加服務(wù)器負載的情況備份數(shù)據(jù)
-
三、Xtrabackup備份原理
Xtrabackup備份流程圖(xtrabackup備份過程中,先備份innodb表,再備份非innodb表):
?
(1)innobackupex啟動后,會先fork一個進程,用于啟動xtrabackup,然后等待xtrabackup備份ibd數(shù)據(jù)文件;
(2)xtrabackup在備份innoDB數(shù)據(jù)是,有2種線程:redo拷貝線程和ibd數(shù)據(jù)拷貝線程。
xtrabackup進程開始執(zhí)行后,會啟動一個redo拷貝的線程,用于從最新的checkpoint點開始順序拷貝redo.log;
這時xtrabackup記下LSN并將redo log拷貝到備份目標(biāo)目錄下的xtrabackup_logfile文件中。由于拷貝需要一定時間,如果在拷貝時間段內(nèi)有日志寫入,將導(dǎo)致拷貝的日志和MySQL的redo log不一致,所以xtrabackup還有一個后臺進程監(jiān)控著mysql的redo log,每秒監(jiān)控一次,當(dāng)MySQL的redo log有變化,該監(jiān)控進程會立即將變化的內(nèi)容寫入到xtrabackup_logfile文件,這樣就能保證拷貝走的redo log中記錄了一切變化。但是這也是有風(fēng)險的,因為redo是輪訓(xùn)式循環(huán)寫入的,如果某一時刻有非常大量的日志寫到redo log中,使得還沒開始復(fù)制的日志就被新日志覆蓋了,這樣會日志丟失,并報錯。
再啟動ibd數(shù)據(jù)拷貝線程,進行拷貝innodb表的數(shù)據(jù)文件(即表空間文件.ibd文件和ibdata1)。
注意,此時不拷貝innodb的frm文件。
這里是先啟動redo拷貝線程的。在此階段,innobackupex進行處于等待狀態(tài)(等待文件被創(chuàng)建)
(4)xtrabackup拷貝完成ibd數(shù)據(jù)文件后,會通知innobackupex(通過創(chuàng)建文件),同時xtrabackup進入等待狀態(tài)(redo線程依舊在拷貝redo.log)
(5)innobackupex收到xtrabackup通知后哦,執(zhí)行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位點,然后開始備份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷貝非InnoDB文件的過程當(dāng)中,數(shù)據(jù)庫處于全局只讀狀態(tài)。
| 對于不支持backup lock的版本,只能通過flush tables with read lock來獲取全局讀鎖,但這樣也同樣會鎖住innodb表,殺傷力太大。所以使用xtrabackup備份Oracle的MySQL,實質(zhì)上只能實現(xiàn)innodb表的部分時間熱備、部分時間溫備。 對于支持backup lock的版本,xtrabackup通過lock tables for backup獲取輕量級的backup locks來替代flush tables with read lock,因為它只鎖定非innodb表,所以由此實現(xiàn)了innodb表的真正熱備 |
(6)當(dāng)innobackup拷貝完所有的非InnoDB文件后,包括獲取二進制日志中一致性位置的坐標(biāo)點、結(jié)束redo log的監(jiān)控和拷貝、釋放鎖等,會通知xtrabackup,通知完成后,進入等待狀態(tài);
(7)xtrabackup收到innobackupex備份完成的通知后,會停止redo拷貝線程,然后通知innobackupex,redo.log文件拷貝完成;
(8)innobackupex收到redo.log備份完成后,就進行解鎖操作,執(zhí)行:UNLOCK TABLES;
| 對于不支持backup lock的版本,收尾階段的過程是這樣的:獲取二進制日志的一致性坐標(biāo)點、結(jié)束redo log的監(jiān)控和拷貝、釋放鎖。 對于支持backup lock的版本,收尾階段的過程是這樣的:先通過lock binlog for bakcup來獲取二進制日志鎖,然后結(jié)束redo log的監(jiān)控和拷貝,再unlock tables釋放表鎖,隨后獲取二進制日志的一致性位置坐 標(biāo)點,最后unlock binlog釋放二進制日志鎖。 |
(9)最后innbackupex和xtrabackup進程各自釋放資源,寫備份元數(shù)據(jù)信息等,innobackupex等xtrabackup子進程結(jié)束后退出。
注:
| percona Server 5.6+?支持一種新鎖——backup lock(備份鎖),這種鎖是percona對MySQL的補充,專門為備份而設(shè)計。這種鎖在percona Server 5.6+ 有,MariaDB中也有,但是Oracle的MySQL中沒有,至少MySQL 5.7中沒有。 這種鎖用在備份的時候替代?flush tables with read lock?獲取全局鎖,是一種輕量級的全局鎖。它有兩種類型的鎖:備份表鎖和二進制日志鎖。為此新增了3種語法:
備份表鎖在全局范圍內(nèi)只對非innodb表加鎖,所以持有該鎖后無法修改非innodb表,但卻不影響innodb表的DML。當(dāng)然,因為是全局鎖,所以也會阻塞DDL操作。 二進制日志鎖在全局范圍內(nèi)鎖定二進制日志,所以會阻塞其他會話修改二進制日志。這樣可以保證能夠獲取到二進制日志中一致性的位置坐標(biāo)。 |
全量備份:
備份開始時首先會開啟一個后臺檢測進程,實時檢測mysql redo的變化,一旦發(fā)現(xiàn)redo中有新的日志寫入,立刻將日志記入后臺日志文件xtrabackup_log中。之后復(fù)制innodb的數(shù)據(jù)文件和系統(tǒng)表空間文件ibdata1,待復(fù)制結(jié)束后,執(zhí)行flush tables with read lock操作,復(fù)制.frm,MYI,MYD,等文件(執(zhí)行flush tableswith read lock的目的是為了防止數(shù)據(jù)表發(fā)生DDL操作,并且在這一時刻獲得binlog的位置)最后會發(fā)出unlock tables,把表設(shè)置為可讀可寫狀態(tài),最終停止xtrabackup_log。?
增量備份:?
innobackupex增量備份過程中的"增量"處理,其實主要是相對innodb而言,對myisam和其他存儲引擎而言,它仍然是全拷貝(全備份)
"增量"備份的過程主要是通過拷貝innodb中有變更的"頁"(這些變更的數(shù)據(jù)頁指的是"頁"的LSN大于xtrabackup_checkpoints中給定的LSN)。增量備份是基于全備的,第一次增備的數(shù)據(jù)必須要基于上一次的全備,之后的每次增備都是基于上一次的增備,最終達到一致性的增備。增量備份的過程如下,和全備的過程很類似,區(qū)別僅在第2步。
全備恢復(fù)
這一階段會啟動xtrabackup內(nèi)嵌的innodb實例,回放xtrabackup日志xtrabackup_log,將提交的事務(wù)信息變更應(yīng)用到innodb數(shù)據(jù)/表空間,同時回滾未提交的事務(wù)(這一過程類似innodb的實例恢復(fù))。
備份的時候拷貝走的數(shù)據(jù)文件可能是不一致的,比如監(jiān)控著MySQL的redo log中在拷貝過程完成后又新的事務(wù)提交了,而拷貝走的數(shù)據(jù)是未提交狀態(tài)的,那么就需要對該事務(wù)前滾;如果監(jiān)控到的日志中有事務(wù)未提交,那么該事務(wù)就需要回滾。
但是如果只備份了myisam表或其他非事務(wù)表數(shù)據(jù),因為備份階段直接鎖定了這些表,所以不會有不一致的狀態(tài)。
xtrabackup有一個"準(zhǔn)備"的階段。這個階段的實質(zhì)就是對備份的innodb數(shù)據(jù)應(yīng)用redo log,該回滾的回滾,該前滾的前滾,最終保證xtrabackup_logfile中記錄的redo log已經(jīng)全部應(yīng)用到備份數(shù)據(jù)頁上,并且實現(xiàn)了一致性。當(dāng)應(yīng)用結(jié)束后,會重寫"xtrabackup_logfile"再次保證該redo log和備份的數(shù)據(jù)是對應(yīng)的
恢復(fù)過程如下圖:
增備恢復(fù)?
和全備恢復(fù)類似,也需要兩步,一是數(shù)據(jù)文件的恢復(fù),如圖4,這里的數(shù)據(jù)來源由3部分組成:全備份,增量備份和xtrabackup log。二是對未提交事務(wù)的回滾
-
四、xtrabackup的安裝部署以及備份恢復(fù)實現(xiàn)
-
1、xtrabackup的安裝
下載地址:https://www.percona.com/downloads/XtraBackup/LATEST/
可以選擇rpm包方式安裝,也可以下載源碼包編譯安裝,這里直接采用rpm包的方式進行安裝
[root@master tools]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm [root@master tools]# yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm [root@master ~]# rpm -qa |grep xtrabackup percona-xtrabackup-24-2.4.9-1.el7.x86_64Xtrabackup中主要包含兩個工具: xtrabackup:是用于熱備innodb,xtradb表中數(shù)據(jù)的工具,不能備份其他類型的表,也不能備份數(shù)據(jù)表結(jié)構(gòu); innobackupex:是將xtrabackup進行封裝的perl腳本,提供了備份myisam表的能力。 常用選項: --host 指定主機--user 指定用戶名--password 指定密碼--port 指定端口--databases 指定數(shù)據(jù)庫--incremental 創(chuàng)建增量備份--incremental-basedir 指定包含完全備份的目錄--incremental-dir 指定包含增量備份的目錄 --apply-log 對備份進行預(yù)處理操作 一般情況下,在備份完成后,數(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)。--redo-only 不回滾未提交事務(wù)--copy-back 恢復(fù)備份目錄裝完xtrabackup后,生成以下幾個工具 [root@localhost bin]# ./xb xbcloud xbcloud_osenv xbcrypt xbiff xbrlapi xbstreamxbcloud和xbcloud_osenv是xtrabackup新的高級特性:云備份; xbcrypt也是新的特性,加密備份集; xbstream是xtrabackup的流數(shù)據(jù)功能,通過流數(shù)據(jù)功能,可將備份內(nèi)容打包并傳給管道后的壓縮工具進行壓縮; xtrabackup是主程序; innobackupex在以前是一個perl腳本,會調(diào)用xtrabackup這個二進制工具,從xtrabackup 2.3開始,該工具使用C語言進行了重寫,當(dāng)前它是xtabackup二進制工具的一個軟連接,但是實際的使用方法卻不同,并且在以后的版本中會刪除該工具。使用innobackupex備份時,其會調(diào)用xtrabackup備份所有的InnoDB表,復(fù)制所有關(guān)于表結(jié)構(gòu)定義的相關(guān)文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關(guān)文件,同時還會備份觸發(fā)器和數(shù)據(jù)庫配置信息相關(guān)的文件,這些文件會被保存到一個以時間命名的目錄當(dāng)中。在備份的同時,innobackupex還會在備份目錄中創(chuàng)建如下文件:
(1)xtrabackup_checkpoints -- 備份類型(如完全或增量)、備份狀態(tài)(如是否已經(jīng)為prepared狀態(tài))和LSN(日志序列號)范圍信息:每個InnoDB頁(通常為16k大小) 都會包含一個日志序列號,即LSN,LSN是整個數(shù)據(jù)庫系統(tǒng)的系統(tǒng)版本號,每個頁面相關(guān)的LSN能夠表明此頁面最近是如何發(fā)生改變的。(2)xtrabackup_binlog_info -- mysql服務(wù)器當(dāng)前正在使用的二進制日志文件及備份這一刻位置二進制日志時間的位置。(3)xtrabackup_binlog_pos_innodb -- 二進制日志文件及用于InnoDB或XtraDB表的二進制日志文件的當(dāng)前position。(4)xtrabackup_binary -- 備份中用到的xtrabackup的可執(zhí)行文件;(5)backup-my.cnf -- 備份命令用到的配置選項信息:在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創(chuàng)建一個以時間命名的目錄:如此一來,innobackupex命令將會創(chuàng)建一個BACKUP-DIR目錄來存儲備份數(shù)據(jù)。如果要使用一個最小權(quán)限的用戶進行備份,則可基于如下命令創(chuàng)建此類用戶:如果要使用一個最小權(quán)限的用戶進行備份,則可基于如下命令創(chuàng)建此類用戶:
?
mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '123456'; #創(chuàng)建用戶 mysql> REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'bkpuser'; #回收此用戶所有權(quán)限 mysql> GRANT RELOAD,LOCK TABLES,RELICATION CLIENT ON *.* TO 'bkpuser'@'localhost'; #授權(quán)刷新、鎖定表、用戶查看服務(wù)器狀態(tài) mysql> FLUSH PRIVILEGES; #刷新授權(quán)表mysql> create user 'backup'@'%' identified by 'yayun'; Query OK, 0 rows affected (0.01 sec)mysql> grant reload,lock tables,replication client,create tablespace,super on *.* to 'backup'@'%'; Query OK, 0 rows affected (0.00 sec)mysql>?
注意:備份時需啟動MySQL,恢復(fù)時需關(guān)閉MySQL,清空mysql數(shù)據(jù)目錄且不能重新初始化,恢復(fù)數(shù)據(jù)后應(yīng)該立即進行一次完全備份
-
2、xtrabackup全量備份與恢復(fù)
?
(1)準(zhǔn)備(prepare)一個完全備份
一般情況下,在備份完成后,數(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)。
innobackupex命令的--apply-log選項可用于實現(xiàn)上述功能,如下面的命令:
# innobackupex --apply-log /path/to/BACKUP-DIR 如果執(zhí)行正確,其最后輸出的幾行信息通常如下:120407 09:01:04 innobackupex: completed OK!?在實現(xiàn)"準(zhǔn)備"的過程中,innobackupex通常還可以使用--user-memory選項來指定其可以使用的內(nèi)存的大小,默認為100M.如果有足夠的內(nèi)存空間可用,可以多劃分一些內(nèi)存給prepare的過程,以提高其完成備份的速度。
(2)從一個完全備份中恢復(fù)數(shù)據(jù)
注意:恢復(fù)不用啟動MySQL
innobackupex命令的--copy-back選項用于恢復(fù)操作,其通過復(fù)制所有數(shù)據(jù)相關(guān)的文件至mysql服務(wù)器DATADIR目錄中來執(zhí)行恢復(fù)過程。innobackupex通過backup-my.cnf來獲取DATADIR目錄的相關(guān)信息。
# innobackupex --copy-back /path/to/BACKUP-DIR當(dāng)數(shù)據(jù)恢復(fù)至DATADIR目錄以后,還需要確保所有的數(shù)據(jù)文件的屬主和屬組均為正確的用戶,如mysql,否則,在啟動mysqld之前還需要事先修改數(shù)據(jù)文件的屬主和屬組。如:
# chown -R mysql.mysql /mydata/data/(3)實戰(zhàn)練習(xí)
(1)全量備份 [root@master backups]# innobackupex --user=root --password=123456 --host=127.0.0.1 /backups/ #在master上進行全庫備份#語法解釋說明: #--user=root 指定備份用戶 #--password=123456 指定備份用戶密碼 #--host 指定主機 #/backups 指定備份目錄 [root@master backups]# ll total 0 drwxr-x--- 7 root root 232 Jul 30 11:01 2018-07-30_11-01-37 [root@master backups]# ll 2018-07-30_11-01-37/ #查看備份數(shù)據(jù) total 77856 -rw-r----- 1 root root 418 Jul 30 11:01 backup-my.cnf #備份用到的配置選項信息文件 -rw-r----- 1 root root 79691776 Jul 30 11:01 ibdata1 #數(shù)據(jù)文件 drwxr-x--- 2 root root 20 Jul 30 11:01 kim drwxr-x--- 2 root root 4096 Jul 30 11:01 mysql drwxr-x--- 2 root root 4096 Jul 30 11:01 performance_schema drwxr-x--- 2 root root 20 Jul 30 11:01 repppp drwxr-x--- 2 root root 4096 Jul 30 11:01 wordpress -rw-r----- 1 root root 21 Jul 30 11:01 xtrabackup_binlog_info #mysql服務(wù)器當(dāng)前正在使用的二進制日志文件和此時二進制日志時間的位置信息文件 -rw-r----- 1 root root 113 Jul 30 11:01 xtrabackup_checkpoints #備份的類型、狀態(tài)和LSN狀態(tài)信息文件 -rw-r----- 1 root root 482 Jul 30 11:01 xtrabackup_info -rw-r----- 1 root root 2560 Jul 30 11:01 xtrabackup_logfile #備份的日志文件(2)恢復(fù) [root@slave ~]# /etc/init.d/mysqld stop #停止slave上的mysql Shutting down MySQL.. SUCCESS! [root@slave tools]# yum install -y percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm #安裝xtrabackup [root@master backups]# scp -r 2018-07-30_11-01-37/ root@192.168.56.12:/backups/ #從master上拷貝備份數(shù)據(jù) [root@slave tools]# innobackupex --apply-log /backups/2018-07-30_11-01-37/ #合并數(shù)據(jù),使數(shù)據(jù)文件處于一致性的狀態(tài) 180729 23:18:23 innobackupex: Starting the apply-log operationIMPORTANT: Please check that the apply-log run completes successfully.At the end of a successful apply-log run innobackupexprints "completed OK!".innobackupex version 2.4.9 based on MySQL server 5.7.13 Linux (x86_64) (revision id: a467167cdd4) xtrabackup: cd to /backups/2018-07-30_11-01-37/ xtrabackup: This target seems to be not prepared yet. InnoDB: Number of pools: 1 xtrabackup: xtrabackup_logfile detected: size=8388608, start_lsn=(3127097) ...... InnoDB: FTS optimize thread exiting. InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 3129915 180729 23:18:30 completed OK! [root@slave ~]# rm -rf /usr/local/mysql/data/ #在slave上刪除原有的數(shù)據(jù) [root@slave ~]# vim /etc/my.cnf #配置my.cnf的數(shù)據(jù)目錄路徑,否則會報錯,要和master一致 datadir=/usr/local/mysql/data [root@slave ~]# innobackupex --copy-back /backups/2018-07-30_11-01-37/ #在slave上數(shù)據(jù)恢復(fù) 180729 23:32:03 innobackupex: Starting the copy-back operationIMPORTANT: Please check that the copy-back run completes successfully.At the end of a successful copy-back run innobackupexprints "completed OK!". ...... 180729 23:32:08 completed OK! #看到completed OK就是恢復(fù)正常了 [root@slave ~]# ll /usr/local/mysql/data/ #slave上查看數(shù)據(jù)目錄,可以看到數(shù)據(jù)已經(jīng)恢復(fù),但是屬主會有問題,需要進行修改,所以一般使用mysql的運行用戶進行恢復(fù),否則需要進行修改屬主和屬組信息 total 188432 -rw-r----- 1 root root 79691776 Jul 29 23:32 ibdata1 -rw-r----- 1 root root 50331648 Jul 29 23:32 ib_logfile0 -rw-r----- 1 root root 50331648 Jul 29 23:32 ib_logfile1 -rw-r----- 1 root root 12582912 Jul 29 23:32 ibtmp1 drwxr-x--- 2 root root 20 Jul 29 23:32 kim drwxr-x--- 2 root root 4096 Jul 29 23:32 mysql drwxr-x--- 2 root root 4096 Jul 29 23:32 performance_schema drwxr-x--- 2 root root 20 Jul 29 23:32 repppp drwxr-x--- 2 root root 4096 Jul 29 23:32 wordpress -rw-r----- 1 root root 482 Jul 29 23:32 xtrabackup_info [root@slave ~]# chown -R mysql.mysql /usr/local/mysql/data/ #修改屬主屬組 [root@slave ~]# /etc/init.d/mysqld start #啟動mysql Starting MySQL. SUCCESS! [root@slave ~]# mysql -uroot -p -e "show databases;" #查看數(shù)據(jù),是否恢復(fù) Enter password: +--------------------+ | Database | +--------------------+ | information_schema | | kim | | mysql | | performance_schema | | repppp | | wordpress | +--------------------+總結(jié)全庫備份與恢復(fù)三步曲:
a. innobackupex全量備份,并指定備份目錄路徑;
b. 在恢復(fù)前,需要使用--apply-log參數(shù)先進行合并數(shù)據(jù)文件,確保數(shù)據(jù)的一致性要求;
c. 恢復(fù)時,直接使用--copy-back參數(shù)進行恢復(fù),需要注意的是,在my.cnf中要指定數(shù)據(jù)文件目錄的路徑。
-
3、xtrabackup增量備份與恢復(fù)
使用innobackupex進行增量備份,每個InnoDB的頁面都會包含一個LSN信息,每當(dāng)相關(guān)的數(shù)據(jù)發(fā)生改變,相關(guān)的頁面的LSN就會自動增長。這正是InnoDB表可以進行增量備份的基礎(chǔ),即innobackupex通過備份上次完全備份之后發(fā)生改變的頁面來實現(xiàn)。在進行增量備份時,首先要進行一次全量備份,第一次增量備份是基于全備的,之后的增量備份都是基于上一次的增量備份的,以此類推。
要實現(xiàn)第一次增量備份,可以使用下面的命令進行:
基于全量備份的增量備份與恢復(fù) 做一次增量備份(基于當(dāng)前最新的全量備份) innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --incremental /backups/ --incremental-basedir=/backups/2018-07-30_11-01-37 1. 準(zhǔn)備基于全量 innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --apply-log --redo-only /backups/2018-07-30_11-01-37 2. 準(zhǔn)備基于增量 innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --apply-log --redo-only /backups/2018-07-30_11-01-37 --incremental-dir=/backups/2018-07-30_13-51-47/ 3. 恢復(fù) innobackupex --copy-back --defaults-file=/etc/my.cnf /opt/2017-01-05_11-04-55/ 解釋: 1. 2018-07-30_11-01-37指的是完全備份所在的目錄。 2. 2018-07-30_13-51-47指定是第一次基于2018-07-30_11-01-37增量備份的目錄,其他類似以此類推,即如果有多次增量備份。每一次都要執(zhí)行如上操作。需要注意的是,增量備份僅能應(yīng)用于InnoDB或XtraDB表,對于MyISAM表而言,執(zhí)行增量備份時其實進行的是完全備份。
"準(zhǔn)備"(prepare)增量備份與整理完全備份有著一些不同,尤其要注意的是:
①需要在每個備份 (包括完全和各個增量備份)上,將已經(jīng)提交的事務(wù)進行"重放"。"重放"之后,所有的備份數(shù)據(jù)將合并到完全備份上。
②基于所有的備份將未提交的事務(wù)進行"回滾"
(1)增量備份演示
[root@master backups]# innobackupex --user=root --password=123456 --host=127.0.0.1 /backups/ #全備數(shù)據(jù) [root@master ~]# mysql -uroot -p #在master上創(chuàng)建student庫并創(chuàng)建testtb表插入若干數(shù)據(jù) Enter password: mysql> create database student; Query OK, 1 row affected (0.03 sec)mysql> use student; Database changed mysql> create table testtb(id int); Query OK, 0 rows affected (0.07 sec)mysql> insert into testtb values(1),(10),(99); Query OK, 3 rows affected (0.04 sec) Records: 3 Duplicates: 0 Warnings: 0mysql> select * from testtb; +------+ | id | +------+ | 1 | | 10 | | 99 | +------+ 3 rows in set (0.00 sec)mysql> quit; Bye#使用innobackupex進行增量備份 [root@master backups]# innobackupex --user=root --password=123456 --host=127.0.0.1 --incremental /backups/ --incremental-basedir=/backups/2018-07-30_11-01-37/ ...... 180730 13:51:50 Executing UNLOCK TABLES 180730 13:51:50 All tables unlocked 180730 13:51:50 Backup created in directory '/backups/2018-07-30_13-51-47/' MySQL binlog position: filename 'mysql-bin.000005', position '664' 180730 13:51:50 [00] Writing /backups/2018-07-30_13-51-47/backup-my.cnf 180730 13:51:50 [00] ...done 180730 13:51:50 [00] Writing /backups/2018-07-30_13-51-47/xtrabackup_info 180730 13:51:50 [00] ...done xtrabackup: Transaction log of lsn (3158741) to (3158741) was copied. 180730 13:51:50 completed OK! [root@master backups]# ll #查看備份數(shù)據(jù) total 0 drwxr-x--- 7 root root 232 Jul 30 11:01 2018-07-30_11-01-37 #全量備份數(shù)據(jù)目錄 drwxr-x--- 8 root root 273 Jul 30 13:51 2018-07-30_13-51-47 #增量備份數(shù)據(jù)目錄 [root@master 2018-07-30_11-01-37]# cat xtrabackup_checkpoints #查看全量備份的xtrabackup_checkpoints backup_type = full-backuped #備份類型為全量備份 from_lsn = 0 #lsn從0開始 to_lsn = 3127097 #lsn到3127097結(jié)束 last_lsn = 3127097 compact = 0 recover_binlog_info = 0[root@master 2018-07-30_13-51-47]# cat xtrabackup_checkpoints #查看增量備份的xtrabackup_checkpoints backup_type = incremental #備份類型為增量備份 from_lsn = 3127097 #lsn從3127097開始 to_lsn = 3158741 #lsn到啊3158741結(jié)束 last_lsn = 3158741 compact = 0 recover_binlog_info = 0(2)增量備份后數(shù)據(jù)恢復(fù)演示
(1)模擬mysql故障,刪除數(shù)據(jù)目錄所有數(shù)據(jù) [root@master ~]# /etc/init.d/mysqld stop #模擬mysql故障,停止mysql Shutting down MySQL.. SUCCESS! [root@master ~]# rm -rf /usr/local/mysql/data/* #刪除數(shù)據(jù)目錄中的所有數(shù)據(jù)(2)合并全備數(shù)據(jù)目錄,確保數(shù)據(jù)的一致性 [root@master ~]# innobackupex --apply-log --redo-only /backups/2018-07-30_11-01-37/ 180730 14:05:27 innobackupex: Starting the apply-log operationIMPORTANT: Please check that the apply-log run completes successfully.At the end of a successful apply-log run innobackupexprints "completed OK!".innobackupex version 2.4.9 based on MySQL server 5.7.13 Linux (x86_64) (revision id: a467167cdd4) xtrabackup: cd to /backups/2018-07-30_11-01-37/ ...... ...... xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 3127106 InnoDB: Number of pools: 1 180730 14:05:29 completed OK!(3)將增量備份數(shù)據(jù)合并到全備數(shù)據(jù)目錄當(dāng)中 [root@master ~]# innobackupex --apply-log --redo-only /backups/2018-07-30_11-01-37/ --incremental-dir=/backups/2018-07-30_13-51-47/ 180730 14:06:42 innobackupex: Starting the apply-log operationIMPORTANT: Please check that the apply-log run completes successfully.At the end of a successful apply-log run innobackupexprints "completed OK!". ...... ...... 180730 14:06:44 [00] ...done 180730 14:06:44 completed OK! [root@master ~]# cat /backups/2018-07-30_11-01-37/xtrabackup_checkpoints backup_type = log-applied #查看到數(shù)據(jù)備份類型是增加 from_lsn = 0 #lsn從0開始 to_lsn = 3158741 #lsn結(jié)束號為最新的lsn last_lsn = 3158741 compact = 0 recover_binlog_info = 0(4)恢復(fù)數(shù)據(jù) [root@master ~]# innobackupex --copy-back /backups/2018-07-30_11-01-37/ 180730 14:07:51 innobackupex: Starting the copy-back operationIMPORTANT: Please check that the copy-back run completes successfully.At the end of a successful copy-back run innobackupexprints "completed OK!". ....... ....... 180730 14:08:17 [01] ...done 180730 14:08:17 completed OK! [root@master ~]# ll /usr/local/mysql/data/ total 77844 -rw-r----- 1 root root 79691776 Jul 30 14:08 ibdata1 drwxr-x--- 2 root root 20 Jul 30 14:08 kim drwxr-x--- 2 root root 4096 Jul 30 14:08 mysql drwxr-x--- 2 root root 4096 Jul 30 14:08 performance_schema drwxr-x--- 2 root root 20 Jul 30 14:08 repppp drwxr-x--- 2 root root 56 Jul 30 14:08 student drwxr-x--- 2 root root 4096 Jul 30 14:08 wordpress -rw-r----- 1 root root 21 Jul 30 14:08 xtrabackup_binlog_pos_innodb -rw-r----- 1 root root 554 Jul 30 14:08 xtrabackup_info [root@master ~]# chown -R mysql.mysql /usr/local/mysql/data #更改數(shù)據(jù)的屬主屬組 [root@master ~]# /etc/init.d/mysqld start #啟動mysql Starting MySQL.Logging to '/usr/local/mysql/data/master.err'. .. SUCCESS! [root@master ~]# mysql -uroot -p -e "show databases;" #查看數(shù)據(jù)是否恢復(fù) Enter password: +--------------------+ | Database | +--------------------+ | information_schema | | kim | | mysql | | performance_schema | | repppp | | student | | wordpress | +--------------------+?
總結(jié):
(1)增量備份需要使用參數(shù)--incremental指定需要備份到哪個目錄,使用incremental-dir指定全備目錄;
(2)進行數(shù)據(jù)備份時,需要使用參數(shù)--apply-log redo-only先合并全備數(shù)據(jù)目錄數(shù)據(jù),確保全備數(shù)據(jù)目錄數(shù)據(jù)的一致性;
(3)再將增量備份數(shù)據(jù)使用參數(shù)--incremental-dir合并到全備數(shù)據(jù)當(dāng)中;
(4)最后通過最后的全備數(shù)據(jù)進行恢復(fù)數(shù)據(jù),注意,如果有多個增量備份,需要逐一合并到全備數(shù)據(jù)當(dāng)中,再進行恢復(fù)。
增量備份的恢復(fù)大體為3個步驟
*恢復(fù)完全備份
*恢復(fù)增量備份到完全備份(開始恢復(fù)的增量備份要添加--redo-only參數(shù),到最后一次增量備份去掉--redo-only參數(shù))
*對整體的完全備份進行恢復(fù),回滾那些未提交的數(shù)據(jù)
| # 使用tar流 innobackupex --user=root --password=123456 --stream=tar /bakdir/ >/tmp/a.tar # 使用tar流的同時交給gzip壓縮 innobackupex --user=root --password=123456 --stream=tar /bakdir/ | gzip >/tmp/a.tar.gz # 使用tar流備份到遠程主機中并歸檔 innobackupex --user=root --password=123456 --stream=tar /bakdir/ | ssh root@192.168.100.10 "cat - > /tmp/`date +%F_%H-%M-%S`.tar" # 使用tar流備份到原遠程主機中并解包 innobackupex --user=root --password=123456 --stream=tar /bakdir/ | ssh root@192.168.100.10 "cat - | tar -x -C /tmp/"# 使用xtrabackup自帶的xbstream流 innobackupex --user=root --password=123456 --stream=xbstream /bakdir/ >/tmp/b.xbs # 解壓xbstream流 innobackupex --user=root --password=123456 --stream=xbstream /bakdir/ | ssh root@192.168.100.10 "cat - | xbstream -x -C /tmp/" # 使用xbstream流的同時進行壓縮,使用"--compress"選項 innobackupex --user=root --password=123456 --stream=xbstream --compress /bakdir/ > /bakdir/backup.xbs |
總結(jié)
以上是生活随笔為你收集整理的Xtrabackup备份与恢复的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: percona-toolkit--pt-
- 下一篇: 第一个Scala程序——Hello Wo