XtraBackup是Percona公司開發的一款免費開源的MySQL備份工具。與上一篇介紹的mysqldump不一樣,XtraBackup能夠對MySQL進行物理備份(備份的是MySQL的文件而不是生成sql文件),且XtraBackup能夠對MySQL進行在線備份。html
要安裝XtraBackup,能夠在Percona公司的官網上下載CentOS的RPM安裝包,也可使用Percona提供的YUM源。這裏介紹經過YUM進行安裝的方法。mysql
首先在https://www.percona.com/downloads/percona-release/redhat/上下載Percona提供的YUM的RPM包,而後安裝該RPM包便可使用Percona的YUM源,經過該YUM源能夠安裝全部的Percona產品。sql
經過如下命令查看能夠安裝的XtraBackup版本:shell
[root@localhost ~]# yum list percona-xtrabackup*
這裏選擇2.4的版本進行安裝:數據庫
[root@localhost ~]# yum install percona-xtrabackup-24.x86_64
使用XtraBackup進行備份時,主要使用如下兩個工具:app
xtrabackup工具只能備份InnoDB和XtraDB兩種引擎的數據庫,並且只備份idb文件不備份frm文件;同時,xtrabackup不能備份表結構和觸發器等。socket
innobackupex是使用Perl腳本對xtrabackup進行的封裝和功能擴展。innobackupex能夠備份和恢復MyISAM、InnoDB和XtraDB引擎的表和frm文件,因此一般使用innobackupex來備份MySQL。工具
這兩個工具都是根據MySQL配置文件my.cnf來獲取備份文件的,同時須要鏈接到數據庫和數據存儲目錄的操做權限。優化
注意:innobackupex在備份使用MyISAM的數據庫時,會對全庫進行加鎖操做,阻塞寫操做,若備份是在從庫上進行的話會影響主從複製,產生延遲。而對於使用InnoDB的數據庫,則不會阻塞讀寫。spa
XtraBackup首先執行flush tables with read lock生成鎖以阻止新的寫入,而後將表中的數據刷新使其所有保存到硬盤上,接着開始複製文件,文件複製完成後釋放鎖。
XtraBackup在開始備份時會記住log sequence number(LSN),而後開始複製文件。同時,XtraBackup會啓動一個後臺進程用於監視事務日誌,並從事務日誌中複製最新的修改,該操做是持續進行的。因此XtraBackup在備份InnoDB時不會產生阻塞。
XtraBackup使用事務日誌對備份的數據進行前滾和回滾操做,以保證這些數據與備份結束時的數據庫狀態一致。
XtraBackup在準備階段完成後,便可使用準備好的數據對InnoDB進行恢復。
innobackupex的命令語法以下:
innobackupex --選項
經常使用選線:
在使用XtraBackup進行備份時,建議建立一個僅用於執行備份的MySQL用戶,只授予如下權限:
reload,lock tables,replication client,create tablespace,super,process
這裏使用一個例子來演示如何使用innobackupex對MySQL進行徹底備份。
實驗環境:
運行如下命令進行備份:
[root@localhost full]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock /data/backup/full
innobackupex會在指定的備份目錄下產生一個以時間戳命名的目錄並將備份的數據存儲在該目錄中。在該目錄中除了備份的MySQL數據庫文件,還有如下幾個文件:
backup-my.cnf # 備份用到的配置選項信息 xtrabackup_checkpoints # 記錄備份的類型、起始LSN和結束LSN等信息 xtrabackup_info # 記錄備份過程當中的各類詳細信息 xtrabackup_logfile # 事務日誌文件,用於在恢復過程當中的準備階段對備份的數據進行前滾和回滾操做
這裏經過將上面備份的數據進行恢復來介紹如何進行徹底備份的恢復。
該階段僅對使用InnoDB引擎的MySQL有意義。在該階段中將調用xtrabackup_logfile對備份的數據進行前滾和回滾操做。使用如下命令執行prepare:
[root@localhost full]# innobackupex --apply-log /data/backup/full/2019-01-29_15-22-00
在prepare階段執行成功後,就能夠恢復數據庫了。使用如下命令進行數據庫恢復:
[root@localhost full]# innobackupex --default-file=/etc/my.cnf --copy-back /data/backup/full/2019-01-29_15-22-00
注意如下兩點:
恢復完成後,必須修改從新生成的數據存儲目錄的權限爲運行MySQL的用戶,不然MySQL將沒法讀取該目錄:
[root@localhost db]# chown -R mysql:mysql mysql
完成以上步驟後,啓動MySQL便可。
第一次的增量備份必須基於一個徹底備份,以後每次的增量備份都是基於上一次的增量備份進行的。
注意:增量備份主要針對InnoDB,對於MyISAM而言,仍然是徹底備份。
這裏經過上面的徹底備份進行兩次增量備份來演示如何進行增量備份。
第一次增量備份(基於徹底備份):
[root@localhost incremental]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock --incremental /data/backup/incremental --incremental-basedir=/data/backup/full/2019-01-29_15-22-00
第二次增量備份(基於第一次增量備份):
[root@localhost incremental]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock --incremental /data/backup/incremental --incremental-basedir=/data/backup/incremental/2019-01-29_15-46-21
使用增量備份恢復數據庫相對來講步驟比較複雜,在prepare階段分爲如下三個步驟:
這裏使用上面生成的徹底備份和兩次增量備份來演示如何使用增量備份進行數據庫的恢復:
第一次的prepare(使用徹底備份):
[root@localhost backup]# innobackupex --apply-log --redo-only /data/backup/full/2019-01-29_15-22-00
第二次的prepare(使用第一次的增量備份prepare到徹底備份上):
[root@localhost backup]# innobackupex --apply-log --redo-only /data/backup/full/2019-01-29_15-22-00 --incremental-dir=/data/backup/incremental/2019-01-29_15-46-21
第三次的prepare(使用第二次的增量備份prepare到徹底備份上):
[root@localhost backup]# innobackupex --apply-log /data/backup/full/2019-01-29_15-22-00 --incremental-dir=/data/backup/incremental/2019-01-29_15-50-42
最後一次prepare(使用徹底備份最後進行一次完整的prepare):
[root@localhost backup]# innobackupex --apply-log /data/backup/full/2019-01-29_15-22-00
成功執行完以上操做後便可恢復數據庫了:
[root@localhost incremental]# innobackupex --default-file=/etc/my.cnf --copy-back /data/backup/full/2019-01-29_16-35-26
針對海量數據,可使用XtraBackup提供的流式特性,在備份的過程當中直接進行壓縮而不通過中間環節。
這裏經過一個例子來演示如何使用流式特性:將MySQL中的全部數據庫進行徹底備份,並將備份直接打包成tar並調用gzip進行壓縮,保存在/data/bakcup/tar目錄下,運行如下命令
[root@localhost backup]# innobackupex --user=backup --password=123456 --socket=/tmp/mysqld.sock --stream=tar /data/backup/tar |gzip > /data/backup/tar/backup.tar.gz
要對生成的tar.gz包進行解壓,須要添加i參數:
[root@localhost tar]# tar -zixvf backup.tar.gz