天天看點

Percona XtraBackup User Manual 閱讀筆記 XtraBackup

<a href="#_Toc396231212">XtraBackup.. 1</a>

<a href="#_Toc396231213">2 安裝XtraBackup.. 1</a>

<a href="#_Toc396231214">2.1 安裝XtraBackup binary版本... 1</a>

<a href="#_Toc396231215">2.1.1 yum的安裝方法:... 1</a>

<a href="#_Toc396231216">2.1.2 直接下載下傳rpm包安裝... 1</a>

<a href="#_Toc396231217">3 XtraBackup使用手冊... 1</a>

<a href="#_Toc396231218">3.1 使用innobackupex腳本... 1</a>

<a href="#_Toc396231219">3.1.1 備份預備工作... 1</a>

<a href="#_Toc396231220">3.1.2 全備和全備還原... 1</a>

<a href="#_Toc396231221">3.1.2.1 使用innobackupex建立全備... 1</a>

<a href="#_Toc396231222">3.1.2.2 使用innobackupex預備全備... 1</a>

<a href="#_Toc396231223">3.1.2.3 使用innobackupex還原備份... 1</a>

<a href="#_Toc396231224">3.1.3 增量備份和還原... 1</a>

<a href="#_Toc396231225">3.1.3.1 建立增量備份... 1</a>

<a href="#_Toc396231226">3.1.3.2 預備增量備份... 1</a>

<a href="#_Toc396231227">3.1.3.3 還原增量備份... 1</a>

<a href="#_Toc396231228">3.1.3.4 可以使用流做增量備份... 1</a>

<a href="#_Toc396231229">3.1.4 部分備份和還原... 1</a>

<a href="#_Toc396231230">3.1.4.1 建立部分備份... 1</a>

<a href="#_Toc396231231">3.1.4.2 預備部分備份... 1</a>

<a href="#_Toc396231232">3.1.4.3 還原部分備份... 1</a>

<a href="#_Toc396231233">3.1.5 窄備份... 1</a>

<a href="#_Toc396231234">3.1.5.1 建立窄備份... 1</a>

<a href="#_Toc396231235">3.1.5.2 預備窄備份... 1</a>

<a href="#_Toc396231236">3.1.5.3 還原窄備份... 1</a>

<a href="#_Toc396231237">3.1.6 備份加密... 1</a>

<a href="#_Toc396231238">3.1.7 其他功能... 1</a>

<a href="#_Toc396231239">3.1.7.1 備份壓縮和流... 1</a>

<a href="#_Toc396231240">3.1.7.2 在複制環境下備份... 1</a>

<a href="#_Toc396231241">3.1.7.3 加速備份程序... 1</a>

<a href="#_Toc396231242">3.1.7.4 節流(throttling)備份... 1</a>

<a href="#_Toc396231243">3.1.7.5 還原獨立表... 1</a>

<a href="#_Toc396231244">3.1.7.6 時間點還原... 1</a>

<a href="#_Toc396231245">3.1.7.7 提高對FLUSH TABLES WITH READ LOCK控制... 1</a>

<a href="#_Toc396231246">3.1.8 innobackupex工作原理... 1</a>

<a href="#_Toc396231247">3.1.9 Reference. 1</a>

<a href="#_Toc396231248">3.2 使用Xtrabackup.. 1</a>

<a href="#_Toc396231249">3.2.1 選擇bianry. 1</a>

<a href="#_Toc396231250">3.2.2 配置Xtrabackup.. 1</a>

<a href="#_Toc396231251">3.2.3 建立全備和還原... 1</a>

<a href="#_Toc396231252">3.2.3.1 建立全備... 1</a>

<a href="#_Toc396231253">3.2.3.2 預備全備... 1</a>

<a href="#_Toc396231254">3.2.3.3 還原全備... 1</a>

<a href="#_Toc396231255">3.2.4 增量備份和還原... 1</a>

<a href="#_Toc396231256">3.2.4.1 增量備份... 1</a>

<a href="#_Toc396231257">3.2.4.2 預備增量備份... 1</a>

<a href="#_Toc396231258">3.2.5 使用歸檔日志做增量備份... 1</a>

<a href="#_Toc396231259">3.2.5.1 原理... 1</a>

<a href="#_Toc396231260">3.2.5.2 建立備份... 1</a>

<a href="#_Toc396231261">3.2.5.3 使用歸檔日志來預備備份... 1</a>

<a href="#_Toc396231262">3.2.6 部分備份和預備... 1</a>

<a href="#_Toc396231263">3.2.6.1 備份部分備份... 1</a>

<a href="#_Toc396231264">3.2.6.2 預備備份... 1</a>

<a href="#_Toc396231265">3.2.7 窄備份和預備... 1</a>

<a href="#_Toc396231266">3.2.7.1 建立窄備份... 1</a>

<a href="#_Toc396231267">3.2.7.2 預備窄備份... 1</a>

<a href="#_Toc396231268">3.2.7.3 備份還原... 1</a>

<a href="#_Toc396231269">3.2.8 其他功能... 1</a>

<a href="#_Toc396231270">3.2.8.1 節流備份... 1</a>

<a href="#_Toc396231271">3.2.8.2 使用腳本調用xtrabackup來執行備份... 1</a>

<a href="#_Toc396231272">3.2.8.3 分析表統計資訊... 1</a>

<a href="#_Toc396231273">3.2.8.4 使用binary log. 1</a>

<a href="#_Toc396231274">3.2.8.5 還原單個表... 1</a>

<a href="#_Toc396231275">3.2.8.6 LRU dump備份... 1</a>

<a href="#_Toc396231276">3.2.8.7 xtrabackup的限制... 1</a>

<a href="#_Toc396231277">3.2.8.8 References1</a>

<a href="#_Toc396231278">3.2.9 xbstream.. 1</a>

<a href="#_Toc396231279">3.2.10 xbcrypt1</a>

<a href="#_Toc396231280">3.2.11 Xtrabackup原理... 1</a>

<a href="#_Toc396231281">4 如何使用和案例(How-tos and Recipes)1</a>

<a href="#_Toc396231282">4.1 innobackupex案例... 1</a>

<a href="#_Toc396231283">4.1.1 本地全備(備份,預備,還原)1</a>

<a href="#_Toc396231284">4.1.2 使用Stream備份... 1</a>

<a href="#_Toc396231285">4.1.3 建立增量備份... 1</a>

<a href="#_Toc396231286">4.1.4 建立壓縮備份... 1</a>

<a href="#_Toc396231287">4.1.5 備份還原獨立分區... 1</a>

<a href="#_Toc396231288">4.1.5.1 建立備份... 1</a>

<a href="#_Toc396231289">4.1.5.2 預備備份... 1</a>

<a href="#_Toc396231290">4.1.5.3 從備份還原... 1</a>

<a href="#_Toc396231291">4.2 xtrabackup案例... 1</a>

<a href="#_Toc396231292">4.3 其他案例... 1</a>

<a href="#_Toc396231293">4.3.1 六個步驟安裝一個slave. 1</a>

<a href="#_Toc396231294">4.3.2 再增加一個slave. 1</a>

<a href="#_Toc396231295">4.3.3 使用複制和pt-checksum驗證備份... 1</a>

