【MySql】 MySql備份工具Xtrabackup之二

楊奇龍發表於2011-11-17
二.下載及安裝配置
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 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';
上述語句只需執行一次就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=1″export CXXFLAGS=”-O2 -DHAVE_DLOPEN=1″
但在做測試時,發現仍然有問題不能編譯透過,可能是環境不同吧,我的系統環境為:
Centos 5.4x86_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/delta(1)先做一次全量備份,因為後面的增量備份要以此為基礎
shell>xtrabackup --defaults-file=/etc/my.cnf --backup --target-dir=/backup/xtrabackup/base
shell>ls /backup/xtrabackup/base

ibdata1xtrabackup_checkpointsxtrabackup_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.deltaxtrabackup_checkpointsxtrabackup_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.增量備份對比innobackupex和xtrabackup我們可以看到,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(1到2的增量備份)檢視它的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(1到3的增量備份,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(2到3的增量備份,各個增量備份獨立,按照這種方式備份的話,最後的還原需要還原完全備份和各個增量備份)檢視它的lsn點:
shell>cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 0:908563
to_lsn = 0:1507854
增量備份模擬恢復:我們需要分別對全量、增量備份各做一次prepare操作。①:基於(1到3的增量備份,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
2基於(2到3的增量備份,各個增量備份獨立,按照這種方式備份的話,最後的還原需要還原完全備份和各個增量備份)把第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/22664653/viewspace-711130/,如需轉載,請註明出處,否則將追究法律責任。

相關文章