MySQL DBA備份工具Xtrabackup使用指南(轉)

yantaicuiwei發表於2011-10-10

MySQL DBA備份工具Xtrabackup使用指南(轉)


Xtrabackup 簡介及備份原理說明:

Xtrabackup是由percona開發的一個開源軟體,能夠非常快速地備份與恢復mysql資料庫,且支援線上熱備份(備份時不影響資料讀寫),此軟體可以說是innodb熱備工具ibbackup的一個開源替代品

Xtrabackup中包含兩個工具:

l xtrabackup -用於熱備份innodb,xtradb引擎表的工具,不能備份其他表。

l innobackupex-xtrabackup封裝的perl指令碼,提供了用於myisam(會鎖表)innodb引擎,及混合使用引擎備份的能力。

Xtrabackup可以做什麼

l 線上()備份整個庫的InnoDB, XtraDB

l xtrabackup的上一次整庫備份基礎上做增量備份(innodb only

l 以流的形式產生備份,可以直接儲存到遠端機器上(本機硬碟空間不足時很有用)

MySQL資料庫本身提供的工具並不支援真正的增量備份,二進位制日誌恢復是point-in-time(時間點)的恢復而不是增量備份。Xtrabackup工具支援對InnoDB儲存引擎的增量備份,工作原理如下:1)首先完成一個完全備份,並記錄下此時檢查點的LSN(Log Sequence Number)2)在程式增量備份時,比較表空間中每個頁的LSN是否大於上次備份時的LSN,如果是,則備份該頁,同時記錄當前檢查點的LSN

Xtrabackup上簡單的介紹了一下實現的原理:

首先,在logfile中找到並記錄最後一個checkpoint“last checkpoint LSN”),然後開始從LSN的位置開始複製InnoDBlogfilextrabackup_logfile;接著,開始複製全部的資料檔案.ibd;在複製全部資料檔案結束之後,才停止複製logfile

因為logfile裡面記錄全部的資料修改情況,所以,即時在備份過程中資料檔案被修改過了,恢復時仍然能夠透過解析xtrabackup_logfile保持資料的一致。

Tip1Xtrabackup是一個用於備份InnoDB/XtrDB的工具,真正的線上備份(不影響資料的讀寫),InnoDB Hot Backup的開源替代品。

Tip2:在使用引數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候併發寫入較大的話xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以透過引數--tmpdir指定目錄來解 決這個問題。

備份原理

XtraBackup基於InnoDBcrash-recovery功能。它會複製innodb data file,由於不鎖表,複製出來的資料是不一致的,在恢復的時候使用crash-recovery,使得資料恢復一致。

InnoDB維護了一個redo log,又稱為 transaction log,事務日誌,它包含了innodb資料的所有改動情況。當InnoDB啟動的時候,它會先去檢查data filetransaction log,並且會做二步操作:
1.It applies committed transaction log entries to the data files
2.it performs an undo operation on any transactions that modified data but did not commit.

XtraBackup在備份的時候, 一頁一頁地複製innodb的資料,而且不鎖定表,與此同時,XtraBackup還有另外一個執行緒監視著transactions log,一旦log發生變化,就把變化過的log pages複製走。為什麼要急著複製走呢? 前幾章的時候就提過這個問題,因為transactions log檔案大小有限,寫滿之後,就會從頭再開始寫,所以新資料可能會覆蓋到舊的資料。

prepare過程中,XtraBackup使用複製到的transactions log 對備份出來的innodb data file 進行crash recovery

實現細節

檔案許可權

xtrabackupread-write模式開啟innodb的資料檔案,然後對其進行復制。其實它不會修改此檔案。也就是說,執行xtrabackup的使用者,必須對innodb的資料檔案具有讀寫許可權。

為什麼要用rw模式呢?直接read模式不好麼?因為xtrabackup採用了其內建的innodb庫來開啟檔案,而innodb庫開啟檔案的時候就是rw的。

Tuning the OS Buffers

因為XtraBackup要從檔案系統中複製大量的資料,所以它儘可能地使用posix_fadvise(),來告訴OS不要快取讀取到的資料,從而提升效能。因為這些資料不會重用到了,OS卻沒有這麼聰明。如果要快取一下的話,幾個G的資料,會對OS的虛擬記憶體造成很大的壓力,其它程式,比如mysqld很有可能被swap出去,這樣系統就會受到很大影響了。

posix_fadvise(file,0,0, POSIX_FADV_DONTNEED)

而且XtraBackup在讀取資料的時候還儘可能地預讀:

posix_fadvise(file,0,0, POSIX_FADV_SEQUENTIAL)

複製資料檔案

