上篇文章介紹了一下MySQL數據庫邏輯備份第一部分mysqldump的使用,本篇文章將繼續介紹MySQL數據庫邏輯備份第二部分Xtrabackup工具的操做過程!
一、Xtrabackup介紹
Xtrabackup是有Percona公司發行的一款數據庫物理備份工具,能夠對InnoDB存儲引擎的表實如今線熱備,同時能夠對數據庫進行全備和增量備份以及增量恢復。mysql
二、下載及安裝
(1)下載地址:https://www.percona.com/downl... ,根據自身的操做系統選擇版本,版本若是不對應,會安裝失敗,本人使用的是CentOS6.9_X64的操做系統,下載的版本爲:percona-xtrabackup-24-2.4.8-1.el6.x86_64.rpm
(2)安裝依賴庫perl-DBD-MySQL,若是已經安裝,直接進入下一步sql
#查看是否安裝 [root@WB-BLOG ~]# rpm -qa | grep perl-DBD-MySQL #若是沒有安裝,使用下面的命令安裝perl-DBD-MySQL [root@WB-BLOG ~]# yum install -y per-DBD-MySQL
(3)安裝libev依賴庫
a、下載地址:在 http://rpmfind.net/ 直接搜索libev,而後選擇和本身操做系統對應的rpm安裝包
b、注意:此處也須要注意版本,不然會安裝失敗,本人用的是CentOS6.9_X64的操做系統,下載的rpm安裝包版本爲:libev-4.04-2.el6.x86_64.rpm
c、安裝:數據庫
[root@WB-BLOG ~]# rpm -ivh libev-4.04-2.el6.x86_64.rpm
(4)安裝perl-Digest-MD5依賴庫,不然在備份過程當中會出現錯誤服務器
[root@WB-BLOG ~]# yum -y install perl-Digest-MD5
(5)安裝Xtrabackupapp
[root@WB-BLOG ~]# rpm -ivh percona-xtrabackup-24-2.4.8-1.el6.x86_64.rpm
三、使用方法
語法:innobackupex [OPTIONS] /path
經常使用參數OPTIONS說明:socket
---------------------------------------基本備份參數--------------------------------- --user:指定執行備份操做的用戶名 --password:指定執行備份操做的用戶密碼 --host:指定數據庫所在服務器的域名或者IP地址 --port:指定實例端口 --socket:指定socket文件,以便備份進程登錄mysql --databases:指定要備份的數據庫,若是須要備份多個數據庫,多個數據庫之間使用空格隔開,如:--databases="test1 test2" --include:指定要備份的數據庫,能夠指定多個庫"db1.*|db2.*" 還能夠指定要備份的表,能夠指定多個表"db1.table01|db1.table02|db2.test" --defaults-file:指定數據庫實例的配置文件my.cnf。注:若是用該參數,必須放在第一個參數位置,不然會提示錯誤 --apply-log:經過回滾未提交的事務及同步已經提交的事務至數據文件來保證數據文件處於一致性狀態 --redo-only:用來保證全備和增量備份的數據文件在恢復前必須先將在重作日誌文件中的已提交的事務重作,該參數將會合並全備和增量備份的數據文件,但不包括最後一次增量備份的數據文件 --copy-back:指定操做爲數據的恢復,若是不是全備,不可用這個選項,這個選項用於全備的恢復 --slave-info:在主從庫備份中使用,用來備份從庫的"show slave status"信息 --stream:指定備份文件的輸入格式,如:tar --tmpdir:若是使用stream=tar的時候備份,xtrabackup_logfile可能會放在臨時目錄/tmp下,若是此時數據庫中數據寫入量特別大的時候,這個文件會特別大,可能會將/tmp目錄佔滿,使用這個參數能夠指定tmp目錄 --no-timestamp:該選項後面不用加值,用來指定備份的時候不適用默認的日期目錄,而是使用指定好的目錄 ---------------------------------------增量備份參數--------------------------------- --incremental:指定操做爲增量備份操做 --incremental-basedir:指定本次的增量備份是相對於以前的哪一次備份,指定以前備份數據的目錄 --incremental-dir:指定增量備份恢復時,增量備份的目錄
其餘更多參數,可使用"innobackupex --help"命令查看。工具
四、備份及恢復示例
示例1:全量備份127.0.0.1上3306實例中的全部數據,備份到/backup目錄下,而後模擬數據丟失恢復
備份:操作系統
[root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --port=3306 --socket=/tmp/mysql.sock /backup/ #上述命令執行完成以後,打印completed ok.而後查看是否備份成功,很重要 [root@WB-BLOG ~]# ls /backup/
恢復:.net
#模擬故障,刪除數據目錄 [root@WB-BLOG ~]# rm -rf /mnt/mydata/data/* #殺掉mysql的服務進程 [root@WB-BLOG ~]# killall mysqld #應用log日誌,目的是爲了回滾未提交的事務及同步已經提交的事務至數據目錄,保證數據的一致性 [root@WB-BLOG ~]# innobackupex --apply-log /backup/2018-05-29_10-27-53/ #恢復數據,指定配置文件,xtrabackup會將數據文件拷貝到原來的數據目錄中 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/2018-05-29_10-27-53/ #拷貝完成以後,權限會有問題,須要從新受權 [root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/ #從新啓動數據庫來驗證是否恢復正常 [root@WB-BLOG ~]# service mysqld start
示例2:全量備份127.0.0.1服務器上3306實例的全部數據,並備份到目錄/backup/20180619目錄下,而後恢復
備份:rest
[root@WB-BLOG ~]# mkdir -pv /backup/20180619 [root@WB-BLOG ~]# innobackupex --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --no-timestamp /backup/20180619/ [root@WB-BLOG ~]# ls /backup/20180619/
恢復,處理過程和示例1相同,再也不解釋:
[root@WB-BLOG ~]# rm -rf /mnt/mydata/data/* [root@WB-BLOG ~]# killall mysqld [root@WB-BLOG ~]# innobackupex --apply-log /backup/20180619/ [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/20180619/ [root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/ [root@WB-BLOG ~]# service mysqld start
示例3:備份127.0.0.1服務器上3306實例中的test1和test2數據庫,並備份到/backup/part_db/目錄下,而後恢復
備份:
[root@WB-BLOG ~]# mkdir -pv /backup/part_db [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --databases="test1 test2" --no-timestamp /backup/part_db/ [root@WB-BLOG ~]# ls /backup/part_db/
恢復:
#模擬數據庫丟失 [root@WB-BLOG ~]# mysql -uroot -proot -h127.0.0.1 -P3306 -e "drop database test1" [root@WB-BLOG ~]# mysql -uroot -proot -h127.0.0.1 -P3306 -e "drop database test2" #應用log日誌,使未提交的事務回滾,已經提交的數據同步到數據目錄中 [root@WB-BLOG ~]# innobackupex --apply-log /backup/part_db/ #因爲是部分數據庫的恢復,因此不能使用--copy-back選項,因此須要使用拷貝的方法 [root@WB-BLOG ~]# cp -r /backup/part_db/test{1,2}/ /mnt/mydata/data/ #受權 [root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/test{1,2} #重啓數據庫 [root@WB-BLOG ~]# servie mysqld restart
示例4:增量備份127.0.0.1服務器上3306實例中的全部庫,第一次增量備份到目錄/backup/increment01,第二次增量備份到目錄/backup/increment02,全量備份到/backup/allback而後恢復
備份:
#建立全量備份和增量備份目錄 [root@WB-BLOG ~]# mkdir -pv /backup/allback [root@WB-BLOG ~]# mkdir -pv /backup/increment{01,02} #完成一次全量備份 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --no-timestamp /backup/allback/ #完成第一次增量備份,此時可能會有新數據寫入 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --no-timestamp --incremental-basedir=/backup/allback/ --incremental /backup/increment01/ #完成第二次全量備份,此時可能會有新數據寫入 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --no-timestamp --incremental-basedir=/backup/increment01/ --incremental /backup/increment02/ #查看兩次備份的數據目錄是否正常 [root@WB-BLOG ~]# ls /backup/increment0{1,2}
恢復:
#模擬數據丟失 [root@WB-BLOG ~]# rm -rf /mnt/mydata/data/* [root@WB-BLOG ~]# killall mysqld #完成全備的log日誌應用 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --incremental --apply-log --redo-only /backup/allback/ #完成第一次增量中log日誌的應用 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --incremental --apply-log --redo-only /backup/allback/ --incremental-dir=/backup/increment01/ #完成第二次增量中log日誌的應用 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --incremental --apply-log --redo-only /backup/allback/ --incremental-dir=/backup/increment02/ #兩次增量都合併到全量中以後,再應用全量中的log日誌 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --apply-log /backup/allback/ #最後全量恢復全備文件夾中的數據 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back /backup/allback/ #從新受權 [root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/ #而後啓動數據庫服務,而後驗證數據是否正確 [root@WB-BLOG ~]# service mysqld start
示例5:壓縮備份127.0.0.1服務器上的3306實例中的test1庫到/backup/test1_data,而後恢復
備份:
#建立備份目錄 [root@WB-BLOG ~]# mkdir -pv /backup/test1_data #壓縮備份 [root@WB-BLOG ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --host=127.0.0.1 --port=3306 --socket=/tmp/mysql.sock --compress --no-timestamp --databases="test1" /backup/test1_data/
恢復:
#模擬刪掉數據庫test1 [root@WB-BLOG ~]# mysql -uroot -proot -h127.0.0.1 -P3306 -e "drop database test1" #恢復,首先解壓縮 [root@WB-BLOG ~]# innobackupex --decompress /backup/test1_data/ #注意:若是提示以下錯誤,則須要安裝qpress工具,下載地址:ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/AndreasStieger:/branches:/Archiving/CentOS_CentOS-6/x86_64/qpress-1.1-8.3.x86_64.rpm,使用rpm命令安裝 innobackupex version 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 97330f7) 180529 12:29:01 [01] decompressing ./ibdata1.qp sh: qpress: command not found cat: write error: Broken pipe Error: thread 0 failed. [root@WB-BLOG ~]# innobackupex --apply-log /backup/test1_data #拷貝備份數據 [root@WB-BLOG ~]# cp -r /backup/test1_data/test1/ /mnt/mydata/data/ [root@WB-BLOG ~]# chown -R mysql:mysql /mnt/mydata/data/test1/ #重啓數據庫而後驗證數據是否正確 [root@WB-BLOG ~]# service mysqld restart
至此,Xtrabackup物理備份工具介紹完畢,常見的用法能夠參考上述的示例。另外,該工具還有其餘高級用法,使用較少,此處暫未介紹。下篇文章將介紹MySQL的另一種物理備份方式:基於LVM的邏輯卷備份。歡迎評論轉發!
後續文章將更新在我的小站上,歡迎查看。