<a href="#_Toc396231296">4.3.4 如何建立基于GTID的Slave. 1</a>

<a href="#_Toc396231297">4.4輔助工具手冊... 1</a>

<a href="#_Toc396231298">參考... 1</a>

這裡隻介紹yum和rpm安裝方法

其他安裝方法檢視:

自動

$ rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm

然後會看到:

Retrieving http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm

Preparing...                ########################################### [100%]

   1:percona-release        ########################################### [100%]

手動

[percona]

name = CentOS $releasever - Percona

baseurl=http://repo.percona.com/centos/$releasever/os/$basearch/

enabled = 1

gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona

gpgcheck = 1

測試安裝庫

使用yum list | grep percona來確定安裝

yum list | grep percona

會出現以下資訊:

percona-release.x86_64                     0.0-1                       installed

...

Percona-Server-client-51.x86_64            5.1.47-rel11.1.51.rhel5     percona

Percona-Server-devel-51.x86_64             5.1.47-rel11.1.51.rhel5     percona

Percona-Server-server-51.x86_64            5.1.47-rel11.1.51.rhel5     percona

Percona-Server-shared-51.x86_64            5.1.47-rel11.1.51.rhel5     percona

Percona-Server-test-51.x86_64              5.1.47-rel11.1.51.rhel5     percona

xtrabackup.x86_64                          1.2-22.rhel5                percona

使用wget下載下傳rpm包,然後通過rpm包安裝

innobackupex是perl腳本對xtrabackup的封裝,和功能擴充。

權限和連接配接

xtrabackup需要連接配接到資料庫和datadir操作權限。

xtrabackup或者innobackupex在使用過程中設計到2類使用者權限:

1.系統使用者,用來調用innobackupex或者xtrabackup

2.資料庫使用者,資料庫内使用的使用者

連接配接到服務:innobackupex或者xtrabackup通過—user和—password連接配接到資料庫服務

$ innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/

$ innobackupex --user=LUKE  --password=US3TH3F0RC3 --stream=tar ./ | bzip2 -

$ xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/

其他連接配接選項:

Option

Description

–port

The port to use when connecting to the database server with TCP/IP.

–socket

The socket to use when connecting to the local database.

–host

The host to use when connecting to the database server with TCP/IP.

需要的權限:連接配接到服務是為了執行備份,需要在datadir上有read,write和execute權限。在資料庫中需要以下權限:

Ÿ   RELOAD和LOCK TABLES權限為了執行FLUSH TABLES WITH READ LOCK   。

Ÿ   REPLICATION CLIENT為了擷取binary log 位置

Ÿ   CREATE TABLESPACE權限為了導入表,使用者表級别的恢複

Ÿ   SUPER權限在slave環境下備份用來啟動和關閉slave線程

建立全備

會輸出以下資訊

從資訊中會發現備份被建立在/path/to/BACKUP-DIR/2013-03-25_00-00-09

内部機制:在備份的時候innobackupex會調用xtrabackup來備份innodb表,并複制所有的表定義,其他引擎的表(MyISAM,MERGE,CSV,ARCHIVE)。

其他選項:

--no-timestamp,指定了這個選項備份會直接備份在BACKUP-DIR,不再建立時間戳檔案夾。

--default-file,指定配置檔案,用來配置innobackupex的選線。

建立完備份之後資料被沒有馬上可以被還原,需要復原未送出事務,前滾送出事務,讓資料庫檔案保持一緻性。

innobackupex使用—apply-log來做預備備份

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

成功則會輸出:

111225  1:01:57  InnoDB: Shutdown completed; log sequence number 1609228

111225 01:01:57  innobackupex: completed OK!

成功後,備份可以被用來還原資料庫了。

内部機制:讀取備份檔案夾中的配置檔案,然後innobackupex重做已送出事務,復原未送出事務,之後資料就被寫到了備份的資料檔案(innodb檔案)中,并重建日志檔案。這一步隐式調用了2次xtrabackup –prepare。跟多關于xtrabackup可以看之後的章節。

其他選項:

--user-memory:指定預備階段可使用的記憶體,記憶體多則速度快,預設為10MB

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

使用innobackupex --copy-back來還原備份

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

會根據my.cnf複制所有備份到datadir下:

innobackupex: Finished copying back files.

111225 01:08:13  innobackupex: completed OK!

注:datadir必須是為空的,innobackupex –copy-back不會覆寫已存在的檔案,還要注意,還原時需要先關閉服務,如果服務是啟動的,那麼就不能還原到datadir。

之後需要修改檔案的所有者和權限:

$ chown -R mysql:mysql /var/lib/mysql

增量備份呢是為了減少空間使用和備份的時間。

增量備份的實作,依賴于innodb頁上面的LSN(log sequence number),每次對資料庫的修改都會導緻LSN自增。

增量備份會複制指定LSN之後的所有資料頁。

在建立增量備份之前需要一個全備,不然增量備份是沒有意義的。

$ innobackupex /data/backups

這樣就會在/data/backups下建立一個時間戳檔案夾,如 /data/backups/2013-03-31_23-01-18,然後檔案夾内是備份檔案。

檢查備份檔案夾下的xtrabackup-checkpoints,會有一下資訊:

backup_type = full-backuped

from_lsn =0

to_lsn =1291135

建立第一個增量備份

然後使用—incremental建立增量備份

$ innobackupex --incremental /data/backups --incremental-basedir=BASEDIR

BASEDIR指向之前的全備, /data/backups/2013-03-31_23-01-18,成功後備份會生成在/data/backups下的時間戳目錄中,如:/data/backups/2013-04-01_23-01-18 ,把這個目錄叫為記為 INCREMENTAL-DIR-1方面之後使用。

然後檢視xtrabackup-checkpoints:

backup_type = incremental

from_lsn =1291135

to_lsn =1352113

可以發現和全備不同的是,backup_type為incremental,from_lsn不為0。

然後再建立一個增量備份

在INCREMENTAL-DIR-1的基礎上再建立一個增量備份,記為INCREMENTAL-DIR-2。

$ innobackupex --incremental /data/backups --incremental-basedir=INCREMENTAL-DIR-1

增量備份替代方法

可以使用指定—incremental-lsn來代替—incremental-basedir的方法建立增量備份。

innobackupex --incremental /data/backups --incremental-lsn=1291135

innobackupex --incremental /data/backups --incremental-lsn=1358967

注意:xtrabackup隻會影響xtradb或者innodb的表,其他引擎的表在增量備份的時候隻會複制整個檔案,不會差異。

預備增量備份需要2個步驟:

1.需要先預備全備,但是隻重做已送出事務,不復原未送出事務,然後應用到全備,也是隻重做已送出事務,不復原未送出事務

2.復原未送出事務

如果已經復原了未送出事務,那麼就無法再應用增量備份。

注:在mariadb 10.0 上測試發現不加—redo-only預備全備,然後使用 –redo-only應用增量備份,mysql服務能夠正常啟動并且資料被成功還原

在全備上,使用—redo-only隻做已送出事務,不復原未送出事務

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

會出現以下結果:

應用第一個增量備份

輸出結果,注意LSN的變化:

