程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Xtrabackup應用指南 InnoDB數據備份對象

Xtrabackup應用指南 InnoDB數據備份對象

編輯:MySQL綜合教程

Xtrabackup應用指南 InnoDB數據備份對象。本站提示廣大學習愛好者:(Xtrabackup應用指南 InnoDB數據備份對象)文章只能為提供參考,不一定能成為您想要的結果。以下是Xtrabackup應用指南 InnoDB數據備份對象正文


1、Xtrabackup引見

  A、Xtrabackup是甚麼

  Xtrabackup是一個對InnoDB做數據備份的對象,支撐在線熱備份(備份時不影響數據讀寫),是貿易備份對象InnoDB Hotbackup的一個很好的替換品。

  Xtrabackup有兩個重要的對象:xtrabackup、innobackupex

  1、xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不克不及備份MyISAM數據表
  2、innobackupex是參考了InnoDB Hotbackup的innoback劇本修正而來的.innobackupex是一個perl劇本封裝,封裝了xtrabackup。重要是為了便利的 同時備份InnoDB和MyISAM引擎的表,但在處置myisam時須要加一個讀鎖。而且參加了一些應用的選項。如slave-info可以記載備份恢 復後,作為slave須要的一些信息,依據這些信息,可以很便利的應用備份來重做slave。
  3、官方文檔:http://www.percona.com/docs/wiki/percona-xtrabackup:start

  B、Xtrabackup可以做甚麼

  在線(熱)備份全部庫的InnoDB、 XtraDB表
  在xtrabackup的上一次整庫備份基本上做增量備份(innodb only)
  以流的情勢發生備份,可以直接保留到長途機械上(本機硬盤空間缺乏時很有效)

  MySQL數據庫自己供給的對象其實不支撐真實的增量備份,二進制日記恢復是point-in-time(時光點)的恢復而不是增量備份。Xtrabackup對象支撐對InnoDB存儲引擎的增量備份,任務道理以下:

  (1)起首完成一個完整備份,並記載下此時檢討點的LSN(Log Sequence Number)。
  (2)在過程增量備份時,比擬表空間中每一個頁的LSN能否年夜於前次備份時的LSN,假如是,則備份該頁,同時記載以後檢討點的LSN。

  起首,在logfile中找到並記載最初一個checkpoint(“last checkpoint LSN”),然後開端從LSN的地位開端拷貝InnoDB的logfile到xtrabackup_logfile;接著,開端拷貝全體的數據文 件.ibd;在拷貝全體數據文件停止以後,才停滯拷貝logfile。

  由於logfile外面記載全體的數據修正情形,所以,即時在備份進程中數據文件被修正過了,恢復時依然可以或許經由過程解析xtrabackup_logfile堅持數據的分歧。

  C、Xtrabackup備份道理

  XtraBackup基於InnoDB的crash-recovery功效。它會復制innodb的data file,因為不鎖表,復制出來的數據是紛歧致的,在恢復的時刻應用crash-recovery,使得數據恢復分歧。

  InnoDB保護了一個redo log,又稱為transaction log,事務日記,它包括了innodb數據的一切修改情形。當InnoDB啟動的時刻,它會先去檢討data file和transaction log,而且會做二步操作:

  XtraBackup在備份的時刻, 一頁一頁地復制innodb的數據,並且不鎖定表,與此同時,XtraBackup還有別的一個線程監督著transactions log,一旦log產生變更,就把變更過的log pages復制走。為何要急著復制走呢? 由於transactions log文件年夜小無限,寫滿以後,就會從頭再開端寫,所以新數據能夠會籠罩到舊的數據。

  在prepare進程中,XtraBackup應用復制到的transactions log對備份出來的innodb data file停止crash recovery。

  D、完成細節

  XtraBackup以read-write形式翻開innodb的數據文件,然後對其停止復制。其實它不會修正此文件。也就是說,運轉 XtraBackup的用戶,必需對innodb的數據文件具有讀寫權限。之所以采取read-write形式是由於XtraBackup采取了其內置的 innodb庫來翻開文件,而innodb庫翻開文件的時刻就是rw的。

  XtraBackup要從文件體系中復制年夜量的數據,所以它盡量地應用posix_fadvise(),來告知OS不要緩存讀取到的數據,從 而晉升機能。由於這些數據不會重用到了,OS卻沒有這麼聰慧。假如要緩存一下的話,幾個G的數據,會對OS的虛擬內存形成很年夜的壓力,其它過程,好比 mysqld很有能夠被swap出去,如許體系就會遭到很年夜影響了。

  在備份innodb page的進程中,XtraBackup每次讀寫1MB的數據,1MB/16KB=64個page。這個弗成設置裝備擺設。讀1MB數據之 後,XtraBackup一頁一頁地遍歷這1MB數據,應用innodb的buf_page_is_corrupted()函數檢討此頁的數據能否正常, 假如數據不正常,就從新讀取這一頁,最多從新讀取10次,假如照樣掉敗,備份就掉敗了,加入。在復制transactions log的時刻,每次讀寫512KB的數據。異樣弗成以設置裝備擺設。

  2、Xtrabackup裝置

  本文經由過程源碼方法裝置Xtrabackup,最新的版本是1.6.

  Xtrabackup與普通的源碼構建方法分歧,它采取的在MySQL源代碼上打補釘的構建方法。下載的源碼包比擬年夜就是是由於這個包裡打包了編譯須要的兩個MySQL Source,一個5.1.56,一個5.5.10。

  裝置編譯所需的依附包

