一.Xtrabackup 簡介及備份原理說明:
Xtrabackup是由percona開發(fā)的一個(gè)開源軟件,能夠非?焖俚貍浞菖c恢復(fù)mysql數(shù)據(jù)庫,且支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫),此軟件可以說是innodb熱備工具ibbackup的一個(gè)開源替代品
Xtrabackup中包含兩個(gè)工具:
l xtrabackup -用于熱備份innodb,xtradb引擎表的工具,不能備份其他表。
l innobackupex-對(duì)xtrabackup封裝的perl腳本,提供了用于myisam(會(huì)鎖表)和innodb引擎,及混合使用引擎?zhèn)浞莸哪芰Α?br />Xtrabackup可以做什么
l 在線(熱)備份整個(gè)庫的InnoDB, XtraDB表
l 在xtrabackup的上一次整庫備份基礎(chǔ)上做增量備份(innodb only)
l 以流的形式產(chǎn)生備份,可以直接保存到遠(yuǎn)程機(jī)器上(本機(jī)硬盤空間不足時(shí)很有用)
MySQL數(shù)據(jù)庫本身提供的工具并不支持真正的增量備份,二進(jìn)制日志恢復(fù)是point-in-time(時(shí)間點(diǎn))的恢復(fù)而不是增量備份。Xtrabackup工具支持對(duì)InnoDB存儲(chǔ)引擎的增量備份,工作原理如下:
(1)首先完成一個(gè)完全備份,并記錄下此時(shí)檢查點(diǎn)的LSN(Log Sequence Number)。
(2)在進(jìn)程增量備份時(shí),比較表空間中每個(gè)頁的LSN是否大于上次備份時(shí)的LSN,如果是,則備份該頁,同時(shí)記錄當(dāng)前檢查點(diǎn)的LSN。
在Xtrabackup的wiki上簡單的介紹了一下實(shí)現(xiàn)的原理:
首先,在logfile中找到并記錄最后一個(gè)checkpoint(“last checkpoint LSN”),然后開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接著,開始拷貝全部的數(shù)據(jù)文件.ibd;在拷貝全部數(shù)據(jù)文件結(jié)束之后,才停止拷貝logfile。
因?yàn)閘ogfile里面記錄全部的數(shù)據(jù)修改情況,所以,即時(shí)在備份過程中數(shù)據(jù)文件被修改過了,恢復(fù)時(shí)仍然能夠通過解析xtrabackup_logfile保持?jǐn)?shù)據(jù)的一致。
Tip1:Xtrabackup是一個(gè)用于備份InnoDB/XtrDB的工具,真正的在線備份(不影響數(shù)據(jù)的讀寫),InnoDB Hot Backup的開源替代品。
Tip2:在使用參數(shù)stream=tar備份的時(shí)候,你的xtrabackup_logfile可能會(huì)臨時(shí)放在/tmp目錄下,如果你備份的時(shí)候并發(fā)寫入較大的話xtrabackup_logfile可能會(huì)很大(5G+),很可能會(huì)撐滿你的/tmp目錄,可以通過參數(shù)--tmpdir指定目錄來解 決這個(gè)問題。
備份原理
XtraBackup基于InnoDB的crash-recovery功能。它會(huì)復(fù)制innodb 的data file,由于不鎖表,復(fù)制出來的數(shù)據(jù)是不一致的,在恢復(fù)的時(shí)候使用crash-recovery,使得數(shù)據(jù)恢復(fù)一致。
InnoDB維護(hù)了一個(gè)redo log,又稱為 transaction log,事務(wù)日志,它包含了innodb數(shù)據(jù)的所有改動(dòng)情況。當(dāng)InnoDB啟動(dòng)的時(shí)候,它會(huì)先去檢查data file和transaction log,并且會(huì)做二步操作:
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在備份的時(shí)候, 一頁一頁地復(fù)制innodb的數(shù)據(jù),而且不鎖定表,與此同時(shí),XtraBackup還有另外一個(gè)線程監(jiān)視著transactions log,一旦log發(fā)生變化,就把變化過的log pages復(fù)制走。為什么要急著復(fù)制走呢? 前幾章的時(shí)候就提過這個(gè)問題,因?yàn)閠ransactions log文件大小有限,寫滿之后,就會(huì)從頭再開始寫,所以新數(shù)據(jù)可能會(huì)覆蓋到舊的數(shù)據(jù)。
在prepare過程中,XtraBackup使用復(fù)制到的transactions log 對(duì)備份出來的innodb data file 進(jìn)行crash recovery。
實(shí)現(xiàn)細(xì)節(jié)
文件權(quán)限
xtrabackup以read-write模式打開innodb的數(shù)據(jù)文件,然后對(duì)其進(jìn)行復(fù)制。其實(shí)它不會(huì)修改此文件。也就是說,運(yùn)行xtrabackup的用戶,必須對(duì)innodb的數(shù)據(jù)文件具有讀寫權(quán)限。
為什么要用rw模式呢?直接read模式不好么?
因?yàn)閤trabackup采用了其內(nèi)置的innodb庫來打開文件,而innodb庫打開文件的時(shí)候就是rw的。
Tuning the OS Buffers
因?yàn)閄traBackup要從文件系統(tǒng)中復(fù)制大量的數(shù)據(jù),所以它盡可能地使用posix_fadvise(),來告訴OS不要緩存讀取到的數(shù)據(jù),從而提升性能。因?yàn)檫@些數(shù)據(jù)不會(huì)重用到了,OS卻沒有這么聰明。如果要緩存一下的話,幾個(gè)G的數(shù)據(jù),會(huì)對(duì)OS的虛擬內(nèi)存造成很大的壓力,其它進(jìn)程,比如mysqld很有可能被swap出去,這樣系統(tǒng)就會(huì)受到很大影響了。
posix_fadvise(file,0,0, POSIX_FADV_DONTNEED)
而且XtraBackup在讀取數(shù)據(jù)的時(shí)候還盡可能地預(yù)讀:
posix_fadvise(file,0,0, POSIX_FADV_SEQUENTIAL)
復(fù)制數(shù)據(jù)文件
在備份innodb page的過程中,XtraBackup每次讀寫1MB的數(shù)據(jù),1MB/16KB=64個(gè)page。
這個(gè)不可配置。讀1MB數(shù)據(jù)之后,XtraBackup一頁一頁地遍歷這1MB數(shù)據(jù),使用innodb的buf_page_is_corrupted()函數(shù)檢查此頁的數(shù)據(jù)是否正常,如果數(shù)據(jù)不正常,就重新讀取這一頁,最多重新讀取10次,如果還是失敗,備份就失敗了,退出。
It skips this check on the doublewrite buffer??
在復(fù)制transactions log的時(shí)候,每次讀寫512KB的數(shù)據(jù)。同樣不可以配置。
二.下載及安裝配置
1. Xtrabackup二進(jìn)制64位下載地址:
http://www.percona.com/downloads/XtraBackup/XtraBackup-1.6/Linux/binary/x86_64/
2.MySQL5.1.56的下載地址:
http://dev.mysql.com/downloads/mysql/5.1.html#downloads
操作系統(tǒng)環(huán)境:
CentOS release 5.4 (Final) x86_64 GNU/Linux 2.6.18-164.el5
2.安裝配置
(1)安裝配置mysql-5.1.56
在MySQL 5.1.38前的版本中,當(dāng)你需要安裝InnoDB Plugin時(shí),必須下載Plugin的文件,解壓后再進(jìn)行一系列的安裝。從MySQL 5.1.38開始往后,MySQL包含了2個(gè)不同版本的InnoDB存儲(chǔ)引擎—一個(gè)是舊版本的引擎,稱之為build-in innodb;另一個(gè)是1.0.4版本的InnoDB存儲(chǔ)引擎。
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
配置啟動(dòng)plugin-innodb
Shell > vi /etc/my.cnf
port = 3307
socket = /tmp/mysql5156.sock
[mysqld]
port = 3307
socket = /tmp/mysql5156.sock
ignore_builtin_innodb
啟動(dòng):shell>/opt/mysql5156/bin/mysqld_safe –user=mysql &
加載plugin-innodb:
mysql>INSTALL PLUGIN INNODB SONAME 'ha_innodb_plugin.so';
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';
上述語句只需執(zhí)行一次就ok了,即使重啟mysqld也不需要再次安裝了。
mysql > show plugins;
mysql> select @@innodb_version;
+------------------+
| @@innodb_version |
+------------------+
| 1.0.15 |
+------------------+
1 row in set (0.00 sec)
mysql執(zhí)行INSTALL PLUGIN INNODB SONAME 'ha_innodb_plugin.so';
如果報(bào)錯(cuò)提示:ERROR 1289 (HY000): The ‘plugin’ feature is disabled; you need MySQL built with ‘HAVE_DLOPEN’ to have it working
經(jīng)上網(wǎng)搜索找到解決問題方法:
在編譯時(shí)不要用靜態(tài)編譯,將下面兩個(gè)從編譯參數(shù)中刪除
--with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static
至于原因不是很清楚。
另有人提出可以用下面方法解決:
在編譯mysql時(shí)先執(zhí)行下面的命令
export CFLAGS=”-O2 -DHAVE_DLOPEN=1″
export CXXFLAGS=”-O2 -DHAVE_DLOPEN=1″
但在做測試時(shí),發(fā)現(xiàn)仍然有問題不能編譯通過,可能是環(huán)境不同吧,我的系統(tǒng)環(huán)境為:
Centos 5.4 x86_64 GNU/Linux
(2)安裝配置Xtrabackup
先看看如何安裝Xtrabackup,最簡單的安裝方式是使用RPM包,不過想使用源代碼方式安裝的話,其安裝方式有點(diǎn)古怪,因?yàn)樗捎玫脑贛ySQL源代碼上打補(bǔ)丁構(gòu)建的方式安裝的。這里使用二進(jìn)制包的安裝方式,相對(duì)比較靈活。
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
配置環(huán)境變量:
Shell>export PATH=$PATH:/usr/local/xtrabackup/bin
修改mysql配置文件:
Shell> vi /etc/my.cnf
添加或修改:datadir = /usr/local/mysql/var(數(shù)據(jù)庫目錄)
特別注意:default_table_type = InnoDB (必須改,否則進(jìn)行增量備份的時(shí)候不成功)
三.xtrabackup的備份與恢復(fù)使用
關(guān)于xtrabackup的參數(shù)選項(xiàng),如下:
–defaults-file=#
默認(rèn)配置文件的路徑,如果補(bǔ)該參數(shù),xtrabackup 將從依次從以下位置查找配置文件/etc/my.cnf /etc/mysql/my.cnf
/usr/local/etc/my.cnf
~/.my.cnf,并讀取配置文件中的[mysqld]和[xtrabackup]配置段
–defaults-extra-file=#
如果使用了該參數(shù),在讀取了全局配置文件之后,會(huì)再讀取這里指定的配置文件
–target-dir=name
備份文件的存放目錄路徑
–backup實(shí)施備份到 target-dir
–prepare
實(shí)施對(duì)備份文件迚行恢復(fù)前的準(zhǔn)備(生成 InnoDB log file)
–print-param
打印備份或恢復(fù)時(shí)需要的參數(shù)
–use-memory=#
該參數(shù)在 prepare 的時(shí)候使用,控制 prepare 時(shí) innodb 實(shí)例使用的內(nèi)存量
–suspend-at-end
在 target-dir 目錄下產(chǎn)生一個(gè) xtrabackup_suspended 文件,將 xtrabackup 進(jìn)程掛起,不停地將數(shù)據(jù)文件的變化同步到備份文件,直到用戶手工刪除 xtrabackup_suspended 文件
–throttle=#
每秒IO次數(shù),限制 backup 時(shí)使用的 I/O 操作量,使備份對(duì)數(shù)據(jù)庫正常業(yè)務(wù)的影響最小化
–log-stream
該參數(shù)在 backup 的時(shí)候使用,將 xtrabackup_logfile 的內(nèi)容輸出到標(biāo)準(zhǔn)輸出,使用該參數(shù)時(shí)會(huì)自動(dòng)使用–suspend-at-end 參數(shù),innobackupex 腳本的–stream 模式會(huì)使用該參數(shù)。
–incremental-lsn=name
增量備份時(shí)只拷貝 LSN比該參數(shù)指定值新的 ibd pages,前次備份到了哪個(gè) LSN可以看前次備份集的xtrabackup_checkpoints 文件
–incremental-basedir=name
該參數(shù)在 backup 的時(shí)候使用,備份比該參數(shù)指定位置的備份集新的 idb pages
–incremental-dir=name
該參數(shù)在 prepare 的時(shí)候使用,指定 prepare 時(shí)產(chǎn)生的.delta 文件和日志文件的存放路徑
–tables=name
在備份 file-per-table 類型的數(shù)據(jù)文件時(shí)使用,使用正則表達(dá)式指定需要備份的 innodb 表
–datadir=name
MySQL 數(shù)據(jù)庫的數(shù)據(jù)文件目錄。
xtrabackup只備份InnoDB數(shù)據(jù)文件,表結(jié)構(gòu)是不備份的,所以恢復(fù)的時(shí)候,你必須有對(duì)應(yīng)表結(jié)構(gòu)文件(.frm)
1.普通備份(全量備份)
shell>mkdir -p /backup/xtrabackup
shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup
全量備份模擬恢復(fù):
需要執(zhí)行兩次xtrabackup –prepare
shell>xtrabackup –defaults-file=/etc/my.cnf –prepare –target-dir=/backup/xtrabackup
shell>xtrabackup –defaults-file=/etc/my.cnf –prepare –target-dir=/backup/xtrabackup
刪除數(shù)據(jù)庫目錄下的數(shù)據(jù)文件:
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
重啟測試是否恢復(fù)成功。
注意,xtrabackup只備份數(shù)據(jù)文件,并不備份數(shù)據(jù)表結(jié)構(gòu)(.frm),所以使用xtrabackup恢復(fù)的時(shí)候,你必須有對(duì)應(yīng)表結(jié)構(gòu)文件(.frm)。
2. 普通備份(增量備份)
增量備份優(yōu)點(diǎn):
1、數(shù)據(jù)庫太大沒有足夠的空間全量備份,作增量備份有效節(jié)省空間,且效率高。
2、支持熱備份。備份過程不鎖表,不受時(shí)間限制,不影響用戶使用。
3、每日備份只產(chǎn)生少量數(shù)據(jù),遠(yuǎn)程備份傳輸更方便。同時(shí)節(jié)省空間。
4、備份恢復(fù)基于文件操作,降低直接對(duì)數(shù)據(jù)庫操作風(fēng)險(xiǎn)。
5、備份效率更高,恢復(fù)效率更高。
增量備份及模擬恢復(fù)步驟:
shell>mkdir -p /backup/xtrabackup/base
shell>mkdir -p /backup/xtrabackup/delta
(1)先做一次全量備份,因?yàn)楹竺娴脑隽總浞菀源藶榛A(chǔ)
shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup/base
shell>ls /backup/xtrabackup/base
ibdata1 xtrabackup_checkpoints xtrabackup_logfile
(2)以此全量備份為基礎(chǔ)進(jìn)行增量備份
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:在增量備份的目錄下,數(shù)據(jù)文件都是以.delta結(jié)尾的。增量備份只備份上一次全量備份后被修改過的page,所以增量備份只暫用較少的空間。
增量備份可以在增量備份的基礎(chǔ)上增量。
(注:/backup/xtrabackup/delta/是每次都需修改的。比如第二次增量就改成/backup/xtrabackup/delta2,當(dāng)然可以寫個(gè)腳本進(jìn)行自動(dòng)備份)
增量備份模擬恢復(fù)過程:
我們需要分別對(duì)全量、增量備份各做一次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* #刪除原來數(shù)據(jù)目錄下的數(shù)據(jù)文件
Shell>cp /backup/xtrabackup/base/ib* /usr/local/mysql/var
Shell>chown –R mysql.root /usr/local/mysql/var
重啟后測試是否成功。
再次提醒,xtrabackup只備份InnoDB數(shù)據(jù)文件,表結(jié)構(gòu)是不備份的,所以恢復(fù)的時(shí)候,你必須有對(duì)應(yīng)表結(jié)構(gòu)文件(.frm)。
3.增量備份
對(duì)比innobackupex和xtrabackup我們可以看到,innobackupex操作起來更方便,但是innobackupex會(huì)有短暫的鎖 表(時(shí)間依賴于MyISAM大小)。xtrabackup備份還有另一個(gè)重要特性:增量備份。(未來的版本innobackupex也可能增長該功能)
比如表中目前有10條數(shù)據(jù),先備份.備份到/usr/local/backup/1/目錄 (完整備份)
shell> xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/1/
查看它的lsn點(diǎn):
shell> cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0:0
to_lsn = 0:592411
再向表中插入數(shù)據(jù),增量備份
shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/2/ --incremental-basedir=/usr/local/backup/1/
把增量備份到2(1到2的增量備份)
查看它的lsn點(diǎn):
shell>cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 0:592411
to_lsn = 0:908563
再向表中插入數(shù)據(jù),增量備份
shell>xtrabackup --defauls-file=/etc/my.cnf --backup --target-dir=/usr/local/backup/3/ --incremental-basedir=/usr/local/backup/1/
把增量備份到3(1到3的增量備份,2的備份已經(jīng)包含在里面了,按照這種方式備份的話,最后的還原只需要還原完全備份和最后一份增量備份即可)
查看它的lsn點(diǎn):
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(2到3的增量備份,各個(gè)增量備份獨(dú)立,按照這種方式備份的話,最后的還原需要還原完全備份和各個(gè)增量備份)
查看它的lsn點(diǎn):
shell>cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 0:908563
to_lsn = 0:1507854
增量備份模擬恢復(fù):
我們需要分別對(duì)全量、增量備份各做一次prepare操作。
①:基于(1到3的增量備份,2的備份已經(jīng)包含在里面了,按照這種方式備份的話,最后的還原只需要還原完全備份和最后一份增量備份即可)
把第1次的完備恢復(fù)
shell>xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/usr/local/backup/1/
繼續(xù)把增量備份恢復(fù)上去
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/3/
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/
恢復(fù)完成
接著
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
②基于(2到3的增量備份,各個(gè)增量備份獨(dú)立,按照這種方式備份的話,最后的還原需要還原完全備份和各個(gè)增量備份)
把第1次的完備恢復(fù)
xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/usr/local/backup/1/
繼續(xù)把增量備份恢復(fù)上去
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/2/
繼續(xù)把增量備份恢復(fù)上去
shell>xtrabackup --prepare --target-dir=/usr/local/backup/1/ --incremental-dir=/usr/local/backup/3/
恢復(fù)完成
接著
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備份與恢復(fù)
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
第一個(gè)命令行是熱備份mysql數(shù)據(jù)庫。
帶有--apply-log選項(xiàng)的命令是準(zhǔn)備在一個(gè)備份上啟動(dòng)mysql服務(wù)。
帶有--copy-back選項(xiàng)的命令從備份目錄拷貝數(shù)據(jù),索引,日志到my.cnf文件里規(guī)定的初始位置。
參數(shù)注釋:
–defaults-file=
同 xtrabackup 的–defaults-file 參數(shù);
–apply-log
對(duì) xtrabackup 的–prepare 參數(shù)的封裝;
–copy-back
做數(shù)據(jù)恢復(fù)時(shí)將備份數(shù)據(jù)文件拷貝到 MySQL 服務(wù)器的 datadir ;
–remote-host=HOSTNAME
通過 ssh 將備份數(shù)據(jù)存儲(chǔ)到進(jìn)程服務(wù)器上;
--stream=[tar]
備份文件輸出格式, tar 時(shí)使用 tar4ibd , 該文件可在 XtarBackup binary 文件中獲得.如果備份時(shí)有指定--stream=tar, 則tar4ibd 文件所處目錄一定要在 $PATH 中(因?yàn)槭褂玫氖?tar4ibd 去壓縮, 在 XtraBackup 的 binary 包中可獲得該文件)
--tmpdir=DIRECTORY
當(dāng)有指定--remote-host or --stream時(shí), 事務(wù)日志臨時(shí)存儲(chǔ)的目錄, 默認(rèn)采用 MySQL 配置文件中所指定的臨時(shí)目錄tmpdir
--redo-only --apply-log組,
強(qiáng)制備份日志時(shí)只 redo ,跳過 rollback. 這在做增量備份時(shí)非常必要
–use-memory=#
該參數(shù)在 prepare 的時(shí)候使用,控制 prepare 時(shí) innodb 實(shí)例使用的內(nèi)存量
–throttle=IOS
同 xtrabackup 的–throttle 參數(shù);
–sleep=是給 ibbackup 使用的,指定每備份 1M 數(shù)據(jù),過程停止拷貝多少毫秒,也是為了在備份時(shí)盡量減小對(duì)正常業(yè)務(wù)的影響,具體可以查看ibbackup 的手冊 ;
–compress[=LEVEL]
對(duì)備份數(shù)據(jù)迚行壓縮,僅支持 ibbackup,xtrabackup 還沒有實(shí)現(xiàn);
–include=REGEXP
對(duì) xtrabackup 參數(shù)–tables 的封裝,也支持 ibbackup ;
–databases=LIST
列出需要備份的 databases,如果沒有指定該參數(shù),所有包含MyISAM 和 InnoDB 表的 database 都會(huì)被備份 ;
–uncompress
解壓備份的數(shù)據(jù)文件,支持 ibbackup,xtrabackup 還沒有實(shí)現(xiàn)該功能;
--slave-info,備份從庫, 加上 --slave-info 備份目錄下會(huì)多生成一個(gè) xtrabackup_slave_info 文件, 這里會(huì)保存主日志文件以及偏移, 文件內(nèi)容類似于:
CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
–socket=SOCKET
MySQL 服務(wù)器的 socket 文件位置
1. 使用Innobachkupex備份(暫不支持增量備份)
(1)普通備份
shell> mkdir -p /backup/innobackupex/
Shell>innobackupex --defaults-file=/etc/my.cnf --user=root --password=root \
--databases='i_db' --no-lock /backup/ innobackupex / \
2> /tmp/innobackup.log
xtrabackup_51 Ver 1.5 Rev undefined for 5.1.52 unknown-linux-gnu (x86_64)
[01] Copying /usr/local/mysql/var/ibdata1
to /backup/innobackupex/2011-04-12_00-44-29/ibdata1
[01] ...done
xtrabackup: The latest check point (for incremental): '0:32538662'
xtrabackup: Stopping log copying thread.
xtrabackup: Transaction log of lsn (0 32538662) to (0 32538662) was copied.
注釋:
使用mysql的root用戶備份,密碼為root
備份文件的存放路徑是/backup/innobackupex/,該目錄下將創(chuàng)建以時(shí)間戳為名稱的備份目錄
–no-lock備份時(shí)不鎖定表
–databases="i_db"用于指定要備份的數(shù)據(jù)庫
2>/tmp/backup.log是將備份過程中的輸出信息保存到/tmp/backup.log
注意:在使用innobackupex進(jìn)行備份時(shí),在配置文件my.cnf中要明確指定mysql的數(shù)據(jù)文件目錄,否則會(huì)報(bào)錯(cuò)。
[mysqld]
datadir=/usr/local/mysql/var
(2)打包(tar)備份
Shell>innobackupex --defaults-file=/etc/my.cnf --user=root --password=root \
--databases='i_db' --no-lock --stream=tar /backup/innobackupex/ \
2> /tmp/innobackup.log 1> /backup/innobackupex/i_aura.tar
這種備份時(shí)間會(huì)比較長,主要是執(zhí)行打包操作。
解包過程,需要使用tar ixvf 解壓對(duì)應(yīng)的文件后,注意參數(shù) –i必須加入。
模擬恢復(fù)過程:
Shell> mysql –uroot –proot –e’drop database i_db’
Shell>mysqladmin –uroot –proot shutdown
Shell>rm –rf /usr/local/mysql/var/ib *
shell >cd /backup/innobackupex/
shell >tar ixvf i_aura.tar
shell>ls
backup-my.cnf i_aura.tar ibdata1 i_db stderr stdout xtrabackup_binary xtrabackup_checkpoints xtrabackup_logfile
準(zhǔn)備還原
shell>innobackupex-1.5.1 --defaults-file=/etc/my.cnf –no-lock –apply-log /data/back_data/
拷貝還原數(shù)據(jù):
shell>innobackupex --defaults-file=/etc/my.cnf –no-lock --copy-back /backup/innobackupex/
Shell>cd /usr/local/mysql/var
Shell>chown -R mysql:root . #一定要修改權(quán)限
shell> mysqld_safe –user=mysql &
檢查刪除的數(shù)據(jù)庫,如果恢復(fù)則證明該恢復(fù)過程無誤。
(3)壓縮(tar)備份
Shell>innobackupex --defaults-file=/etc/my.cnf --user=root --password=root \
--databases=”i_db test”--no-lock --stream=tar /backup/innobackupex/ \
2> /tmp/innobackup.log | gzip > /backup/innobackupex/i_aura.tar
這種備份時(shí)間會(huì)比較長,主要是執(zhí)行壓縮操作。
解壓縮過程,需要使用tar izxvf 解壓對(duì)應(yīng)的文件后,注意參數(shù) –i必須加入。
還原:
使用tar –izxvf 解壓對(duì)應(yīng)的文件后,操作完全同普通備份。
模擬恢復(fù)過程:
Shell> mysql –uroot –proot –e’drop database i_db’
Shell>mysqladmin –uroot –proot shutdown
Shell>rm –rf /usr/local/mysql/var/ibdata1 ib_logfile*
shell >cd /backup/innobackupex/
shell >tar ixvf i_aura.tar
shell>ls
backup-my.cnf i_aura.tar.gz ibdata1 i_db stderr stdout xtrabackup_binary xtrabackup_checkpoints xtrabackup_logfile
準(zhǔn)備還原:
shell> innobackupex --defaults-file=/etc/my.cnf –no-lock --apply-log /backup/innobackupex/……
拷貝還原數(shù)據(jù):
shell> innobackupex --defaults-file=/etc/my.cnf –no-lock --copy-back /backup/innobackupex/
Shell>cd /usr/local/mysql/var
Shell>chown -R mysql:root .
shell> mysqld_safe –user=mysql &
檢查刪除的數(shù)據(jù)庫,如果恢復(fù)則證明該恢復(fù)過程無誤。
(4)整庫備份及恢復(fù)。
備份:
Shell>innobackupex --user=root --password=root --defaults-file=/etc/my.cnf \
/backup/innobackupex/
檢查備份的文件:
Shell>ls /backup/innobackupex/
2011-04-12_09-20-13
模擬恢復(fù):
首先停掉數(shù)據(jù)庫,然后刪除數(shù)據(jù)庫目錄下的所有數(shù)據(jù)庫文件。
Shell> mysql –uroot –proot shutdown
Shell>rm –rf /usr/local/mysql/var/*
首先寫日志文件,然后恢復(fù),如下。(注:2011-04-12_09-20-13是自動(dòng)生成的以備份時(shí)間命名的文件夾,恢復(fù)時(shí)根據(jù)情況進(jìn)行選擇)
Shell>innobackupex --apply-log --defaults-file=/etc/my.cnf \
/backup/innobackupex/2011-04-12_09-20-13
Shell>innobackupex --copy-back --defaults-file=/etc/my.cnf \
/backup/innobackupex/2011-04-12_09-20-13
使用cd或者ls 命令看看你的數(shù)據(jù)庫目錄下是不是有文件了?
修改數(shù)據(jù)庫文件權(quán)限,否則無法啟動(dòng)。(這步我是cd到原數(shù)據(jù)庫目錄下進(jìn)行的)
Shell>chown -R mysql:mysql .
重啟數(shù)據(jù)庫,測試恢復(fù)是否成功。
五.備份到遠(yuǎn)程服務(wù)器
(1)innobackupex遠(yuǎn)程備份方法一
當(dāng)前數(shù)據(jù)庫所在機(jī)器IP:192.168.1.131,現(xiàn)在要備份到192.168.1.132的/data目錄下。
Shell>innobackupex --user=root --password=root --defaults=/etc/my.cnf --stream=tar /data | ssh root@192.168.1.132 cat " >" /data/backup.tar
接著需要輸入遠(yuǎn)程服務(wù)器密碼......然后就開始備份了,備份完成后登陸到遠(yuǎn)程服務(wù)器看看是不是有了呢?
目前使用xtrabackup增量備份是不支持到遠(yuǎn)程的。如何解決呢?可以使用nfs 網(wǎng)絡(luò)文件系統(tǒng)把遠(yuǎn)程服務(wù)器磁盤掛載到本地。
(2)innobackupex遠(yuǎn)程備份方法二
#在本地后臺(tái)啟動(dòng)1234監(jiān)聽,以便接受備份文件
nc -d -l 1234 > /data/$A/20100118000001.tar &
#ssh到服務(wù)器A執(zhí)行備份,并將備份包推送到備份機(jī)B上。同時(shí)記錄下log。
ssh $A ‘innobackupex-1.5.1 –stream=tar –include=’renren.*’ –throttle=500 –socket=/data/mysql/backup/mysql.sock –defaults-file=/data/dbbackup/my.cnf –user=root –password=xxxxxxx –slave-info /data/dbbackup | nc $B 1234′ < /dev/null > /data/xtrabackup.log 2>&1
參數(shù)解釋:
–stream=tar : 告訴xtrabackup,備份需要以tar的文件流方式輸出。
–include=’renren.*’:備份包含的庫表,如例:意思是要備份renren庫中所有的表。如果需要全備份,則省略這個(gè)參數(shù);如果需 要備份renren庫下的2個(gè)表:tableA & tableB,則寫成:–include=’renren.tableA|renren.tableB’;再如果renren庫下只有2個(gè)前綴是 table的表,你還可以寫成:–include=’renren.table*’。
–throttle=500:xtrabackup在備份過程中,IO操作比較多,因此需要限定一下IO操作。以免服務(wù)器壓力過大,不過好像作用不太明顯,也不知道是不是設(shè)置的還是過大。待測…
–socket=/data/mysql/backup/mysql.sock:指定mysql.sock所在位置,以便備份進(jìn)程登錄mysql.
–defaults-file=/data/dbbackup/my.cnf :如果您的/etc/my.cnf中沒有使用如[mysqld3306]的片段啟動(dòng)mysql,則不需要這行參數(shù),如果使用了上面的片段,那么 xtrabackup是無法解析/etc/my.cnf文件的(嚴(yán)格上來說是會(huì)解析錯(cuò)誤),所以,我們需要手工完成一個(gè)my.cnf文件,文件片段如下, 只需要指定6個(gè)參數(shù)即可讓xtrabackup正常工作,各參數(shù)意思請參考mysql文檔:
[mysqld]
datadir=/data/var
innodb_data_home_dir = /data/ibdata
innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend
innodb_log_group_home_dir = /data/iblogs
innodb_log_files_in_group = 2
innodb_log_file_size = 1G