如果沒有指定—incremental-dir,那麼innobackupex會使用最近的一個在basedir中被建立的子目錄。

應用另外一個備份

innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

因為是最後一個增量備份是以沒有必要再加—redo-only,這樣最後一個增量也被應用到全備上了。

注:--redo-only除了最後一個不用加之外,其他的增量應用都要加,最後一個應用的時候可以直接進入復原未送出事務階段。如果加了也沒事兒,服務啟動的時候會進入recovery過程,來復原

需要注意的是,應用增量備份的時候隻能按照備份的順序來應用。如果應用順序錯誤,那麼備份就不可用。如果無法确定順序,可以使用xtrabackup-checkpoints來确定順序。

復原未送出事務

當應用完所有增量備份的時候,就需要復原所有為完成事務(如果最後一步加了 –redo-only就需要復原未送出,不執行的話在服務啟動階段服務會處理未送出事務)。

innobackupex --apply-log BASE-DIR

Note that the iblog* files will not be created by innobackupex, if you want them to be created, use xtrabackup –prepareon the directory. Otherwise, the files will be created by the server once started.

注:

文中提到innodb事務日志(iblog*)不會被建立,但是測試下使用了最後一步復原未送出事務發現有iblog*檔案,而且上文提到 innobackupex會隐式執行兩次 xtrabackup –prepare,在下文介紹xtrabackup時會提到,執行2次xtrabackup –preare會建立iblog*檔案,與文中提到不符。

還原增量備份其實和還原全備一樣

innobackupex --copy-back BASE-DIR

先進行一個全備:

innobackupex /data/backups

使用本地:

innobackupex --incremental --incremental-lsn=LSN-number --stream=xbstream ./ &gt; incremental.xbstream

解包方法

xbstream -x &lt; incremental.xbstream

使用本地備份流到遠端并解包

innobackupex  --incremental --incremental-lsn=LSN-number --stream=xbstream ./ | /

ssh user@hostname " cat - | xbstream -x -C &gt; /backup-dir/"

xtrabackup可以使用部分備份,但是隻能在一個表一個檔案的狀況下才能使用,設定mysql選項:innodb_file_per_table。

還原部分備份使用表導入的方式,而不是—copy-back選項。

盡管很多場景下可以通過直接複制檔案的方式,但是會産生一緻性問題不建議使用。

部分備份有3個選項可以使用:

--include:設定正規表達式的格式,比對的就備份

--table-file:在檔案中指定要備份的表,然後通過這個選項傳入檔案

--database:指定資料庫清單

使用include方式

include 方式資料庫名也可以比對:

$ innobackupex --include='^mydatabase[.]mytable' /path/to/backup                 

這個選項是傳給xtrabackup –tables,所有的資料庫目錄都會被建立,但是裡面可能是空的。

使用tables-file方式

如:

$ echo "mydatabase.mytable" &gt; /tmp/tables.txt

$ innobackupex --tables-file=/tmp/tables.txt /path/to/backup

這個選項是應用xtrabackup –tablefile,隻有比對到表的資料庫目錄才會被建立

使用database方式

innobackupex可以傳遞用空格隔開的數組,格式為:databasename[.tablename]

$ innobackupex --databases="mydatabase.mytable mysql" /path/to/backup

注意:--databasees選項隻會對非innodb引擎表和frm檔案産生影響,對于innodb資料檔案總是備份的

部分備份的預備需要使用—export:

$ innobackupex --apply-log --export /path/to/partial/backup

會出現以下,是因為innodb表儲存了資料檔案但是沒有儲存frm檔案。

111225  0:54:06  InnoDB: Error: table 'mydatabase/mytablenotincludedinpartialb'

InnoDB: in InnoDB data dictionary has tablespace id 6,

InnoDB: but tablespace with that id or name does not exist. It will be removed from data dictionary.

之後會發現生成了.exp和.cfg檔案。exp檔案适用于percona server,cfg适用于mariadb和mysql。mariadb 10.0可以直接通過ibd和frm檔案import。mysql 5.6之後可以不使用cfg來進行import,cfg如果存在會被用來做表結構的驗證。

在已經預備好的備份上,可以使用—export和—apply-log建立.exp檔案。

先建立一個表,表結構需要和被還原的一樣。

OTHERSERVER|mysql&gt; CREATE TABLE mytable (...) ENGINE=InnoDB;

然後discard表空間

OTHERSERVER|mysql&gt; ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

之後把檔案複制到相應的目錄下(注意檔案的所有者和檔案權限),需要檔案.ibd,.exp或者.cfg檔案(.cfg檔案使用者mysql5.6)。

然後import表空間

OTHERSERVER|mysql&gt; ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

窄備份指不備份secondary索引資料。這樣可以減少備份的大小。缺點就是需要重建索引,會很慢。

$ innobackupex --compact /data/backups

建立了之後檢視xtrabackup_checkpoint

to_lsn =2888984349

last_lsn =2888984349

compact =1

compact=1說明該備份是窄備份。

在預備窄備份的時候需要使用—rebuild-indexes來重新建立索引

$ innobackupex --apply-log --rebuild-indexes /data/backups/2013-02-01_10-29-48

從輸出上可以看到索引被重建

130201 10:40:20  InnoDB: Waiting for the background threads to start

Rebuilding indexes for table sbtest/sbtest1 (space id: 10)

  Found index k_1

  Dropping 1 index(es).

  Rebuilding 1 index(es).

Rebuilding indexes for table sbtest/sbtest2 (space id: 11)

  Found index c

  Found index k

  Found index c_2

  Dropping 4 index(es).

  Rebuilding 4 index(es).

對于增量備份的應用可以先不重建索引,在應用最後一個差異備份的時候使用—rebuild-index來建立索引,每次都應用都重建索引太花時間。

注意:為了重建速度,可以使用并發建立索引,使用參數—rebuild-threads指定并發數。

窄備份還原和全備還原一樣直接使用—copy-back選項。

Stream模式下,Xtrabackup的STDOUT可以指定tar或者xbstream格式輸出。

流允許,其他程式過濾備份輸出,提供更大的靈活存儲backup。

使用流特性,需要指定—stream選項

$ innobackupex --stream=tar /tmp

innobackupex會用子程式啟動xtrabackup –log-stream 定向到臨時檔案,然後使用xbstream把所有資料檔案steam到STDOUT。

當壓縮啟動,xtrabackup壓縮所有輸出資料,但是中繼資料和非innodb檔案不能被壓縮。現在唯一支援的壓縮算法是quicklz。會生産qpress歸檔格式的檔案。

使用xbstream可以平法複制壓縮可以提高備份速度。

使用xbstream流備份:

$ innobackupex --stream=xbstream /root/backup/ &gt; /root/backup/backup.xbstream

使用流壓縮:

$ innobackupex --stream=xbstream --compress /root/backup/ &gt; /root/backup/backup.xbstream

解包:

$ xbstream -x &lt;  backup.xbstream -C /root/backup/

流壓縮并備份到另外一台機器:

$ innobackupex --compress --stream=xbstream /root/backup/ | ssh user@otherhost "xbstream -x -C /root/backup/"

使用tar備份:

$ innobackupex --stream=tar /root/backup/ &gt; /root/backup/out.tar