在備份innodb page的過程中,XtraBackup每次讀寫1MB的資料,1MB/16KB=64page這個不可配置。讀1MB資料之後,XtraBackup一頁一頁地遍歷這1MB資料,使用innodbbuf_page_is_corrupted()函式檢查此頁的資料是否正常,如果資料不正常,就重新讀取這一頁,最多重新讀取10次,如果還是失敗,備份就失敗了,退出。

It skips this check on the doublewrite buffer??

在複製transactions log的時候,每次讀寫512KB的資料。同樣不可以配置。

二.下載及安裝配置

1. Xtrabackup二進位制64位下載地址:

2.MySQL5.1.56的下載地址:

http://dev.mysql.com/downloads/mysql/5.1.html#downloads

作業系統環境:

CentOS release 5.4 (Final) x86_64 GNU/Linux 2.6.18-164.el5

2.安裝配置

1)安裝配置mysql-5.1.56

MySQL 5.1.38前的版本中,當你需要安裝InnoDB Plugin時,必須下載Plugin的檔案,解壓後再進行一系列的安裝。從MySQL 5.1.38開始往後,MySQL包含了2個不同版本的InnoDB儲存引擎一個是舊版本的引擎,稱之為build-in innodb;另一個是1.0.4版本的InnoDB儲存引擎。

Shell> tar –zxvvf mysql-5.1.56.tar.gz

Shell> cd mysql-5.1.56

Shell> ./configure --prefix=/opt/mysql5156

--with-charset=utf8 --with-collation=utf8_general_ci

--with-extra-charsets=latin1,gb2312

--with-plugins=innobase,innodb_plugin,myisam,heap,csv,federated,blackhole

--enable-local-infile --enable-thread-safe-client

Shell> make

Shell >make install

Shell> cp support-files/my-medium.cnf /etc/my.cnf

Shell>cd /opt/mysql5156

Shell>chown –R mysql .

Shell>chgrp –R mysql .

Shell>bin/mysql_install_db –user=mysql

Shell>chown –R root .

Shell> chown –R mysql var

配置啟動plugin-innodb

Shell > vi /etc/my.cnf

port = 3307

socket = /tmp/mysql5156.sock

[mysqld]

port = 3307

socket = /tmp/mysql5156.sock

ignore_builtin_innodb

啟動:shell>/opt/mysql5156/bin/mysqld_safe –user=mysql &

載入plugin-innodb:

>

mysql >INSTALL PLUGIN INNODB_TRX SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_LOCKS SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_LOCK_WAITS SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_CMP SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_CMP_RESET SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_CMPMEM SONAME 'ha_innodb_plugin.so';

mysql >INSTALL PLUGIN INNODB_CMPMEM_RESET SONAME 'ha_innodb_plugin.so';

上述語句只需執行一次就ok了,即使重啟mysqld也不需要再次安裝了。

mysql > show plugins;

mysql> select @@innodb_version;

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

| @@innodb_version |

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

| 1.0.15 |

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

1 row in set (0.00 sec)

mysql執行INSTALL PLUGIN INNODB SONAME 'ha_innodb_plugin.so';

如果報錯提示:ERROR 1289 (HY000): The ‘plugin’ feature is disabled; you need MySQL built with ‘HAVE_DLOPEN’ to have it working

經上網搜尋找到解決問題方法:

在編譯時不要用靜態編譯,將下面兩個從編譯引數中刪除

--with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static

至於原因不是很清楚。

另有人提出可以用下面方法解決:

在編譯mysql時先執行下面的命令

export CFLAGS=”-O2 -DHAVE_DLOPEN=1export CXXFLAGS=”-O2 -DHAVE_DLOPEN=1

但在做測試時,發現仍然有問題不能編譯透過,可能是環境不同吧,我的系統環境為:

Centos 5.4 x86_64 GNU/Linux

2)安裝配置Xtrabackup

先看看如何安裝Xtrabackup,最簡單的安裝方式是使用RPM包,不過想使用原始碼方式安裝的話,其安裝方式有點古怪,因為它採用的在MySQL原始碼上打補丁構建的方式安裝的。這裡使用二進位制包的安裝方式,相對比較靈活。

Shell> mkdir /usr/local/xtrabackup

Shell> tar -zxvf xtrabackup-1.6.tar.gz –C /usr/local/xtrabackup

Shell>cd /usr/local/xtrabackup/bin

Shell>ln –s innobackupex-1.5.1 innobackupex

配置環境變數:

Shell>export PATH=$PATH:/usr/local/xtrabackup/bin

修改mysql配置檔案:

Shell> vi /etc/my.cnf

