青蛙學Linux—MySQL備份工具XtraBackup

XtraBackup是Percona公司開發的一款免費開源的MySQL備份工具。與上一篇介紹的mysqldump不一樣,XtraBackup能夠對MySQL進行物理備份(備份的是MySQL的文件而不是生成sql文件),且XtraBackup能夠對MySQL進行在線備份。html

一、安裝XtraBackup

要安裝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主要工具

使用XtraBackup進行備份時,主要使用如下兩個工具:app

  • xtrabackup
  • innobackupex

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備份恢復過程

3.一、MyISAM引擎

XtraBackup首先執行flush tables with read lock生成鎖以阻止新的寫入,而後將表中的數據刷新使其所有保存到硬盤上,接着開始複製文件,文件複製完成後釋放鎖。

3.二、InnoDB引擎

備份

XtraBackup在開始備份時會記住log sequence number(LSN),而後開始複製文件。同時,XtraBackup會啓動一個後臺進程用於監視事務日誌,並從事務日誌中複製最新的修改,該操做是持續進行的。因此XtraBackup在備份InnoDB時不會產生阻塞。

恢復—準備(prepare)階段

XtraBackup使用事務日誌對備份的數據進行前滾和回滾操做,以保證這些數據與備份結束時的數據庫狀態一致。

恢復—恢復階段

XtraBackup在準備階段完成後,便可使用準備好的數據對InnoDB進行恢復。

四、使用XtraBackup

4.一、innobackupex語法及經常使用選項

innobackupex的命令語法以下:

innobackupex --選項

經常使用選線:

  • --host:指定鏈接的MySQL主機
  • --port:指定鏈接的MySQL端口
  • --socket:指定鏈接本地數據庫時使用的MySQL socket路徑
  • --user:備份使用的MySQL用戶
  • --password:備份使用的MySQL用戶的密碼
  • --databases:對指定的數據庫進行備份,指定多個庫時使用」庫1 庫2 … 庫n」表示
  • --no-timestamp:不使用以時間命名的目錄保存備份數據,使用名爲BACKUP-DIR的目錄保存備份數據
  • --default-files:指定MySQL配置文件的路徑,該選項必須在全部選項以前;XtraBackup默認使用/etc/my.cnf這個配置文件
  • --incremental:建立增量備份
  • --incremental-basedir:指定基於哪一個備份作增量備份
  • --incremental-dir:在恢復階段的準備過程當中用於指定增量備份的路徑
  • --apply-log:應用xtrabackup_logfile文件,重作已提交的事務,回滾未提交的事務
  • --redo-only:只重作已提交的事務,不回滾未提交的事務
  • --use-memory:在恢復過程當中的準備階段可使用的內存大小
  • --copy-back:恢復備份到數據庫的數據存儲目錄
  • --compact:壓縮備份
  • --stream={tar|xbstream}:在備份過程當中對數據進行流式化處理,不通過中間階段直接壓縮
  • --parallel:指定啓動的線程數,用於提升備份速度

在使用XtraBackup進行備份時,建議建立一個僅用於執行備份的MySQL用戶,只授予如下權限:

reload,lock tables,replication client,create tablespace,super,process

4.二、使用innobackupex進行徹底備份

這裏使用一個例子來演示如何使用innobackupex對MySQL進行徹底備份。

實驗環境:

  • MySQL經過源碼安裝,配置文件未/etc/my.cnf,socket文件爲/tmp/mysqld.sock
  • 使用MySQL的backup用戶進行備份,用戶密碼爲123456
  • 備份數據存儲在目錄/data/backup/full目錄下

運行如下命令進行備份:

[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      # 事務日誌文件,用於在恢復過程當中的準備階段對備份的數據進行前滾和回滾操做

4.三、使用徹底備份進行恢復

這裏經過將上面備份的數據進行恢復來介紹如何進行徹底備份的恢復。

準備階段(prepare)

該階段僅對使用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的數據存儲目錄必須爲空,由於innobackupex不會覆蓋已經存在的文件
修改數據存儲目錄的權限

恢復完成後,必須修改從新生成的數據存儲目錄的權限爲運行MySQL的用戶,不然MySQL將沒法讀取該目錄:

[root@localhost db]# chown -R mysql:mysql mysql

完成以上步驟後,啓動MySQL便可。

4.四、使用innobackup進行增量備份

第一次的增量備份必須基於一個徹底備份,以後每次的增量備份都是基於上一次的增量備份進行的。

注意:增量備份主要針對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

4.五、使用增量備份恢復數據庫

使用增量備份恢復數據庫相對來講步驟比較複雜,在prepare階段分爲如下三個步驟:

  1. 使用徹底備份進行一次prepare操做,此時必須添加—redo-only參數,不回滾未提交的數據,由於這些數據可能在後面的備份中已經提交了
  2. 將增量備份prepare到徹底備份上,除prepare最後一次增量備份外,其餘次的增量備份也必須添加—redo-only參數
  3. 對合並了增量備份的徹底備份再進行一次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

4.六、針對海量數據的備份優化

針對海量數據,可使用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
相關文章
相關標籤/搜索