BASH

yum install libaio libaio-devel

  編譯裝置Xtrabackup

BASH

wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-1.6/source/xtrabackup-1.6.tar.gz
tar xvf xtrabackup-1.6.tar.gz
cd xtrabackup-1.6
utils/build.sh innodb55

  注:build.sh是源碼包中供給的編譯劇本,MySQL 5.1可用參數innodb51_builtin。

  編譯勝利後,會在對應mysql版本目次中生成一個xtrabackup法式,我這裡生成的途徑是mysql-5.5.10/storage/innobase/xtrabackup/中

BASH
ls mysql-5.5.10/storage/innobase/xtrabackup/
Makefile xtrabackup.c xtrabackup_innodb55 xtrabackup.o

  復制響應文件和樹立軟鏈到/usr/bin下,這麼做的緣由是知足innobackupex劇本的須要。

BASH

cp mysql-5.5.10/storage/innobase/xtrabackup/xtrabackup_innodb55 /usr/bin/xtrabackup_55
cp innobackupex /usr/bin/innobackupex
#備份時假如打包就須要這個敕令,非必須。
cp libtar-1.2.11/libtar/tar4ibd /usr/bin/tar4ibd  
ln -sf /usr/local/webserver/mysql/bin/mysql /usr/bin/mysql

  三.Xtrabackup的備份與恢復應用

  A、Xtrabackup經常使用參數選項以下:

BASH

--defaults-file=#
默許設置裝備擺設文件的途徑,假如不應參數,xtrabackup將從順次從以下地位查找設置裝備擺設文件/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、~/.my.cnf,並讀取設置裝備擺設文件中的[mysqld]和[xtrabackup]設置裝備擺設段。[mysqld]中只須要指定datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size6個參數便可讓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數據庫的數據文件目次。

  B、通俗備份方法

  a)通俗備份(全量備份)

BASH

mkdir -p /data0/backup/mysql
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/
cp -r /data0/mysql/data/testinnodb/ /data0/backup/mysql/

  留意:xtrabackup只備份數據文件,其實不備份數據表構造(.frm),所以這裡要手動備份一下,以便xtrabackup恢復的時刻應用。

  全量備份恢復

  實行對備份文件停止恢復前的預備

BASH

xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/

  從備份目次復制對應數據庫表構造到默許的數據目次

BASH

cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/

  刪除默許數據目次中對應的數據文件並復制備份的數據文件到默許數據目次

BASH

rm /data0/backup/mysql/ib*
cp /data0/backup/mysql/ib* /data0/mysql/data/

  修正數據目次權限

BASH

chown -R mysql:mysql /data0/mysql/data

  重啟MySQL

BASH