新增或修改:datadir = /usr/local/mysql/var(資料庫目錄)

特別注意:default_table_type = InnoDB (必須改,否則進行增量備份的時候不成功)

三.xtrabackup的備份與恢復使用

關於xtrabackup的引數選項,如下:–defaults-file=#預設配置檔案的路徑,如果補該引數,xtrabackup 將從依次從以下位置查詢配置檔案/etc/my.cnf /etc/mysql/my.cnf
/usr/local/etc/my.cnf
~/.my.cnf
,並讀取配置檔案中的[mysqld][xtrabackup]配置段

–defaults-extra-file=#如果使用了該引數,在讀取了全域性配置檔案之後,會再讀取這裡指定的配置檔案

–target-dir=name備份檔案的存放目錄路徑

–backup實施備份到 target-dir

–prepare實施對備份檔案迚行恢復前的準備(生成 InnoDB log file

–print-param列印備份或恢復時需要的引數

–use-memory=#該引數在 prepare 的時候使用,控制 prepare innodb 例項使用的記憶體量

–suspend-at-end target-dir 目錄下產生一個 xtrabackup_suspended 檔案,將 xtrabackup 程式掛起,不停地將資料檔案的變化同步到備份檔案,直到使用者手工刪除 xtrabackup_suspended 檔案

–throttle=#每秒IO次數,限制 backup 時使用的 I/O 操作量,使備份對資料庫正常業務的影響最小化

–log-stream該引數在 backup 的時候使用,將 xtrabackup_logfile 的內容輸出到標準輸出,使用該引數時會自動使用–suspend-at-end 引數,innobackupex 指令碼的–stream 模式會使用該引數。

–incremental-lsn=name增量備份時只複製 LSN比該引數指定值新的 ibd pages,前次備份到了哪個 LSN可以看前次備份集的xtrabackup_checkpoints 檔案

–incremental-basedir=name該引數在 backup 的時候使用,備份比該引數指定位置的備份集新的 idb pages

–incremental-dir=name該引數在 prepare 的時候使用,指定 prepare 時產生的.delta 檔案和日誌檔案的存放路徑

–tables=name在備份 file-per-table 型別的資料檔案時使用,使用正規表示式指定需要備份的 innodb

–datadir=name
MySQL
資料庫的資料檔案目錄。

xtrabackup只備份InnoDB資料檔案,表結構是不備份的,所以恢復的時候,你必須有對應表結構檔案(.frm)

1.普通備份(全量備份)
shell>mkdir -p /backup/xtrabackup
shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup

全量備份模擬恢復:需要執行兩次xtrabackup –prepareshell>xtrabackup –defaults-file=/etc/my.cnf –prepare –target-dir=/backup/xtrabackup
shell>xtrabackup –defaults-file=/etc/my.cnf –prepare –target-dir=/backup/xtrabackup

刪除資料庫目錄下的資料檔案:

Shell>rm –rf /usr/local/mysql/var/ib*

Shell>cp /backup/xtrabackup/ib* /usr/local/mysql/var

Shell>chown –R mysql.root /usr/local/mysql/var

重啟測試是否恢復成功。

注意,xtrabackup只備份資料檔案,並不備份資料表結構(.frm),所以使用xtrabackup恢復的時候,你必須有對應表結構檔案(.frm)

2. 普通備份(增量備份)

增量備份優點

1、資料庫太大沒有足夠的空間全量備份,作增量備份有效節省空間,且效率高。

2、支援熱備份。備份過程不鎖表,不受時間限制,不影響使用者使用。

3、每日備份只產生少量資料,遠端備份傳輸更方便。同時節省空間。

4、備份恢復基於檔案操作,降低直接對資料庫操作風險。

5、備份效率更高,恢復效率更高。

增量備份及模擬恢復步驟:

shell>mkdir -p /backup/xtrabackup/base

shell>mkdir -p /backup/xtrabackup/delta1)先做一次全量備份,因為後面的增量備份要以此為基礎

shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup/base

shell>ls /backup/xtrabackup/base

ibdata1 xtrabackup_checkpoints xtrabackup_logfile

(2)以此全量備份為基礎進行增量備份

Shell> xtrabackup --defaults=/etc/my.cnf --backup --target-dir=/backup/xtrabackup/delta/ --incremental-basedir=/backup/xtrabackup/base/

shell>ls /backup/xtrabackup/delta

ibdata1.delta xtrabackup_checkpoints xtrabackup_logfile

ps:在增量備份的目錄下,資料檔案都是以.delta結尾的。增量備份只備份上一次全量備份後被修改過的page,所以增量備份只暫用較少的空間。

