天天看點

innobackupex備份mysql資料庫

Xtrabackup簡介

   Percona XtraBackup是開源免費的MySQL資料庫熱備份軟體,它能對InnoDB和XtraDB存儲引擎的資料庫非阻塞地備份(對于MyISAM的備份同樣需要加表鎖)。XtraBackup支援所有的Percona Server、MySQL、MariaDB和Drizzle。

XtraBackup優勢

1、無需停止資料庫進行InnoDB熱備

2、增量備份MySQL

3、流壓縮到傳輸到其它伺服器

4、能比較容易地建立主從同步

5、備份MySQL時不會增大伺服器負載

Xtrabackup安裝

CentOS6.5_X86-64bit下的安裝方法:

首先我們需要到官網去獲得軟體包,我這裡使用的是rpm格式的:

percona-xtrabackup-2.1.8-733.rhel6.x86_64.rpm

http://www.percona.com/downloads/XtraBackup/LATEST/RPM/rhel6/x86_64/

percona-toolkit-2.2.4-1.noarch.rpm

http://www.percona.com/downloads/percona-toolkit/2.0.4/

   因為這個套件工具裡面包含了幾個工具,這些工具是用perl腳本編寫的;在安裝是需要依賴于幾個perl的軟體包,在我們的系統CD裡面就已經有了,是以我這裡就搭建了一個本地yum源來安裝了

[root@Master ~]# yum install  \

percona-xtrabackup-2.1.8-733.rhel6.x86_64.rpm \

Xtrabackup工具介紹

安裝XtraBackup後,其實會有幾個工具:

[root@Master ~]# rpm -ql percona-xtrabackup

/usr/bin/innobackupex

/usr/bin/innobackupex-1.5.1

/usr/bin/xbcrypt

/usr/bin/xbstream

/usr/bin/xtrabackup

/usr/bin/xtrabackup_55

/usr/bin/xtrabackup_56

/usr/share/doc/percona-xtrabackup-2.1.8

/usr/share/doc/percona-xtrabackup-2.1.8/COPYING

[root@Master ~]#

每個工具介紹如下:

innobackupex:

這個是其實是下面三個工具的一個perl腳本封裝,可以備份MyISAM, InnoDB, XtraDB表。

xtrabackup:

一個由C編譯而來的二進制檔案,隻能備份InnoDB和XtraDB資料。

xbcrypt:

用來加密或解密備份的資料。

xbstream:

用來解壓或壓縮xbstream格式的壓縮檔案。

   建議使用perl封裝的innobackupex來作資料庫備份,因為比較容易使用。是以下面隻介紹innobackupex的使用。其它的使用參考:

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

Xtrabackup備份的實作

1.準備工作:

(1)實作如果要使用一個最小權限的使用者進行備份,則可基于如下指令建立此類使用者:

MariaDB [(none)]> CREATE USER 'larry'@'localhost' IDENTIFIED BY 'QAZWSX123';

MariaDB [(none)]> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'larry'@'localhost';

MariaDB [(none)]> GRANT RELOAD,LOCK TABLES, REPLICATION CLIENT ON *.* TO 'larry'@'localhost';

MariaDB [(none)]> FLUSH PRIVILEGES;

(2)建立備份資料存放目錄:

[root@Master ~]# mkdir /backups

2.一個完整備份的實作

(1)備份操作:(使用備份使用者備份我目前系統上的所有庫)

準備一個測試資料庫:

MariaDB [(none)]> SET sql_log_bin=0;  //導入過程中無需記錄到二進制日志中

MariaDB [(none)]> source /root/hellodb.sql

MariaDB [(none)]> show databases;

+--------------------+

| Database           |

| hellodb            |

| information_schema |

| mysql              |

| performance_schema |

| test               |

MariaDB [(none)]> SET sql_log_bin=1; //導入完成開啟二進制日志

MariaDB [hellodb]> USE hellodb;

Database changed

MariaDB [hellodb]> CREATE TABLE tb1 (ID INT);

MariaDB [hellodb]> SHOW TABLES;

+-------------------+

| Tables_in_hellodb |

| classes           |

