Xtrabackup進行MySQL備份

使用Xtrabackup進行MySQL備份

一、安裝

1、簡介

Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb數據庫進行熱備的工具。

特點:

(1)備份過程快速、可靠;
(2)備份過程不會打斷正在執行的事務;
(3)能夠基于壓縮等功能節約磁盤空間和流量;
(4)自動實現備份檢驗;
(5)還原速度快;

2、安裝

其最新版的軟件可從 http://www.percona.com/software/percona-xtrabackup/ 獲得。本文基于CentOS7.2的系統,因此,直接下載相應版本的rpm包安裝即可,也可以配置好epel源執行yum –y install percona-xtrabackup ,這里不再演示其過程。

二、備份的實現

1、完全備份

# innobackupex --user=DBUSER --password=DBUSERPASS  /path/to/BACKUP-DIR/

如果要使用一個最小權限的用戶進行備份,則可基于如下命令創建此類用戶:

mysql> CREATE USER ’bkpuser’@’localhost’ IDENTIFIED BY ’s3cret’;
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ’bkpuser’;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’bkpuser’@’localhost’;
mysql> FLUSH PRIVILEGES;

使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,復制所有關于表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中。

在備份的同時,innobackupex還會在備份目錄中創建如下文件: (1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日志序列號)范圍信息;

每個InnoDB頁(通常為16k大小)都會包含一個日志序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。

(2)xtrabackupbinloginfo —— mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置。

(3)xtrabackupbinlogpos_innodb —— 二進制日志文件及用于InnoDB或XtraDB表的二進制日志文件的當前position。

(4)xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;

(5)backup-my.cnf —— 備份命令用到的配置選項信息;

在使用innobackupex進行備份時,還可以使用–no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據。

2、準備(prepare)一個完全備份

一般情況下,在備份完成后,數據尚且不能用于恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態?!皽蕚洹钡闹饕饔谜峭ㄟ^回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處于一致性狀態。

innobakupex命令的–apply-log選項可用于實現上述功能。如下面的命令:

# innobackupex --apply-log  /path/to/BACKUP-DIR

如果執行正確,其最后輸出的幾行信息通常如下:

xtrabackup: starting shutdown with innodb_fast_shutdown = 1
120407  9:01:36  InnoDB: Starting shutdown...
120407  9:01:40  InnoDB: Shutdown completed; log sequence number 92036620
120407 09:01:40  innobackupex: completed OK!

在實現“準備”的過程中,innobackupex通常還可以使用–use-memory選項來指定其可以使用的內存的大小,默認通常為100M。如果有足夠的內存可用,可以多劃分一些內存給prepare的過程,以提高其完成速度。

3、從一個完全備份中恢復數據

注意:恢復不用啟動MySQL

innobackupex命令的–copy-back選項用于執行恢復操作,其通過復制所有數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex通過backup-my.cnf來獲取DATADIR目錄的相關信息。

# innobackupex --copy-back  /path/to/BACKUP-DIR

如果執行正確,其輸出信息的最后幾行通常如下:

innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2012-04-07_08-17-03'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Finished copying back files.

120407 09:36:10  innobackupex: completed OK!

請確保如上信息的最行一行出現“innobackupex: completed OK!”。

當數據恢復至DATADIR目錄以后,還需要確保所有數據文件的屬主和屬組均為正確的用戶,如mysql,否則,在啟動mysqld之前還需要事先修改數據文件的屬主和屬組。如:

# chown -R  mysql:mysql  /mydata/data/

另外,恢復完備份之后,檢查沒有問題之后,建議立刻做完整備份。

4、使用innobackupex進行增量備份

每個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增長。這正是InnoDB表可以進行增量備份的基礎,即innobackupex通過備份上次完全備份之后發生改變的頁面來實現。

要實現第一次增量備份,可以使用下面的命令進行:

# innobackupex --incremental /backup --incremental-basedir=BASEDIR

其中,BASEDIR指的是完全備份所在的目錄,此命令執行結束后,innobackupex命令會在/backup目錄中創建一個新的以時間命名的目錄以存放所有的增量備份數據。另外,在執行過增量備份之后再一次進行增量備份時,其–incremental-basedir應該指向上一次的增量備份所在的目錄。

需要注意的是,增量備份僅能應用于InnoDB或XtraDB表,對于MyISAM表而言,執行增量備份時其實進行的是完全備份。

