MySQL備份工具XtraBackup的使用node
xtrabackup簡介mysql
Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上唯一一款開源的可以對innodb和xtradb數據庫進行熱備的工具。特色:sql
(1)備份過程快速、可靠;數據庫
(2)備份過程不會打斷正在執行的事務;服務器
(3)可以基於壓縮等功能節約磁盤空間和流量;網絡
(4)自動實現備份檢驗;app
(5)還原速度快;ide
官方下載地址:地址,你能夠經過此連接下載最新版。工具
# yum install ./percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm 使用yum的本地安裝方式解決其依賴關係 |
xtrabackup包含兩個主要的工具,即xtrabackup和innobackupex,兩者區別以下:
(1)xtrabackup只能備份innodb和xtradb兩種引擎的表,而不能備份myisam引擎的表;
(2)innobackupex是一個封裝了xtrabackup的Perl腳本,支持同時備份innodb和myisam,但在對myisam備份時須要加一個全局的讀鎖。還有就是myisam不支持增量備份。
權衡二者區別,建議使用innobackupex工具進行備份。
備份恢復過程
全量備份
其備份過程以下圖所示(該圖來源於網絡):
備份開始時首先會開啓一個後臺檢測進程,實時檢測mysql redo的變化,一旦發現redo中有新的日誌寫入,馬上將日誌記入後臺日誌文件xtrabackup_log中。以後複製innodb的數據文件和系統表空間文件ibdata1,待複製結束後,執行flush tables with read lock操做,複製.frm,MYI,MYD,等文件(執行flush tableswith read lock的目的是爲了防止數據表發生DDL操做,而且在這一時刻得到binlog的位置)最後會發出unlock tables,把表設置爲可讀可寫狀態,最終中止xtrabackup_log。
全備恢復
這一階段會啓動xtrabackup內嵌的innodb實例,回放xtrabackup日誌xtrabackup_log,將提交的事務信息變動應用到innodb數據/表空間,同時回滾未提交的事務(這一過程相似innodb的實例恢復)。恢復過程以下圖:
增量備份
innobackupex增量備份過程當中的"增量"處理,其實主要是相對innodb而言,對myisam和其餘存儲引擎而言,它仍然是全拷貝(全備份)。
"增量"備份的過程主要是經過拷貝innodb中有變動的"頁"(這些變動的數據頁指的是"頁"的LSN大於xtrabackup_checkpoints中給定的LSN)。增量備份是基於全備的,第一次增備的數據必需要基於上一次的全備,以後的每次增備都是基於上一次的增備,最終達到一致性的增備。增量備份的過程以下,和全備的過程很相似,區別僅在第2步。
增備恢復
和全備恢復相似,也須要兩步,一是數據文件的恢復,以下第一幅圖,這裏的數據來源由3部分組成:全備份,增量備份和xtrabackup log。二是對未提交事務的回滾,以下第二幅圖所示:
XtraBackup使用示例
建立備份用戶
若是要使用一個最小權限的用戶進行備份,則可基於以下命令建立此類用戶:
MariaDB [(none)]> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkppass'; MariaDB [(none)]> GRANT RELOAD,PROCESS,LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost'; MariaDB [(none)]> FLUSH PRIVILEGES; |
#建立一個測試數據庫並添加內容 [root@node1 ~]# mysql -p <test.sql test.sql腳本以下: [root@node1 ~]# cat test.sql create database zachary; create table zachary.test( id int primary key, name varchar(20)); insert into zachary.test(id,name) values(1,'yangzhiheng'); 建立一個備份目錄 [root@node1 ~]# mkdir /backup |
建立一個全量備份:
[root@node1 ~]# innobackupex --user=bkpuser --password=bkppass /backup |
出現上圖字樣表示備份完成。使用innobakupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至備份目錄下一個以當前時間戳時間的目錄中。
在備份的同時,innobackupex還會在備份目錄中建立以下文件:
(1)xtrabackup_checkpoints 備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;
每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的。
(2)xtrabackup_binlog_info mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。
(3)xtrabackup_binlog_pos_innodb 二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。
(4)xtrabackup_binary 備份中用到的xtrabackup的可執行文件;
(5)backup-my.cnf 備份命令用到的配置選項信息;
在使用innobackupex進行備份時,還可使用--no-timestamp選項來阻止命令自動建立一個以時間命名的目錄;如此一來,innobackupex命令將會建立一個BACKUP-DIR目錄來存儲備份數據。
Prepare一個徹底備份
通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
使用—apply-log選項能夠實現上述功能,以下所示:
[root@node1 ~]# innobackupex --apply-log /backup/2017-11-27_04-40-55 |
當出現complete OK字樣表示prepare完成。
從一個全量備份中恢復數據
注意:恢復時不用啓動MySQL,其數據目錄爲空目錄
innobackupex命令的--copy-back選項用於執行恢復操做,其經過複製全部數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex經過backup-my.cnf來獲取DATADIR目錄的相關信息。
爲了實驗效果更加明顯,我把該備份恢復至另外一臺服務器。
[root@node1 ~]# scp -r /backup/2017-11-27_04-40-55 node3: [root@node3 ~]# yum install mariadb-server [root@node3 ~]# rm -rf /var/lib/mysql/* [root@node3 ~]# innobackupex --copy-back 2017-11-27_04-40-55/ |
請確保如上信息的最行一行出現「innobackupex: completed OK!」。
當數據恢復至DATADIR目錄之後,還須要確保全部數據文件的屬主和屬組均爲正確的用戶,如mysql,不然,在啓動mysqld以前還須要事先修改數據文件的屬主和屬組。如:
[root@node3 ~]# chown -R mysql.mysql /var/lib/mysql/* |
啓動服務,驗證數據是否恢復:
[root@node3 ~]# systemctl start mariadb [root@node3 ~]# mysql –p MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | zachary | +--------------------+ 4 rows in set (0.02 sec) MariaDB [(none)]> select * from zachary.test; +----+-------------+ | id | name | +----+-------------+ | 1 | yangzhiheng | +----+-------------+ 1 row in set (0.01 sec) |
數據已恢復
使用XtraBackup進行增量備份
每一個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增加。這正是InnoDB表能夠進行增量備份的基礎,即innobackupex經過備份上次徹底備份以後發生改變的頁面來實現。
準備一個數據變化
[root@node1 ~]# mysql -p < test2.sql [root@node1 ~]# cat test2.sql insert into zachary.test(id,name) values(2,'zachary'); insert into zachary.test(id,name) values(3,'tom'); insert into zachary.test(id,name) values(4,'jarry'); |
備份:
[root@node1 ~]# innobackupex --user=bkpuser --password=bkppass --incremental /backup --incremental-basedir=/backup/2017-11-27_04-40-55/ |
其中,--incremental-basedir參數指的是徹底備份所在的目錄,此命令執行結束後,innobackupex命令會在/backup目錄中建立一個新的以時間命名的目錄以存放全部的增量備份數據。另外,在執行過增量備份以後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。
須要注意的是,前文已講述過,增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是徹底備份。
Prepare一個增量備份
「準備」(prepare)增量備份與整理徹底備份有着一些不一樣,尤爲要注意的是:
(1)須要在每一個備份(包括徹底和各個增量備份)上,將已經提交的事務進行「重放」。「重放」以後,全部的備份數據將合併到徹底備份上。
(2)基於全部的備份將未提交的事務進行「回滾」。
因而,操做就變成了:
[root@node1 ~]# innobackupex --apply-log --redo-only /backup/2017-11-27_04-40-55/ |
接着執行:
[root@node1 ~]# innobackupex --apply-log --redo-only /backup/2017-11-27_04-40-55/ --incremental-dir=/backup/2017-11-27_05-23-52 |
若是後面有其餘增量的話,能夠按時間順序執行其餘增量操做
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2 |
其中BASE-DIR指的是徹底備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即若是有屢次增量備份,每一次都要執行如上操做
Prepare以後按照以前全量備份恢復所使用的操做來進行恢復,這裏再也不詳述。
本篇文章還未寫完,後期會補上。