利用Xtrabackup進行mysql資料庫的備份,xtrabackupmysql

來源:互聯網
上載者:User

利用Xtrabackup進行mysql資料庫的備份,xtrabackupmysql

利用Xtrabackup來實現資料庫的備份

Xtrabackup是有percona公司開發的一款開源備份工具,它與ibbackup這個備份工具不同的是。ibbackup是一個收費的備份工具,而且在其備份效能上,ibbackup不如Xtrabackup。ibbackup和Xtrabackup都對Innodb儲存引擎支援線上物理完全備份和線上物理增量備份,對MyISAM儲存引擎來說,只支援溫備份而已。更對關於兩者的特性比較,請參考http://www.percona.com/software/percona-xtrabackup。

 

利用Xtrabackup備份mysql資料庫步驟如下:

一、安裝

1、簡介
Xtrabackup是由percona提供的mysqlDatabase Backup工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb儲存引擎的資料庫進行熱備的工具。xtradb是Innodb的增強版,在其效能上比Innodb要好,特點如下:
(1)備份過程快速、可靠;
(2)備份過程不會打斷正在執行的事務;
(3)能夠基於壓縮等功能節約磁碟空間和流量;
(4)自動實現備份檢驗;
(5)還原速度快;

 

2、安裝
其最新版的軟體可從 http://www.percona.com/software/percona-xtrabackup/ 獲得。本文基於RHEL5.8的系統,因此,直接下載相應版本的rpm包安裝即可,這裡不再示範其過程。

安裝完成之後,會產生一個/usr/bin/innobackupex指令檔,這個指令檔封裝了xtrabackup,能同時處理Innodb和Myisam,但在處理Myisam時需要加一個讀鎖。

 

3、innobackupex簡介

innobackupex
innobackupex有更強的功能,它整合了xtrabackup和其他的一些功能,他不但可以全量備份/恢複,還可以基於時間的增量備份與恢複。

innobackupex備份原理
innobackupex首先調用xtrabackup來備份innodb資料檔案,當xtrabackup完成後,innobackupex就查看檔案xtrabackup_suspended ;然後執行“FLUSH TABLES WITH READ LOCK”來備份其他的檔案

innobackupex恢複原理
innobackupex首先讀取my.cnf,查看變數(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)對應的目錄是存在,確定相關目錄存在後,然後先copy myisam表和索引,然後在copy innodb的表、索引和日誌

 

 

二、備份的實現

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)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目錄來儲存備份資料。

 

 

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

一般情況下,在備份完成後,資料尚且不能用於恢複操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料檔案仍處理不一致狀態。“準備”的主要作用正是通過復原未提交的事務及同步已經提交的事務至資料檔案也使得資料檔案處於一致性狀態。

innobakupex命令的--apply-log選項可用於實現上述功能。如下面的命令:
# innobackupex --apply-log  /path/to/BACKUP-DIR

如果執行正確,其最後輸出的幾行資訊通常如下:

xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1640470
020124 06:22:05  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 '/tmp/backup/2002-01-24_06-09-50'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Copying '/tmp/backup/2002-01-24_06-09-50/ib_logfile0' to '/mydata/data/ib_logfile0'
innobackupex: Copying '/tmp/backup/2002-01-24_06-09-50/ib_logfile1' to '/mydata/data/ib_logfile1'
innobackupex: Finished copying back files.

020124 06:29:22  innobackupex: completed OK!

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

當資料恢複至DATADIR目錄以後,還需要確保所有資料檔案的屬主和屬組均為正確的使用者,如mysql,否則,在啟動mysqld之前還需要事先修改資料檔案的屬主和屬組。如:

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

如果不修改資料目錄及其該目錄下所有檔案的屬主和屬組,那麼將會導致mysqld啟動不了。會出現如下錯誤提示資訊:

Starting MySQL...The server quit without updating PID file [FAILED]/data/localhost.pid).

 

 

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指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,每一次都要執行如上操作;

 

最後,全部(完全備份和增量備份)恢複過程執行如下命令:

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

/path/to/BACKUP-DIR為完全備份所在目錄

 

 

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選項對多個檔案進行並行複製。此選項用於指定在複製時啟動的線程數目。當然,在實際進行備份時要利用此功能的便利性,也需要啟用innodb_file_per_table選項或共用的資料表空間通過innodb_data_file_path選項儲存在多個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伺服器之間進行移植,即便使用了innodb_file_per_table選項。而使用Xtrabackup工具可以實現此種功能,不過,此時需要“匯出”表的mysql伺服器啟用了innodb_file_per_table選項(嚴格來說,是要“匯出”的表在其建立之前,mysql伺服器就啟用了innodb_file_per_table選項),並且“匯入”表的伺服器同時啟用了innodb_file_per_table和innodb_expand_import選項。

(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也可以實現部份備份,即只備份某個或某些指定的資料庫或某資料庫中的某個或某些表。但要使用此功能,必須啟用innodb_file_per_table選項,即每張表儲存為一個獨立的檔案。同時,其也不支援--stream選項,即不支援將資料通過管道傳輸給其它程式進行處理。

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

(1)建立部份備份

建立部份備份的方式有三種:Regex(--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狀態的備份直接至資料目錄中實現還原,不過此時要求資料目錄處於一致狀態。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.