使用tar流并備份到其他伺服器

$ innobackupex --stream=tar ./ | ssh user@destination \ "cat - &gt; /data/backups/backup.tar"

提取tar流,需要加i參數

$ tar -xizf backup.tar.gz

也可以壓縮流

$ innobackupex --stream=tar ./ | gzip - &gt; backup.tar.gz

$ innobackupex --stream=tar ./ | bzip2 - &gt; backup.tar.bz2

有2個選項用于從複制環境下備份

slave-info

--slave-info,會列印binary log的位置和master server名,并且以change master的方式寫到xtrabackup_slave_info中。

safe-slave-backup

--safe-slave-backup,為了保證複制狀态的一緻性,這個選項會關閉slave sql線程,等待直到SHOW STATUS 中的Slave_open_temp_tabls為了才啟動備份。如果等待時間超過—safe-slave-backup-timeout就會報錯預設300秒。備份成功後 slave sql thread會自動啟動。

使用parallel和compress-threads加速

當有多個檔案時,可以使用使用—parallel加速備份,這個選項會指定xtrabackup備份檔案的線程數。

$ innobackupex --parallel=4 /path/to/backup

如果使用xbstream可以考慮通過—compress-threads加速壓縮程序,預設為1.

$ innobackupex --stream=xbstream --compress --compress-threads=4 ./ &gt; backup.xbstream

使用rsync加速

為了加速複制過程,最小化FLUSH TABLES WITH READ LOCK堵塞時間,使用innobackupex –rsync。使用了這個選項所有檔案都會在一個cp指令裡面,而不是每個檔案一個cp。并且innobackupex會調用2次 rsync,一次在執行FLUSH TABLES WITH READ LOCL之前,一次在之後。第二次執行的時候會把第一次之後的修改過的資料。

盡管innobackupex不會堵塞資料庫操作,但是備份終會消耗系統資源。為了減少資源消耗,可以使用—throttle來限制每秒鐘讀寫對次數。

使用xtrabackup來導出指定表,然後導入到XtraDB或者Mysql 5.6(測試可以的導入mariadb 10.0)

mariadb 10.0可以直接複制 ibd然後通過import tablespace倒入。

導出表

導出表使用—export選項:

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

會在發現多了一個.exp檔案和.cfg檔案(用于不同的mysql版本)

$ find /data/backups/mysql/ -name export_test.*

/data/backups/mysql/test/export_test.exp

/data/backups/mysql/test/export_test.ibd

/data/backups/mysql/test/export_test.cfg

導入表

和mysql手冊中介紹的時間點還原一樣,xtrabackup也是通過binary log進行時間點還原。

先進行備份

$ innobackupex /path/to/backup --no-timestamp

然後進行預備

$ innobackupex --apply-log /path/to/backup

在伺服器中找出操作binary log和目前binary log狀态

mysql&gt; SHOW BINARY LOGS;

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

| Log_name         | File_size |

| mysql-bin.000001 |       126 |

| mysql-bin.000002 |      1306 |

| mysql-bin.000003 |       126 |

| mysql-bin.000004 |       497 |

mysql&gt; SHOW MASTER STATUS;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

| mysql-bin.000004 |      497 |              |                  |

然後檢視 xtrabackup_binlog_info确定備份的binary log位置:

$ cat /path/to/backup/xtrabackup_binlog_info

mysql-bin.000003      57

還原資料庫

$ innobackupex --copy-back /path/to/backup

然後使用mysqlbinlog取出binary log中的記錄,然後輸出到檔案

$ mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 \

    --start-position=57 &gt; mybinlog.sql

然後檢查輸出的檔案,确定要恢複到的位置,然後執行恢複

    --start-position=57 --stop-datetime="11-12-25 01:00:00" | mysql -u root -p

在備份的時候,為了保證資料一緻性,在備份非innodb表的之前會先使用FLUSH TABLES WITH READ LOCK,這個語句在有長時間查詢運作的情況下也能執行,但是其他的所有事都會被堵塞,Waiting for table flush或者Waiting for master to send event,這個時候不應該kill FLUSH TABLES WITH READ LOCK,而是應該kill掉那個大的查詢。因為當有大的查詢的時候,FLUSH TABLES WITH READ LOCK會被卡住。

為了能夠避免這種事情發生需要實作2個事情:

1.innobackupex等一個好的時機運作

2.innobackupex可以kiil 所有查詢或者隻能存在SELECT查詢。即kill所有阻止擷取全局鎖的查詢。

等待查詢完成

為了避免innobackupex等待FLUSH TABLES WITH READ LOCK執行太長時間,可以使用innobackupex –lock-wait-timeout,可以用來限制等待時間,一旦逾時就會報錯退出。

另外一個是設定等待查詢的類型,innobackupex  --lock-wait-query-type 可取的值是all或者update,如果為all那麼會等待所有長運作查詢完成,如果是update,會等待除select之外的DML完成。

--lock-wait-threshold用來定義 --locl-wait-query-type中的長運作查詢,如果超過--lock-wait-threshold都算長運作查詢。

Kill堵塞查詢

innobackupex可以kill所有阻止擷取全局鎖的查詢。

可以通過指定--kill-long-queries-timeout用來指定執行FLUSH TABLES WITH READ LOCK後還可以執行的時間,0為不kill,--kill-long-query-type用來指定逾時之後,kill的查詢類型,可以是all或者select。

例如:

$ innobackupex --lock-wait-threshold=40 --lock-wait-query-type=all --lock-wait-timeout=180 --kill-long-queries-timeout=20 --kill-long-query-type=all /data/backups/

innobackupex是perl腳本,封裝了xtrabackup和tar4ibd的功能。

備份

如果沒有指定,innobackupex預設認為是備份模式。

預設innobackupex會以--suspend-at-end啟動xtrabackup,來複制innodb檔案。當xtrabackup複制完成,innobackupex發現建立的xtrabckup_suspended_2檔案,就執行FLUASH TABLES WITH READ LOCL複制其他檔案。

xtrabackup的确定,如果運作的時候沒有帶ibbackup參數,那麼innobackupex會從xtrabackup_binary上找,然後讀取要啟動xtrabackup的二進制檔案。否則隻能通過連接配接mysql服務确定使用的二進制檔案。如果不能連接配接就錯誤。

決定好二進制檔案之後,斷開連接配接以二進制方式啟動binary。

如果不是增量備份,連接配接到服務,如果啟動了--safe-slave-backup等待slave,然後擷取全局read lock,防止其他引擎的表被修改,讀鎖隻鎖定非innodb表,并且在innodb表複制完資料和日志後進行。

當所有檔案備份完之後,恢複ibbackup并等待完成對事務複制,複制在備份期間生産的事務。然後釋放表鎖,slave啟動并且連接配接關閉,然後删除xtrabckup_suspended_2檔案。

還原

還原資料庫使用 --copy-back選項

然後複制MyISAM表,索引,然後複制innodb表和索引,最後日志檔案。複制的時候會保留檔案屬性,需要修改使用者所有者。

恢複除了--cop-back也可以使用--move-back,不同的是一個是複制,一個是移動。

