Xtrabackup基礎--mysql innodb備份


Xtrabackup


一、    Xtrabackup的基礎知識


InnoDB 有個商業的InnoDB Hotbackup,可以對InnoDB引擎的表實現在線熱備。而 percona出品的Xtrabackup,是InnoDB Hotbackup的一個開源替代品,

可以在線對InnoDB/XtraDB引擎的表進行物理備份。mysqldump支持在線備份,不過是邏輯備份,效率比較差。xtrabackup是開源的MySQL備份工具,物理備份,

效率很不錯。

Xtrabackup有兩個主要的工具:xtrabackup、innobackupex,其中xtrabackup只能備份InnoDB和XtraDB兩種數據表,innobackupex則封裝了xtrabackup,

同時可以備份MyISAM數據表。Xtrabackup做備份的時候不能備份表結構、觸發器等等,智能紛紛.idb數據文件。另外innobackupex還不能完全支持增量備份,

需要和xtrabackup結合起來實現全備的功能。


2.1版本文檔:

http://www.percona.com/doc/percona-xtrabackup/2.1/installation/compiling_xtrabackup.html


下載地址:

http://www.percona.com/downloads/XtraBackup/


注意版本支持,由於Mysql是5.5.39的版本,這裏我們下載xtrabackup2.1的版本。



二、安裝xtrabackup


1、安裝系統依賴包

yum -y install rpmrebuild cmake libaio-devel readline-devel perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL


2、下載rpm包

wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.1.9/RPM/rhel6/i386/percona-xtrabackup-2.1.9-744.rhel6.i686.rpm

wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.1.9/RPM/rhel6/x86_64/percona-xtrabackup-2.1.9-744.rhel6.x86_64.rpm



三、The innobackupex Script



1、創建一個用於備份的用戶並賦予權限


    Permissions and Privileges Needed Once connected to the server, in order to perform a backup you will need

READ, WRITE and EXECUTE permissions at a filesystem level in the server’s datadir.

The database user needs the following privileges on the tables / databases to be backed up:


RELOAD and LOCK TABLES (unless the --no-lock option is specified) in order to FLUSH TABLES WITHREAD LOCK prior to start copying the files and

REPLICATION CLIENT in order to obtain the binary log position,

CREATE TABLESPACE in order to import tables (see Restoring Individual Tables) and

SUPER in order to start/stop the slave threads in a replication environment.


The explanation of when these are used can be found in How innobackupex Works.

An SQL example of creating a database user with the minimum privileges required to full backups would be:


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

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;



mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost' IDENTIFIED BY 's3cret';

mysql> FLUSH PRIVILEGES;



2、完全備份


#指定備份目標目錄(/data/backup/mysql),基於時間戳(默認)

~]# innobackupex --defaults-file=/data/qjp/conf/my_s1.cnf --user=bkpuser --password=s3cret --socket=/data/qjp/mysql_s1/mysql.sock /data/backup/mysql


#自定義備份目標目錄名

~]# innobackupex --defaults-file=/data/qjp/conf/my_s102.cnf --user=bkpuser --password=s3cret --socket=/data/qjp/mysql_s102/mysql.sock --no-timestamp /data/backup/mysql/fullback-`date +"%F"`


使用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目錄來存儲備份數據。



3、準備(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的過程,以提高其完成速度。


# innobackupex --apply-log --use-memory=4G /path/to/BACKUP-DIR


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


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


# innobackupex --defaults-file=/data/qjp/conf/my_s102.cnf --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 '/data/qjp/mysql_s102'

innobackupex: Finished copying back files.


120407 09:36:10  innobackupex: completed OK!


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


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


# chown -R  mysql:mysql  /data/qjp/mysql_s102



5、使用innobackupex進行增量備份


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


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


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


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

其--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 --defaults-file=/data/qjp/conf/my_s102.cnf --user=bkpuser --password=s3cret --socket=/data/qjp/mysql_s102/mysql.sock --no-timestamp /data/backup/mysql/fullback-`date +"%F"`


#兩次增量備份

innobackupex --defaults-file=/data/qjp/conf/my_s102.cnf --user=bkpuser --password=s3cret --incremental /data/backup/mysql/ --incremental-basedir=/data/backup/mysql/fullback-2014-09-08/

innobackupex --defaults-file=/data/qjp/conf/my_s102.cnf --user=bkpuser --password=s3cret --incremental /data/backup/mysql/ --incremental-basedir=/data/backup/mysql/2014-09-08_22-43-37/


#將增量備份的事務回滾到第一次全備fullback-2014-09-08

innobackupex --apply-log --redo-only /data/backup/mysql/fullback-2014-09-08/

innobackupex --apply-log --redo-only /data/backup/mysql/fullback-2014-09-08/ --incremental-dir=/data/backup/mysql/2014-09-08_22-43-37/

innobackupex --apply-log --redo-only /data/backup/mysql/fullback-2014-09-08/ --incremental-dir=/data/backup/mysql/2014-09-08_22-45-23/


#模擬數據損壞

/data/qjp/bin/stop_db_s102.sh #停庫

rm -rf /data/qjp/mysql_s102/*


#使用準備好的全備fullback-2014-09-08進行數據恢復

innobackupex --defaults-file=/data/qjp/conf/my_s102.cnf --copy-back /data/backup/mysql/fullback-2014-09-08/

chown -R mysql.mysql /data/qjp/mysql_s102/*


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


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


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


解壓備份文件

# gunzip fullbackup-2014-09-10_095818.tar.gz


必須使用-i選項

# tar -xif fullbackup-2014-09-10_095818.tar



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

# innobackupex --stream=tar  ./ | ssh [email protected]  "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 [email protected]  /path/IN/REMOTE/HOST/to/backup

 


7、導入或導出單張表


默認情況下,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;




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



Xtrabackup也可以實現部分備份,即只備份某個或某些指定的數據庫或某數據庫中的某個或某些表。但要使用此功能,必須啓用innodb_file_per_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  /path/to/partial/backup


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


(3)還原部分備份

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



六、FAQ問題


問題1:

]# innobackupex --defaults-file=/data/mysql/my.cnf  --port=3307 --database=test --user=bkpuser --password=***** /data/temp/


InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy

and Percona Ireland Ltd 2009-2012.  All Rights Reserved.


This software is published under

the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.


130618 18:42:35  innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/data/mysql/my.cnf;mysql_read_default_group=xtrabackup;port=3307' as 'bkpuser'  (using password: YES).

ERROR: Failed to connect to MySQL server as DBD::mysql module is not installed at /usr/sbin/innobackupex line 1397.



解決辦法:

yum -y install perl-DBD-MySQL

ldconfig


問題2:

140905 17:32:19  InnoDB: Log file ./ib_logfile0 did not exist: new to be created

InnoDB: Setting log file ./ib_logfile0 size to 5 MB

InnoDB: Database physically writes the file full: wait...

140905 17:32:19  InnoDB: Log file ./ib_logfile1 did not exist: new to be created

InnoDB: Setting log file ./ib_logfile1 size to 5 MB

InnoDB: Database physically writes the file full: wait...

xtrabackup: Something wrong with source files...

innobackupex: Error: The xtrabackup child process has died at /usr/bin/innobackupex line 2622.


解決辦法:在my.cnf配置文件中,必須啓用innodb引擎


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章