“準備”(prepare)增量備份與整理完全備份有著一些不同,尤其要注意的是: (1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”。“重放”之后,所有的備份數據將合并到完全備份上。 (2)基于所有的備份將未提交的事務進行“回滾”。

于是,操作就變成了:

# innobackupex --apply-log --redo-only BASE-DIR

接著執行:

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

而后是第二個增量:

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,每一次都要執行如上操作; 注意:這里增量備份所在的目錄只識別絕對路徑; 每次合并增量備份可在完整備份目錄里面的xtrabackup_checkpoints查看到合并進度

5、Xtrabackup的“流”及“備份壓縮”功能

Xtrabackup對備份的數據文件支持“流”功能,即可以將備份的數據通過STDOUT傳輸給tar程序進行歸檔,而不是默認的直接保存至某備份目錄中。要使用此功能,僅需要使用–stream選項即可。如:

# innobackupex --stream=tar  /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz

甚至也可以使用類似如下命令將數據備份至其它服務器:

# innobackupex --stream=tar  /backup | ssh user@www.magedu.com  "cat -  > /backups/`date +%F_%H-%M-%S`.tar"

此外,在執行本地備份時,還可以使用–parallel選項對多個文件進行并行復制。此選項用于指定在復制時啟動的線程數目。當然,在實際進行備份時要利用此功能的便利性,也需要啟用innodbfilepertable選項或共享的表空間通過innodbdatafilepath選項存儲在多個ibdata文件中。對某一數據庫的多個文件的復制無法利用到此功能。其簡單使用方法如下:

# innobackupex --parallel  /path/to/backup

同時,innobackupex備份的數據文件也可以存儲至遠程主機,這可以使用–remote-host選項來實現:

# innobackupex --remote-host=root@www.magedu.com  /path/IN/REMOTE/HOST/to/backup

6、導入或導出單張表

默認情況下,InnoDB表不能通過直接復制表文件的方式在mysql服務器之間進行移植,即便使用了innodbfilepertable選項。而使用Xtrabackup工具可以實現此種功能,不過,此時需要“導出”表的mysql服務器啟用了innodbfilepertable選項(嚴格來說,是要“導出”的表在其創建之前,mysql服務器就啟用了innodbfilepertable選項),并且“導入”表的服務器同時啟用了innodbfilepertable和innodbexpandimport選項。

(1)“導出”表 導出表是在備份的prepare階段進行的,因此,一旦完全備份完成,就可以在prepare過程中通過–export選項將某表導出了:

# innobackupex --apply-log --export /path/to/backup

此命令會為每個innodb表的表空間創建一個以.exp結尾的文件,這些以.exp結尾的文件則可以用于導入至其它服務器。

(2)“導入”表 要在mysql服務器上導入來自于其它服務器的某innodb表,需要先在當前服務器上創建一個跟原表表結構一致的表,而后才能實現將表導入:

mysql> CREATE TABLE mytable (...)  ENGINE=InnoDB;

然后將此表的表空間刪除:

mysql> ALTER TABLE mydatabase.mytable  DISCARD TABLESPACE;

接下來,將來自于“導出”表的服務器的mytable表的mytable.ibd和mytable.exp文件復制到當前服務器的數據目錄,然后使用如下命令將其“導入”:

mysql> ALTER TABLE mydatabase.mytable  IMPORT TABLESPACE;

7、使用Xtrabackup對數據庫進行部分備份

Xtrabackup也可以實現部分備份,即只備份某個或某些指定的數據庫或某數據庫中的某個或某些表。但要使用此功能,必須啟用innodbfileper_table選項,即每張表保存為一個獨立的文件。同時,其也不支持–stream選項,即不支持將數據通過管道傳輸給其它程序進行處理。

此外,還原部分備份跟還原全部數據的備份也有所不同,即你不能通過簡單地將prepared的部分備份使用–copy-back選項直接復制回數據目錄,而是要通過導入表的方向來實現還原。當然,有些情況下,部分備份也可以直接通過–copy-back進行還原,但這種方式還原而來的數據多數會產生數據不一致的問題,因此,無論如何不推薦使用這種方式。

(1)創建部分備份

創建部分備份的方式有三種:正則表達式(–include), 枚舉表文件(–tables-file)和列出要備份的數據庫(–databases)。

(a)使用–include

使用–include時,要求為其指定要備份的表的完整名稱,即形如databasename.tablename,如:

# innobackupex --include='^mageedu[.]tb1'  /path/to/backup

(b)使用–tables-file

此選項的參數需要是一個文件名,此文件中每行包含一個要備份的表的完整名稱;如:

# echo -e 'mageedu.tb1\nmageedu.tb2' > /tmp/tables.txt
# innobackupex --tables-file=/tmp/tables.txt  /path/to/backup

(c)使用–databases

此選項接受的參數為數據名,如果要指定多個數據庫,彼此間需要以空格隔開;同時,在指定某數據庫時,也可以只指定其中的某張表。此外,此選項也可以接受一個文件為參數,文件中每一行為一個要備份的對象。如:

# innobackupex --databases="mageedu testdb"  /path/to/backup

(2)整理(preparing)部分備份

prepare部分備份的過程類似于導出表的過程,要使用–export選項進行:

# innobackupex --apply-log --export  /pat/to/partial/backup

此命令執行過程中,innobackupex會調用xtrabackup命令從數據字典中移除缺失的表,因此,會顯示出許多關于“表不存在”類的警告信息。同時,也會顯示出為備份文件中存在的表創建.exp文件的相關信息。

(3)還原部分備份

還原部分備份的過程跟導入表的過程相同。當然,也可以通過直接復制prepared狀態的備份直接至數據目錄中實現還原,不要此時要求數據目錄處于一致狀態。

原創文章,作者:征(_少,如若轉載,請注明出處:http://www.www58058.com/69602

(2)
征(_少征(_少
上一篇 2017-02-20
下一篇 2017-02-21

相關推薦

  • vim編輯器整理(無演示)

    vim編輯器 vim編輯器是linux中最強大的全屏幕純文本編輯器,他是vi編輯器的增強版。 文本編輯器: 文本:純文本,在ASCII角度講是純粹的不加任何修飾的文本信息     支持Unicode編碼方式 文本編輯器種類: 行編輯器:sed 全屏編輯器:nano,vi vi : (VIsual&n…

    Linux干貨 2016-08-10
  • 加油吧!少年!—至我和我M25期的伙伴

    引用 衣帶漸寬終不悔,為伊消得人憔悴。—王國維《人間詞話》 轉眼已到了27歲的年紀,不知道自己是否還稱得上少年。公交上讓座被小朋友成為叔叔也都是很多年的事了。哪怕再有一顆少年心現在也要肩負起整個家庭的責任。 從畢業已工作了將近六個年頭,無聊的工作平凡的薪水已經使我厭倦。閉上眼睛以后需要贍養四個老人,還要照顧孩子以后這些難題映入腦海。曾經以為遙遠的…

    Linux干貨 2017-07-11
  • Linux文件系統簡介

    文件系統是Linux的十分基礎的知識,同時也是學習Linux必不可少的知識。本文將簡單的介紹一下Linux的文件系統,主要包括FHS文件層級結構、Linux的文件類型及對應的顏色標識、man幫助手冊頁以及命令編輯特性的快捷鍵的介紹。這僅僅是屬于自己的一個總結,以后會對深入學習Linux有一定的幫助吧。 如有不對之處還請幫忙指出。 FHS文件層級結構 FHS(…

    Linux干貨 2016-10-19
  • kickstart+http+dhcp+tftp實現centos7的無人值守安裝

    環境:IP: 172.16.0.11 centos 7.2 一. tftp 安裝tftp服務端和客戶端 [root@localhost ~]# yum -y install tftp tftp-server 啟動tftp [root@localhost ~]# systemctl start tftp.socket [root@localhost ~]# s…

    Linux干貨 2017-06-03
  • jackcui0804作業

    (1)顯示/proc/meminfo 文件中以大小s 開頭的行;( 要求:使用兩種方式) [root@centos7 ~]# cat /proc/meminfo | grep -e "^s.*" -e "^S.*" SwapCac…

    Linux干貨 2016-08-08
  • shell 腳本的編輯基礎

          shell腳本是Linux運維工程師必須掌握的技能之一,shell腳本的使用讓我們更好的操作Linux系統,方便了我們的執行。 一,編程基礎 編程基本概念 編程邏輯處理方式:順序執行,循環執行,選擇執行 程序:指令+ 數據 shell 編程:過程式、解釋執行 shell程序:提供了編程能力,解釋執…

    Linux干貨 2016-08-22
欧美性久久久久