增量備份可以在增量備份的基礎上增量。

(注:/backup/xtrabackup/delta/是每次都需修改的。比如第二次增量就改成/backup/xtrabackup/delta2,當然可以寫個指令碼進行自動備份)

增量備份模擬恢復過程:

我們需要分別對全量、增量備份各做一次prepare操作。
shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/

shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/

--incremental-dir=/backup/xtrabackup/delta/

shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/backup/xtrabackup/base/

shell>rm –rf /usr/local/mysql/var/ib* #刪除原來資料目錄下的資料檔案Shell>cp /backup/xtrabackup/base/ib* /usr/local/mysql/var

Shell>chown –R mysql.root /usr/local/mysql/var

重啟後測試是否成功。

再次提醒,xtrabackup只備份InnoDB資料檔案,表結構是不備份的,所以恢復的時候,你必須有對應表結構檔案(.frm)

3.增量備份對比innobackupexxtrabackup我們可以看到,innobackupex操作起來更方便,但是innobackupex會有短暫的鎖 表(時間依賴於MyISAM大小)。xtrabackup備份還有另一個重要特性:增量備份。(未來的版本innobackupex也可能增長該功能)比如表中目前有10條資料,先備份.備份到/usr/local/backup/1/目錄 (完整備份)
shell> xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/1/
檢視它的lsn:
shell> cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0:0
to_lsn = 0:592411
再向表中插入資料,增量備份
shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/2/ --incremental-basedir=/usr/local/backup/1/
把增量備份到2(12的增量備份)檢視它的lsn:
shell>cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 0:592411
to_lsn = 0:908563
再向表中插入資料,增量備份
shell>xtrabackup --defauls-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/3/ --incremental-basedir=/usr/local/backup/1/
把增量備份到3(13的增量備份,2的備份已經包含在裡面了,按照這種方式備份的話,最後的還原只需要還原完全備份和最後一份增量備份即可)檢視它的lsn:
shell>cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 0:592411
to_lsn = 0:1507854
或則另一種增量備份方式:
shell>xtrabackup --defauls-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/3/ --incremental-basedir=/usr/local/backup/2/
把增量備份到3(23的增量備份,各個增量備份獨立,按照這種方式備份的話,最後的還原需要還原完全備份和各個增量備份)檢視它的lsn:
shell>cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 0:908563
to_lsn = 0:1507854
增量備份模擬恢復:我們需要分別對全量、增量備份各做一次prepare操作。:基於(13的增量備份,2的備份已經包含在裡面了,按照這種方式備份的話,最後的還原只需要還原完全備份和最後一份增量備份即可)把第1次的完備恢復
shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/usr/local/backup/1/
繼續把增量備份恢復上去
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/3/

shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ 恢復完成 接著
cd /usr/local/backup/1/
cp 1/ib* /usr/local/mysql/var/

chown –R mysql.root /usr/local/mysql/var
/etc/init.d/mysql restart
基於(23的增量備份,各個增量備份獨立,按照這種方式備份的話,最後的還原需要還原完全備份和各個增量備份)把第1次的完備恢復
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/usr/local/backup/1/
繼續把增量備份恢復上去
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/2/
繼續把增量備份恢復上去
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/3/
恢復完成 接著
cd /usr/local/backup/1/
cp 1/ib* /usr/local/mysql/var/

chown –R mysql.root /usr/local/mysql/var
/etc/init.d/mysql restart

四、innobackupex備份與恢復

Usage:

innobackup [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME]

[--password=WORD] [--port=PORT] [--socket=SOCKET] [--no-timestamp]

[--ibbackup=IBBACKUP-BINARY] [--slave-info] [--stream=tar]

[--defaults-file=MY.CNF]

[--databases=LIST] [--remote-host=HOSTNAME] BACKUP-ROOT-DIR

innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF]

[--ibbackup=IBBACKUP-BINARY] BACKUP-DIR

innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR

第一個命令列是熱備份mysql資料庫。

帶有--apply-log選項的命令是準備在一個備份上啟動mysql服務。

帶有--copy-back選項的命令從備份目錄複製資料,索引,日誌到my.cnf檔案裡規定的初始位置。

引數註釋:

–defaults-file= xtrabackup –defaults-file 引數;

–apply-log xtrabackup –prepare 引數的封裝;

–copy-back做資料恢復時將備份資料檔案複製到 MySQL 伺服器的 datadir

–remote-host=HOSTNAME透過 ssh 將備份資料儲存到程式伺服器上;

--stream=[tar]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21601207/viewspace-708916/,如需轉載,請註明出處,否則將追究法律責任。

相關文章