Xtrabackup有4個binary:Xtrabackup,Xtrabackup_51,Xtrabackup_55,Xtrabackup_56。

服務和binary對照:

Server

xtrabackup binary

MySQL 5.1.*

xtrabackup_51

MySQL 5.1.* with InnoDB plugin

xtrabackup

MySQL 5.5.*

xtrabackup_55

MySQL 5.6.*

xtrabackup_56

MariaDB 5.1.*

MariaDB 5.2.*

MariaDB 5.3.*

MariaDB 5.5.*

MariaDB 10.0.*

Percona Server 5.0

Percona Server 5.1

Percona Server 5.5

Percona Server 5.6

所有的Xtrabackup配置都是通過選項設定,可以是指令行參數,也可以通過配置檔案my.cnf。

xtrabackup會讀取[mysql],[xtrabackup]選項,若Xtrabackup讀入,會覆寫[mysqld]的選項。

并不是所有的配置都要寫入配置檔案,寫配置檔案隻是為了友善。

xtrabackup 并不接受和mysqld一樣的文法,有些文法不支援如,--set-variable=&lt;variable&gt;=&lt;value&gt;要用 --variable=value文法。

xtrabackup并不需要特殊的存儲,但是如果是NFS并不是以sync挂載,那麼在執行fsync的時候可能并不是真正的同步資料。

使用xtrabackup建立全備需要指定選項-backup,還需要指定--target_dir,如果target不存在,會建立一個,如果存在那麼如果是空的就會成功,如果不是空的,不會覆寫已存在檔案,并且報錯。

主要完成2個任務:

1.開啟一個log copy線程,用來監控innodb日志檔案(ib_logfile*),如果修改就複制到xtrabackup_logfile,因為複制會持續很長時間,是以恢複程序需要所有從備份開始到結束的所有日志。

2.複制innodb資料檔案到目标目錄,這個并不是簡單的複制,是和innodb引擎一樣,從資料目錄中一頁一頁的複制。

當資料檔案完成複制,xtrabackup會停止對日志的複制,并在目标目錄中建立xtrabackup_checkpoint檔案。

$ xtrabackup --backup --datadir=/var/lib/mysql/ --target-dir=/data/backups/mysql/

在備份輸出的時候,可以看到日志的複制。

&gt;&gt; log scanned up to (3646475465483)

&gt;&gt; log scanned up to (3646475517369)

&gt;&gt; log scanned up to (3646475581716)

&gt;&gt; log scanned up to (3646475636841)

&gt;&gt; log scanned up to (3646475718082)

&gt;&gt; log scanned up to (3646475988095)

&gt;&gt; log scanned up to (3646476048286)

&gt;&gt; log scanned up to (3646476102877)

&gt;&gt; log scanned up to (3646476140854)

[01] Copying /usr/local/mysql/var/ibdata1

     to /usr/local/mysql/Backups/2011-04-18_21-11-15/ibdata1

[01]        ...done

注意:日志複制線程是每秒檢查一次,檢視是否有新的日志被寫入,因為日志檔案是被回繞寫的,是以日志複制線程要更上日志檔案的修改,如果沒有複制日志被覆寫了,那麼就會報錯。

備份的時間長短依賴于資料庫的大小,然後時間都可以停止資料庫,因為不會去修改資料庫資料。

備份完資料庫之後,下一步是預備資料庫,因為資料檔案在某個時間點上,并不是一緻的,是以需要預備讓資料檔案在某個時間點一緻,--prepare就是來完成,讓資料檔案保持一緻性。

注意:在innobackupex --apply-log的時候,innodb就是自動讀取配置檔案back-my.cnf就是使用--defaults-file=xxx來指定一個配置檔案,傳遞給xtrabackup用于預備資料庫備份。

可以在任何機器上進行預備,沒必要在原伺服器或者要還原的伺服器上進行。

在恢複階段,xtrabackup嵌入了修改過的innodb,禁止了innodb的标準安全監察,如日志檔案大小是否準确。

prepare階段就是使用這個嵌入的innodb來做通過日志檔案對資料檔案進行crash恢複。

xtrabackup --prepare --target-dir=/data/backups/mysql/

當預備完成就會有以下輸出:

101107 16:40:15  InnoDB: Shutdown completed; log sequence number &lt;LSN&gt;

現在備份一緻性已經沒問題了,可以準備還原,但是為了能夠更快還原,可以再執行一次預備,第一次執行的時候隻讓資料檔案保持一緻性,并沒有建立日志檔案。第二次執行的時候會建立日志檔案。如果第一次預備後還原,啟動服務,服務會自動建立日志檔案,但是比較滑時間。當第二次運作預備的時候有一下輸出:

$ xtrabackup --prepare --target-dir=/data/backups/mysql/

xtrabackup: This target seems to be already prepared.

xtrabackup: notice: xtrabackup_logfile was already used to '--prepare'.

101107 16:54:10  InnoDB: Log file ./ib_logfile0 did not exist: new to be created

InnoDB: Setting log file ./ib_logfile0 size to &lt;SIZE&gt; MB

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

101107 16:54:10  InnoDB: Log file ./ib_logfile1 did not exist: new to be created

InnoDB: Setting log file ./ib_logfile1 size to &lt;SIZE&gt; MB

101107 16:54:15  InnoDB: Shutdown completed; log sequence number 1284108

如果是第二次運作,運作時會有以下提示:

不推薦在執行預備的時候終端過程,這樣可能會導緻資料檔案異常。

如果視圖要加入增量備份,那麼使用--apply-log-only,不然加不上增量備份。

xtrabackup沒有什麼功能來還原備份,可以直接通過rsync,cp來還原資料庫

注意:注意保持datadir必須是空的,并且mysql服務是停止的。不能還原到已經在運作的mysql服務中。

通過rsync還原:

$ rsync -avrP /data/backup/ /var/lib/mysql/

還原後注意修改所有者

注意:xtrabackup隻備份innodb資料檔案,不會備份其他引擎的表,和frm檔案。如果要對整個庫備份還原可以使用innodbbackupex

增量備份原理

xtrabackup和innobackupex都可以實作增量備份,也就是說隻備份修改過的資料。

增量備份實作,依賴于innodb頁中的LSN(log sequence number)增量備份會複制比之前的增量或者全備新的lsn頁。

有2個算法找這樣的頁:

1.直接掃描資料頁,并複制大于上次全備或者增量的lsn的頁

增量備份并不是比較全備的資料,如果沒有上次的備份,可以使用指定--incremental-lsn來進行增量備份。增量備份隻會備份比指定lsn大的資料頁。當然需要全備來還原增量備份,不然增量備份是沒有意義的。

建立增量備份

首先建立全備

xtrabackup --backup --target-dir=/data/backups/base --datadir=/var/lib/mysql/

檢視xtrabackup_checkpoint資訊:

然後進行增量備份:

xtrabackup --backup --target-dir=/data/backups/inc1 \

--incremental-basedir=/data/backups/base --datadir=/var/lib/mysql/

在/data/backups/inc1下包含了delta檔案,如果ibdata1.delta和test/table1.ibd.delta,檢查增量備份的xtrabackup_checkpoint:

to_lsn =1291340

在做一個增量備份:

