<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 ./ > incremental.xbstream
解包方法
xbstream -x < incremental.xbstream
使用本地備份流到遠端并解包
innobackupex --incremental --incremental-lsn=LSN-number --stream=xbstream ./ | /
ssh user@hostname " cat - | xbstream -x -C > /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" > /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> CREATE TABLE mytable (...) ENGINE=InnoDB;
然後discard表空間
OTHERSERVER|mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;
之後把檔案複制到相應的目錄下(注意檔案的所有者和檔案權限),需要檔案.ibd,.exp或者.cfg檔案(.cfg檔案使用者mysql5.6)。
然後import表空間
OTHERSERVER|mysql> 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/ > /root/backup/backup.xbstream
使用流壓縮:
$ innobackupex --stream=xbstream --compress /root/backup/ > /root/backup/backup.xbstream
解包:
$ xbstream -x < 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/ > /root/backup/out.tar
使用tar流并備份到其他伺服器
$ innobackupex --stream=tar ./ | ssh user@destination \ "cat - > /data/backups/backup.tar"
提取tar流,需要加i參數
$ tar -xizf backup.tar.gz
也可以壓縮流
$ innobackupex --stream=tar ./ | gzip - > backup.tar.gz
$ innobackupex --stream=tar ./ | bzip2 - > 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 ./ > 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> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name | File_size |
| mysql-bin.000001 | 126 |
| mysql-bin.000002 | 1306 |
| mysql-bin.000003 | 126 |
| mysql-bin.000004 | 497 |
mysql> 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 > 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=<variable>=<value>要用 --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/
在備份輸出的時候,可以看到日志的複制。
>> log scanned up to (3646475465483)
>> log scanned up to (3646475517369)
>> log scanned up to (3646475581716)
>> log scanned up to (3646475636841)
>> log scanned up to (3646475718082)
>> log scanned up to (3646475988095)
>> log scanned up to (3646476048286)
>> log scanned up to (3646476102877)
>> 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 <LSN>
現在備份一緻性已經沒問題了,可以準備還原,但是為了能夠更快還原,可以再執行一次預備,第一次執行的時候隻讓資料檔案保持一緻性,并沒有建立日志檔案。第二次執行的時候會建立日志檔案。如果第一次預備後還原,啟動服務,服務會自動建立日志檔案,但是比較滑時間。當第二次運作預備的時候有一下輸出:
$ 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 <SIZE> 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 <SIZE> 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_<LSN>,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” > /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。

如果在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檔案中的資料,在備份的時候會自動備份。
如果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 ./ > backup.tar
壓縮歸檔檔案
加密備份
$ innobackupex --stream=tar . | gzip - | openssl des3 -salt -k "password" > backup.tar.gz.des3
把備份複制到遠端
$ innobackupex --stream=tar ./ | ssh user@desthost "cat - > /data/backups/backup.tar"
使用netcat複制到遠端
## On the destination host:
$ nc -l 9999 | cat - > /data/backups/backup.tar
## On the source host:
$ innobackupex --stream=tar ./ | nc desthost 9999
和上面一樣隻是一樣完成
$ ssh user@desthost "( nc -l 9999 > /data/backups/backup.tar & )" \
&& innobackupex --stream=tar ./ | nc desthost 9999
限制傳輸速度為10MB/s 需要pv工具。可以通過apt-get 安裝
$ innobackupex --stream=tar ./ | pv -q -L10m \
| ssh user@desthost "cat - > /data/backups/backup.tar"
在備份的時候計算checksum
$ nc -l 9999 | tee >(sha1sum > destination_checksum) > /data/backups/backup.tar
$ innobackupex --stream=tar ./ | tee >(sha1sum > source_checksum) | nc desthost 9999
## compare the checksums
$ cat source_checksum
65e4f916a49c1f216e0887ce54cf59bf3934dbad -
$ destination_checksum
備份并歸檔為‘backup.xbstream
innobackupex --stream=xbstream ./ > backup.xbstream
使用壓縮歸檔
innobackupex --stream=xbstream --compress ./ > backup.xbstream
解包
xbstream -x < 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) && 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>GRANT REPLICATION SLAVE ON*.* TO'repl'@'$slaveip'
IDENTIFIED BY'$slavepass';
保證TheSlave可以通過這個賬号連接配接到TheMaster
TheSlave$ mysql --host=TheMaster --user=repl --password=$slavepass
驗證權限
mysql> 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>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> START SLAVE;
步驟6:檢查
TheSlave|mysql> 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>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>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>