| coc               |

| courses           |

| scores            |

| students          |

| tb1              |

| teachers          |

| toc               |

MariaDB [hellodb]>

進行一次完整備份:

[root@Master ~]# innobackupex --user=larry --password=QAZWSX123 /backups

..........

innobackupex: Backup created in directory '/backups/2014-04-01_12-41-31'

innobackupex: MySQL binlog position: filename 'maria-bin.000001', position 441

140401 12:02:20  innobackupex: Connection to database server closed

140401 12:02:20  innobackupex: completed OK!

這裡我是用的是備份使用者,指令執行後螢幕有大量的輸出資訊,這裡隻是截取了後面幾段重要的資訊:

1.它将備份資料檔案存放到了我建立的備份資料存放目錄,并且它儲存至了一個以時間指令的目錄中。

2.binlogs檔案的時間點,備份時它正處于那個二進制日志檔案的哪個點上

3.完成備份立即斷開與databases server的連接配接

4.通知備份完成

在備份目錄中也有幾個檔案值得關注:

wKioL1NKNpejAT2zAAI95Caydag962.jpg

其中:

(1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀态(如是否已經為prepared狀态)和LSN(日志序列号)範圍資訊;TARE

每個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.模拟資料誤删除并準備一個完全備份:

[root@Master ~]# rm -rf /mydata/data/*

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

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

[root@Master ~]# innobackupex --user=larry --password=QAZWSX123 --apply-log /backups/2014-04-01_12-41-31/

........

xtrabackup: starting shutdown with innodb_fast_shutdown = 1

InnoDB: FTS optimize thread exiting.

InnoDB: Starting shutdown...

InnoDB: Shutdown completed; log sequence number 2071686

140401 12:47:58  innobackupex: completed OK!

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

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

切記,不能再剛整理(準備)完成就用來恢複,什麼時候需要恢複就什麼時候整理!

3.從一個完全備份中恢複資料 

注意:恢複不用啟動MySQL

   innobackupex指令的--copy-back選項用于執行恢複操作,其通過複制所有資料相關的檔案至mysql伺服器DATADIR目錄中來執行恢複過程。innobackupex通過backup-my.cnf來擷取DATADIR目錄的相關資訊。

[root@Master ~]# innobackupex --copy-back --user=larry --password=QAZWSX123 /backups/2014-04-01_12-41-31/

140401 12:56:00  innobackupex: completed OK!

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

[root@Master ~]# ls /mydata/data/   //資料檔案已經恢複過來

hellodb  ib_logfile0  mysql               test

ibdata1  ib_logfile1  performance_schema  xtrabackup_binlog_pos_innodb

但是這些恢複回來的資料檔案屬主和屬組都是root,是以需要修改為mysql.

[root@Master ~]# chown -R mysql:mysql /mydata/data/

[root@Master data]# service mysqld start

Starting MySQL                                             [ OK ]

[root@Master data]#

4.驗證完整備份恢複結果:

MariaDB [(none)]> use hellodb;

在完成備份恢複後我們應當立即做一次完整備份:

[root@Master data]# innobackupex --user=larry --password=QAZWSX123 /backups

.......

innobackupex: Backup created in directory '/backups/2014-04-01_13-06-56'

140401 13:07:00  innobackupex: Connection to database server closed

140401 13:07:00  innobackupex: completed OK!

5.使用innobackupex進行增量備份

為了實驗效果再次操作一下資料庫,對資料進行改動:

MariaDB [hellodb]> CREATE TABLE t2 (Name CHAR(20));

MariaDB [hellodb]> INSERT INTO t2 VALUE ('larry');

MariaDB [hellodb]> select * from t2;

+-------+

| Name  |

| larry |

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

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

[root@Master ~]# innobackupex --incremental /backups/ --incremental-basedir=/backups/2014-04-01_13-06-56/

innobackupex: Backup created in directory '/backups/2014-04-01_13-23-09'

innobackupex: MySQL binlog position: filename 'maria-bin.000001', position 737

140401 13:23:14  innobackupex: Connection to database server closed

140401 13:23:14  innobackupex: completed OK!  //第一次增量完成!

說明:

--incremental 明确說明我們的操作是增量備份

--incremental-basedir= 明确說明我們是相對于誰做增量(上次完全/上次增量),如果每一次都相對于上次的完全備份做增量備份,那就是差異備份!

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

第二次增量備份

還是先改變一下資料:

MariaDB [(none)]> CREATE DATABASE newdb;

MariaDB [(none)]> USE newdb;

MariaDB [newdb]> CREATE TABLE newtable (ID INT);

MariaDB [newdb]> INSERT INTO newtable value (10);

MariaDB [newdb]> select * from newtable;

+------+

| ID   |

|   10 |

[root@Master ~]# innobackupex --incremental /backups/ --incremental-basedir=/backups/2014-04-01_13-23-09/

注意:這次我們是相對于上次增量做的增量備份!

innobackupex: Backup created in directory '/backups/2014-04-01_13-43-33'

innobackupex: MySQL binlog position: filename 'maria-bin.000001', position 1152

140401 13:34:11  innobackupex: Connection to database server closed

140401 13:34:11  innobackupex: completed OK!

  兩次增量備份完成後,如果資料又被修改,但是沒有做增量備份,那麼此刻隻能依靠二進制檔案進行恢複了:

MariaDB [(none)]> USE hellodb;

MariaDB [hellodb]> INSERT INTO tb1 value (30);

模拟将服務停止:

[root@Master ~]# service mysqld stop

Shutting down MySQL..                                      [  OK  ]

6.恢複操作:

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

準備第一次完全備份:

[root@Master ~]# innobackupex --apply-log --redo-only /backups/2014-04-01_13-06-56/

準備第一次增量備份:

[root@Master ~]# innobackupex --apply-log --redo-only /backups/2014-04-01_13-23-09/

準備第二次增量份:

[root@Master data]# innobackupex --apply-log --redo-only /backups/2014-04-01_13-06-56/ --incremental-dir=/backups/2014-04-01_13-43-33/

用準備好的完整備份恢複資料:

資料目錄中的檔案現在已經恢複:

[root@Master ~]# ls /mydata/data/

hellodb  ibdata1  ib_logfile0  ib_logfile1  mysql  newdb  performance_schema  test

修改屬主屬組

還原時間點:

[root@Master ~]# mysqlbinlog /mydata/binlogs/maria-bin.000001 > /backups/inc.sql

啟動mysql還原資料:

[root@Master 2014-04-01_13-43-33]# mysql

[root@Master 2014-04-01_13-43-33]# cd

[root@Master ~]# service mysqld start

Starting MySQL..                                           [  OK ]

[root@Master ~]# mysql

MariaDB [(none)]> set sql_log_bin=0;

MariaDB [(none)]> source /backups/inc.sql;

OK! 至此所有資料已經恢複回來了!

下面在介紹一下這個備份工具的其他功能(在此不做示例)

1.Xtrabackup的“流”及“備份壓縮”功能

Xtrabackup對備份的資料檔案支援“流”功能,即可以将備份的資料通過STDOUT傳輸給tar程式進行歸檔,而不是預設的直接儲存至某備份目錄中。要使用此功能,僅需要使用--stream選項即可。如:

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

甚至也可以使用類似如下指令将資料備份至其它伺服器:

innobackupex --stream=tar  /backup | 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

2.導入或導出單張表

   預設情況下,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;

3.使用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  /pat/to/partial/backup

   此指令執行過程中,innobackupex會調用xtrabackup指令從資料字典中移除缺失的表,是以,會顯示出許多關于“表不存在”類的警告資訊。同時,也會顯示出為備份檔案中存在的表建立.exp檔案的相關資訊。

(3)還原部分備份

還原部分備份的過程跟導入表的過程相同。當然,也可以通過直接複制prepared狀态的備份直接至資料目錄中實作還原,不要此時要求資料目錄處于一緻狀态。

OK!Xtrabackup備份工具的使用方法介紹至此!

本文轉自ting2junshui51CTO部落格,原文連結: http://blog.51cto.com/ting2junshui/1729681,如需轉載請自行聯系原作者