/data0/mysql/mysql restart

  b)增量備份

  增量備份長處:

  1、數據庫太年夜沒有足夠的空間全量備份,作增量備份有用節儉空間,且效力高。
  2、支撐熱備份。備份進程不鎖表,不受時光限制,不影響用戶應用。
  3、逐日備份只發生大批數據,長途備份傳輸更便利。同時節儉空間。
  4、備份恢復基於文件操作,下降直接對數據庫操風格險。
  5、備份效力更高,恢復效力更高。

  這個我研討N久沒勝利,緣由臨時還沒找到。我測試情況的Mysql版本是5.5.11的,xtrabackup_55是依據MySQL5.5.9的源碼編譯的,不曉得和這個有關系沒?待驗證!這裡只把完成步調整頓出來。

  增量備份及模仿恢復步調:

  先做一次全量備份,增量備份須要以此為基本

BASH

#樹立備份目次
mkdir -p /data0/backup/mysql/base
#樹立一個全量備份
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/base
#生成的備份數據文件
ls /data0/backup/mysql/base/
ibdata1 xtrabackup_checkpoints xtrabackup_logfile
#備份數據庫表構造
cp -r /data0/mysql/data/testinnodb/ /data0/backup/mysql/

  以此全量備份為基本停止增量備份

BASH

#樹立備份目次
mkdir -p /data0/backup/mysql/delta
#樹立一個增量備份
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --backup --target-dir=/data0/backup/mysql/delta  --incremental-basedir=/data0/backup/mysql/base
#生成的備份數據文件
ls /data0/backup/mysql/delta/
ibdata1.delta xtrabackup_checkpoints xtrabackup_logfile

  注:在增量備份目次下,數據文件都是以.delta開頭的。增量備份只備份上一次全量備份後被修正過的page,所以增量備份只暫用較少的空 間。增量備份可以在增量備份的基本上增量。增量備份目次每次都需修正的。好比第二次增量就改成/data0/backup/mysql/delta2)

  增量備份恢復進程:

  起首須要分離對全量、增量備份各做一次prepare操作。

BASH

xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base
xtrabackup_55 --defaults-file=/data0/mysql/my.cnf --prepare --target-dir=/data0/backup/mysql/base --incremental-dir=/data0/backup/mysql/delta/

  從備份目次復制對應數據庫表構造到默許的數據目次

BASH

cp -r /data0/backup/mysql/testinnodb/ /data0/mysql/data/

  刪除默許數據目次中對應的數據文件並復制備份的數據文件到默許數據目次

BASH
rm /data0/backup/mysql/ib*
cp /data0/backup/mysql/ib* /data0/mysql/data/

  修正數據目次權限

BASH
chown -R mysql:mysql /data0/mysql/data

  重啟MySQL

BASH
/data0/mysql/mysql restart

  4、innobackupex的備份與恢復應用

  A、數據備份

  平日普通都直接應用innobackupex,由於它能同時備份InnoDB和MyISAM引擎的表。要留意的是my.cnf裡datadir這個參數是必需要指定的,xtrabackup_55是依據它去定位innodb數據文件的地位。

  innobackupex語法

BASH

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

各參數解釋:

--defaults-file
同xtrabackup的--defaults-file參數

--apply-log
對xtrabackup的--prepare參數的封裝

--copy-back
做數據恢復時將備份數據文件拷貝到MySQL辦事器的datadir ;

--remote-host=HOSTNAME
經由過程ssh將備份數據存儲到過程辦事器上;

--stream=[tar]

備份文件輸入格局, tar時應用tar4ibd , 該文件可在XtarBackup binary文件中取得.假如備份時有指定--stream=tar, 則tar4ibd文件所處目次必定要在$PATH中(由於應用的是tar4ibd去緊縮, 在XtraBackup的binary包中可取得該文件)。

在應用參數stream=tar備份的時刻,你的xtrabackup_logfile能夠會暫時放在/tmp目次下,假如你備份的時刻並發寫入較年夜的話xtrabackup_logfile能夠會很年夜(5G+),極可能會撐滿你的/tmp目次,可以經由過程參數--tmpdir指定目次來處理這個成績。