xtrabackup --backup --target-dir=/data/backups/inc2 \

--incremental-basedir=/data/backups/inc1 --datadir=/var/lib/mysql/

預備增量備份和在innobackupex一樣,先不復原方式應用全備,然後應用增量備份。

在innobackupex上使用 --apply-log-only來重做,但不復原。

現在已有備份:

/data/backups/base

/data/backups/inc1

/data/backups/inc2

預備全備,不復原未送出事務:

xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base

成功後輸出:

101107 20:49:43  InnoDB: Shutdown completed; log sequence number 1291135

應用第一個增量備份:

xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \

--incremental-dir=/data/backups/inc1

增量備份被應用到/data/backups/base,應用後輸出:

incremental backup from 1291135 is enabled.

xtrabackup: cd to /data/backups/base/

xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(1291340)

Applying /data/backups/inc1/ibdata1.delta ...

Applying /data/backups/inc1/test/table1.ibd.delta ...

.... snip

101107 20:56:30  InnoDB: Shutdown completed; log sequence number 1291340

應用最後一個增量備份:

xtrabackup --prepare --target-dir=/data/backups/base \

--incremental-dir=/data/backups/inc2

注意:除了最後一個外其他的都要使用--apply-log-only,如果最後一個也用了--apply-log-only,就還原了檔案還是一直的,但是沒有復原未送出事務,當服務啟動的時候會自動復原未送出事務。

在percona server 5.6.11-60.3加入了新功能,為xtradb日志歸檔,這個功能是,在老的日志檔案被重寫之前會被複制,是以儲存了所有的redo日志。

歸檔日志的檔案格式,ib_log_archive_&lt;LSN&gt;,LSN表示這個歸檔檔案開始的lsn。

ib_log_archive_00000000010145937920

ib_log_archive_00000000010196267520

這個功能由innodb_log_archive啟動,儲存的位置為innodb_log_arch_dir(預設為資料檔案夾)。

建立一個全備

xtrabackup_56 --backup --target-dir=/data/backup/ --datadir=/var/lib/mysql/

xtrabackup_checkpoint如下:

to_lsn =1546908388

last_lsn =1574827339

compact =0

xtrabackup_56 --prepare --target-dir=/data/backup/ --innodb-log-arch-dir=/data/archived-logs/

執行後檢視xtrabackup_checkpoint,backup-type被修改:

backup_type = full-prepared

另外也可以指定時間點預備:

xtrabackup_56 --prepare --target-dir=/data/backup/ --innodb-log-arch-dir=/data/archived-logs/ --to-archived-lsn=5536301566

當服務使用innodb_file_per_table的時候,xtrabackup支援部分備份。

使用--tables進行部分備份

使用--tables備份,該選項的值是一個正規表達式,比對的表名都會被備份。

備份test下的所有表:

$ xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ \

--tables="^test[.].*"

備份test.t1表

--tables="^test[.]t1"

使用--tables-file進行備份

--tables-file指向一個選項包了表名,如:

$ echo “mydatabase.mytable” &gt; /tmp/tables.txt $ xtrabackup –backup –tables-file=/tmp/tables.txt

在prepare的時候會出現很多warnings,是因為表存在在innodb,但是對于的ibd不存在,這些表在還原備份啟動innodb的時候會被删除。

InnoDB: Reading tablespace information from the .ibd files...

101107 22:31:30  InnoDB: Error: table 'test1/t'

窄備份是在備份的是否不備份secondary index讓備份檔案邊小。窄備份可以通過--compact啟動。

$ xtrabackup --backup --compact --target-dir=/data/backups

檢視備份後的xtrabackup_checkpoint,compact為1說明是窄備份

在預備的時候為了重建索引,需要使用選項--rebuild-indexes

$ xtrabackup --prepare --rebuild-indexes /data/backups/

輸出:

[01] Checking if there are indexes to rebuild in table sakila/city (space id: 9)

[01]   Found index idx_fk_country_id

[01]   Rebuilding 1 index(es).

[01] Checking if there are indexes to rebuild in table sakila/country (space id: 10)

[01] Checking if there are indexes to rebuild in table sakila/customer (space id: 11)

[01]   Found index idx_fk_store_id

[01]   Found index idx_fk_address_id

[01]   Found index idx_last_name

[01]   Rebuilding 3 index(es).

使用--rebuild-threads指定重建的線程數,加快重建速度:

$ xtrabackup --prepare --rebuild-indexes --rebuild-threads=16 /data/backups/

Starting 16 threads to rebuild indexes.

[09] Checking if there are indexes to rebuild in table sakila/city (space id: 9)

[09]   Found index idx_fk_country_id

[10] Checking if there are indexes to rebuild in table sakila/country (space id: 10)

[11] Checking if there are indexes to rebuild in table sakila/customer (space id: 11)

[11]   Found index idx_fk_store_id

[11]   Found index idx_fk_address_id

[11]   Found index idx_last_name

[11]   Rebuilding 3 index(es).

--throttle用來控制每秒io次數,一次io,1MB。

Percona XtraBackup User Manual 閱讀筆記 XtraBackup

如果在backup模式下,這個選項用來控制讀寫對的每秒次數。

預設不會節流,xtrabackup會讀寫是盡量快的方式。

最典型的例子innobackupex,innobackupex是perl腳本調用xtrabackup來執行備份。

xtrabackup提取了inoodb的事務日志中送出事務,對于到binary log的位置。使用這個位置可以啟動一個新的複制slave或者恢複一個時間點備份。

如果備份是一個來至于binary log啟動的日志,xtrabackup會建立一個檔案xtrabackup_binlog_info裡面包含了,binary log檔案名和位置。資訊也會寫在xtrabackup_binlog_pos_innodb,這個檔案隻會在隻有xtradb或者innodb情況下才會準确。其他情況下應該使用xtrabackup_binlog_info。

在mariadb 10.0中可以直接通過ibd檔案導入表。

先查找是否有這個檔案存在

然後導出表

$ xtrabackup --prepare --export --target-dir=/data/backups/mysql/

會産生exp檔案

注意:mysql使用cfg檔案,這個檔案包含了innodb字典dump。這個格式和exp檔案的不同,exp檔案用于xtradb。嚴格來說cfg在mysql 5.6和percona 5.6之後是可以不用的,如果存在cfg檔案,那麼innodb會通過cfg檔案做schema驗證 。

導入表,在percona server使用xtradb,需要設定innodb_import_table_from_xtrabackup設定為可用,mysql5.6隻要表結構一樣都可以導入。

1.執行alter table discard tablespace

2.複制上一步生成的檔案到對于的資料庫目錄

3.執行alter table import tablespace導入

這個功能減少了服務warm up的時間,在重新開機的時候直接導入ib_lru_dump檔案中的資料,在備份的時候會自動備份。

Percona XtraBackup User Manual 閱讀筆記 XtraBackup

如果my.cnf配置了,percona server啟動了innodb_buffer_pool_resotre_at_startup=1那麼這個功能會自動啟動。

1.在32位的系統下如果xtrabackup_logfile大于4gb那麼--prepare會報錯

2.在第一次執行--prepare的時候不會生成ib_logfile*

3.xtrabackup隻複制資料檔案和日志,不會複制表定義,frm檔案。

4.xtrabackup不支援--set-variable這種格式設定my.cnf

xtrabackup是基于innodb的crash恢複功能。複制innodb資料檔案,但是資料是不一緻的,然後使用crash恢複讓資料檔案一直。

當innodb啟動會去檢查資料檔案和日志檔案,然後重做已送出事務,執行未送出事務。

xtrabackup記下LSN,然後啟動,複制資料檔案。同時xtrabackup啟動一個背景程序用來監控日志檔案,然後複制修改,這個程序在備份期間一直是運作的,因為日志檔案時回繞的,避免資料被覆寫無法恢複。直到備份完成。

第二階段就是預備階段,xtrabackup通過執行crash恢複,應用日志檔案到資料檔案上。這個過程在xtrabackup中實作。innobackupex增加了功能,會對myisam和.frm進行複制。innobackupex啟動xtrabackup,等待複制innodb結束,然後執行FLUSH TABLES WITH READ LOCK,停止對mysql資料的修改。複制非innodb引擎表,知道複制完成,然後釋放鎖。

這樣在prepare階段後,innodb和非innodb互相保持了一緻性。innodb會一直redo,直到備份完成。這個時間剛剛好和FLUSH TABLES WITH READ LOCK時間一直,是以innodb和非innodb是保持同步的。

建立備份

備份完成

100313 02:43:07  innobackupex: completed OK!

預備備份

使用--apply-log來預備,使用--user-memory來加快預備速度

$ innobackupex --use-memory=4G --apply-log /data/backups/2010-03-13_02-42-44/

完成

100313 02:51:02  innobackupex: completed OK!

還原備份

使用--copy-back來還原備份

innobackupex --copy-back /data/backups/2010-03-13_02-42-44/

## Use chmod to correct the permissions, if necessary!

還原的位子由my.cnf中的datadir決定。

注意修改檔案所有者

tar使用例子

是用留備份歸檔到檔案 ‘backup.tar’

$ innobackupex --stream=tar ./ &gt; backup.tar

壓縮歸檔檔案

加密備份

$ innobackupex --stream=tar . | gzip - | openssl des3 -salt -k "password" &gt; backup.tar.gz.des3

把備份複制到遠端

$ innobackupex --stream=tar ./ | ssh user@desthost "cat - &gt; /data/backups/backup.tar"

使用netcat複制到遠端

## On the destination host:

$ nc -l 9999 | cat - &gt; /data/backups/backup.tar

## On the source host:

$ innobackupex --stream=tar ./ | nc desthost 9999

和上面一樣隻是一樣完成

$ ssh user@desthost "( nc -l 9999 &gt; /data/backups/backup.tar &amp; )" \

&amp;&amp; innobackupex --stream=tar ./  |  nc desthost 9999

限制傳輸速度為10MB/s 需要pv工具。可以通過apt-get 安裝

$ innobackupex --stream=tar ./ | pv -q -L10m \

| ssh user@desthost "cat - &gt; /data/backups/backup.tar"

在備份的時候計算checksum

$ nc -l 9999 | tee &gt;(sha1sum &gt; destination_checksum) &gt; /data/backups/backup.tar

$ innobackupex --stream=tar ./ | tee &gt;(sha1sum &gt; source_checksum) | nc desthost 9999

## compare the checksums

$ cat source_checksum

65e4f916a49c1f216e0887ce54cf59bf3934dbad  -

$ destination_checksum

備份并歸檔為‘backup.xbstream

innobackupex --stream=xbstream ./ &gt; backup.xbstream

使用壓縮歸檔

innobackupex --stream=xbstream --compress ./ &gt; backup.xbstream

解包

xbstream -x &lt;  backup.xbstream

把備份發送到其他目錄

innobackupex --compress --stream=xbstream ./ | ssh user@otherhost "xbstream -x"

并發壓縮歸檔

先建立一個全備:

全備會生成一個時間戳的子目錄,備份在子目錄裡,如/path/to/backup/dir/2011-12-24_23-01-00/,并記為$FULLBACK

生成的目錄為:/path/to/inc/dir/2011-12-25_00-01-00/并記為$INCREMENTALBACKUP

innobackupex --apply-log --redo-only $FULLBACKUP \

 --use-memory=1G --user=USER --password=PASSWORD

--user-memory可以加速預備速度。

111225 01:10:12 InnoDB: Shutdown completed; log sequence number 91514213

然後應用增量

innobackupex --apply-log --redo-only $FULLBACKUP

 --incremental-dir=$INCREMENTALBACKUP

 --use-memory=1G --user=DVADER --password=D4RKS1D3

因為是應用到 $FULLBACK下的,是以不再增量備份檔案夾下。

如果還原多個增量備份,但是忘記了備份順序可以檢視xtrabackup_checkpoint檔案

如:

一旦都預備好之後,就可以復原未送出事務,然後還原備份使用了

innobackupex-1.5.1 --apply-log $FULLBACKUP --use-memory=1G \

  --user=$USERNAME --password=$PASSWORD

帶--compress建立壓縮備份

$ innobackupex --compress /data/backup

如果想要加快速度,可以使用--compress-threads加速

$ innobackupex --compress --compress-threads=4 /data/backup

[01] Compressing ./imdb/comp_cast_type.ibd to /data/backup/2013-08-01_11-24-04/./imdb/comp_cast_type.ibd.qp

[01] Compressing ./imdb/aka_name.ibd to /data/backup/2013-08-01_11-24-04/./imdb/aka_name.ibd.qp

130801 11:50:24  innobackupex: completed OK

預備

在預備之前先要使用qpress解壓

$ for bf in `find . -iname "*\.qp"`; do qpress -d $bf $(dirname $bf) &amp;&amp; rm $bf; done

在xtrabackup2.1.4之後也可以使用--decompress解壓

$ innobackupex --decompress /data/backup/2013-08-01_11-24-04/

這個選項加壓檔案原來的檔案會被替換為解壓後的檔案。

注意:使用--decompress需要安裝qpress,并且--parallel可以和--decompress一起使用,加速解壓縮。

然後使用--apply-log預備

$ innobackupex --apply-log /data/backup/2013-08-01_11-24-04/

使用--copy-back還原資料庫

$ innobackupex --copy-back /data/backups/2013-08-01_11-24-04/

--copy-back讀取複制到my.cnf中的datadir的值

之後修改檔案的所有者

之後再啟動服務

xtrabackup可以部分備份,這個也讓獨立區的備份還原變成可能,隻要啟動innodb_file_per_table。

先建立一個分區表

create table t.tb_part (id int ,v int) partition by hash(id) partitions 4;

然後插入資料

insert t.tb_part values(1,1),(2,1),(3,1),(4,1);

這樣保證每個分區都有1條記錄。

使用innobackupex --include進行備份,還有很多其他方法進行部分備份:

innobackupex --user=root  --include='^t[.]tb_part' /home/tiansign/mysql_backup

和獨立表還原類似,使用--export進行預備

innobackupex --apply-log --export /home/tiansign/mysql_backup/2014-08-19_23-25-55/

ls

tb_part.frm       tb_part#P#p0.ibd  tb_part#P#p2.cfg  tb_part#P#p3.exp

tb_part.par       tb_part#P#p1.cfg  tb_part#P#p2.exp  tb_part#P#p3.ibd

tb_part#P#p0.cfg  tb_part#P#p1.exp  tb_part#P#p2.ibd

tb_part#P#p0.exp  tb_part#P#p1.ibd  tb_part#P#p3.cfg

有類似如下輸出

xtrabackup: export option is specified.

xtrabackup: export metadata of table 't/tb_part#P#p0' to file `./t/tb_part#P#p0.exp` (1 indexes)

xtrabackup:     name=GEN_CLUST_INDEX, id.low=58, page=3

xtrabackup: export metadata of table 't/tb_part#P#p2' to file `./t/tb_part#P#p2.exp` (1 indexes)

xtrabackup:     name=GEN_CLUST_INDEX, id.low=60, page=3

xtrabackup: export metadata of table 't/tb_part#P#p3' to file `./t/tb_part#P#p3.exp` (1 indexes)

xtrabackup:     name=GEN_CLUST_INDEX, id.low=61, page=3

xtrabackup: export metadata of table 't/tb_part#P#p1' to file `./t/tb_part#P#p1.exp` (1 indexes)

xtrabackup:     name=GEN_CLUST_INDEX, id.low=59, page=3

這裡主要介紹maridb 10.0的方法,也适用于mysql5.6

首先建立表結構:

create table test.tb_part (id int ,v int) partition by hash(id) partitions 4;

create table test.p3 (id int ,v int) ;

然後discard

alter table test.p3 discard tablespace;

複制cfg和ibd到資料庫目錄下(在mariadb 10.0之後可以不用cfg檔案,直接使用ibd檔案)

cp tb_part#P#p3.ibd /home/db/test/p3.ibd

然後修改所有者

chown mysql:mysql /home/db/test/p3.ibd

最後 import 表

alter table test.p3 import tablespace;

最後通過exchange partition方式把表資料交換到分區表中

alter table test.tb_part exchange partition p3 with table test.p3;

驗證

select *from test.tb_part;

需要的東西

1.TheMaster伺服器

       a.需要安裝mysql并且能公國tcp/ip通路

       b.配置了SSH服務

       c.有個系統賬号,并有一些權限

       d.有個資料庫賬号,也有相應的權限

       e.服務的binlog啟動,并且server-id為1

2.TheSlave,另一個系統安裝了mysql,其他都和TheMaster一樣,但是server-id要為2

3.2個系統都要安裝xtrabackup

步驟1:建立一個備份并準備

TheMaster$ innobackupex --user=yourDBuser --password=MaGiCdB1 /path/to/backupdir

完成之後預備

TheMaster$ innobackupex --user=yourDBuser --password=MaGiCdB1 /

           --apply-log /path/to/backupdir/$TIMESTAMP/

如果你有特定的配置檔案,那麼通過--defaults-file=XXXX/my.cnf指定。預設使用備份目錄下的backup-my.cnf。

步驟2:把備份複制到TheSlave

使用rsync來同步備份檔案

TheMaster$ rsync -avprP -e ssh /path/to/backupdir/$TIMESTAMP TheSlave:/path/to/mysql/

關閉,mysql服務,并儲存原先的資料庫

TheSlave$ mv /path/to/mysql/datadir /path/to/mysql/datadir_bak

然後把備份複制到mysql配置的datadir下

TheSlave$ mv /path/to/mysql/$TIMESTAMP /path/to/mysql/datadir

修改檔案所有者

TheSlave$ chown mysql:mysql /path/to/mysql/datadir

步驟3:配置Master

配置slave,master連接配接賬号

TheMaster|mysql&gt;GRANT REPLICATION SLAVE ON*.*  TO'repl'@'$slaveip'

 IDENTIFIED BY'$slavepass';

保證TheSlave可以通過這個賬号連接配接到TheMaster

TheSlave$ mysql --host=TheMaster --user=repl --password=$slavepass

驗證權限

mysql&gt; SHOW GRANTS;

步驟4:配置Slave

先複制master 上的配置檔案

TheSlave$ scp user@TheMaster:/etc/mysql/my.cnf /etc/mysql/my.cnf

然後修改server-id=2

server-id=2

啟動slave上的服務

步驟5:啟動複制

先檢視xtrabackup_binlog_info來确定binary log的位置

TheSlave$ cat /var/lib/mysql/xtrabackup_binlog_info

TheMaster-bin.000001     481

使用CHANGE MASTER,賬号密碼使用剛才在master中申請的賬号。

TheSlave|mysql&gt;CHANGE MASTER TO

                MASTER_HOST='$masterip',

                MASTER_USER='repl',

                MASTER_PASSWORD='$slavepass',

                MASTER_LOG_FILE='TheMaster-bin.000001',

                MASTER_LOG_POS=481;

然後啟動slave

TheSlave|mysql&gt; START SLAVE;

步驟6:檢查

TheSlave|mysql&gt; SHOW SLAVE STATUS \G

         ...

         Slave_IO_Running: Yes

         Slave_SQL_Running: Yes

         Seconds_Behind_Master: 13

io和SQL都要運作,Seconds_behind_master是現在slave執行的語句在master上是13秒之前的資料。這個是master和slave之間的延遲。

過程基本上和上面類似

1.備份slave,要帶上--slave-info,帶上這個選項會産生一個xtrabackup_slave_info其中的master的binary log和位置都記錄在這個檔案上

TheSlave$ innobackupex --user=yourDBuser --password=MaGiCiGaM /

          --slave-info /path/to/backupdir

2.預備,增加了use-memory來加快預備速度

TheSlave$ innobackupex --apply-log --use-memory=2G /path/to/backupdir/$TIMESTAMP/

3.複制到是slave

rsync -avprP -e ssh /path/to/backupdir/$TIMESTAMP TheNewSlave:/path/to/mysql/datadir

4.在master上,再建立一個賬号,當然也可以使用同一個賬号,隻要能連接配接上就可以

heMaster|mysql&gt;GRANT REPLICATION SLAVE ON*.*  TO'repl'@'$newslaveip'

             IDENTIFIED BY'$slavepass';

5.複制配置檔案,在啟動的時候不啟動複制,并設定server-id為3

TheNEWSlave$ scp user@TheSlave:/etc/mysql/my.cnf /etc/mysql/my.cnf

修改配置檔案

Skip-slave-start

server-id=3

啟動slave的服務

6.通過xtrabackup_slave_info擷取master的日志名和位置

TheNEWSlave|mysql&gt;CHANGE MASTER TO

                   MASTER_HOST='$masterip',

                   MASTER_USER='repl',

                   MASTER_PASSWORD='$slavepass',

                   MASTER_LOG_FILE='TheMaster-bin.000001',

                   MASTER_LOG_POS=481;

啟動slave

<a href="http://www.cnblogs.com/cosiray/archive/2012/03/02/2376595.html">Xtrabackup安裝及使用</a>

<a href="http://www.percona.com/doc/percona-xtrabackup/2.2/index.html">Percona Xtrabackup - Documentation</a>

<a href="http://www.baidu-ops.com/2013/05/26/xtrabackup">xtrabackup原理及實施</a>