--tmpdir=DIRECTORY

當有指定--remote-host or --stream時, 事務日記暫時存儲的目次, 默許采取MySQL設置裝備擺設文件中所指定的暫時目次tmpdir

--redo-only --apply-log組,

強迫備份日記時只redo ,跳過rollback。這在做增量備份時異常需要。

--use-memory=#

該參數在prepare的時刻應用,掌握prepare時innodb實例應用的內存量

--throttle=IOS

同xtrabackup的--throttle參數

--sleep=是給ibbackup應用的,指定每備份1M數據,進程停滯拷貝若干毫秒,也是為了在備份時盡可能減小對正常營業的影響,詳細可以檢查ibbackup的手冊 ;

--compress[=LEVEL]
對備份數據迚行緊縮,僅支撐ibbackup,xtrabackup還沒有完成;

--include=REGEXP
對xtrabackup參數--tables的封裝,也支撐ibbackup。備份包括的庫表,例如:--include="test.*",意思是要備份test庫中一切的表。假如須要全備份,則省略這個參數;假如須要備份test庫下的2個表:test1和test2,則寫成:--include="test.test1|test.test2"。也能夠應用通配符,如:--include="test.test*"。

--databases=LIST
列出須要備份的databases,假如沒有指定該參數,一切包括MyISAM和InnoDB表的database都邑被備份;

--uncompress
解壓備份的數據文件,支撐ibbackup,xtrabackup還沒有完成該功效;

--slave-info,
備份從庫, 加上--slave-info備份目次下會多生成一個xtrabackup_slave_info 文件, 這裡會保留主日記文件和偏移, 文件內容相似於:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0

--socket=SOCKET
指定mysql.sock地點地位,以便備份過程登錄mysql.

備份前起首所須要樹立一個備份所需的目次

BASH

mkdir -p /data0/backup/mysql

  1、通俗備份

BASH

innobackupex --database="testinnodb test" --user=root --no-lock --defaults-file=/data0/mysql/my.cnf /data0/backup/mysql 2>/tmp/mysqlbackup.log

  注:應用mysql的root用戶將數據庫testinnodb和test的備份,備份途徑是/data0/backup/mysql/。備份 勝利後會在該目次下將創立以時光戳為稱號的備份目次。no-lock參數用於指定備份時不鎖定表。2>/tmp/mysqlbackup.log是 將備份進程中的輸入信息保留到/tmp/mysqlbackup.log中。

  2、打包備份

BASH

innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log 1>/data0/backup/mysql/mike.tar

  注:這類備份時光會比擬長,重要是履行緊縮操作。這類方法打的包須要應用tar izxvf解壓。參數-i是必需加上的。

  3、緊縮備份

BASH

innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/ 2>/tmp/innobackup.log|gzip>/data0/backup/mysql/mike.tar.gz

  4、備份到長途辦事器
  
  備份以後機械下的數據到192.168.1.101的/data0/目次下。

BASH

innobackupex --database="testinnodb test" --user=root --defaults-file=/data0/mysql/my.cnf --no-lock --stream=tar /data0/backup/mysql/|ssh [email protected] cat ">"/data0/backup.tar

  B、數據恢復

  以緊縮後的備份數據為例,通俗備份和打包備份的恢復辦法和這個相似,就不在舉例了。

  解包備份數據

BASH

tar xvzfi mike.tar.gz

  指定恢復備份所需的xtrabackup_logfile文件的目次

BASH

innobackupex --apply-log --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql

  從備份目次拷貝數據、索引、日記到my.cnf文件裡劃定初始的數據目次地位。

BASH

innobackupex --copy-back --user=root --defaults-file=/data0/mysql/my.cnf --no-lock /data0/backup/mysql

  修正數據目次權限

BASH

chown -R mysql:mysql /data0/mysql/data

  重啟MySQL

BASH

/data0/mysql/mysql restart

  5、參考文檔

  http://www.谷歌.com
  http://www.linuxidc.com/Linux/2011-05/35410.htm
  http://blogold.chinaunix.net/u4/122567/showart_2537465.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved