天天看點

Xtrabacup的備份原理和實戰本文的流程圖和生産思想均來至于我的陳廣景老師,陳廣景老師,英文名Andy ,現就職某企業DBA 總監職位,感謝老師對我的技術指導 第1章 XTRABACKUP 第2章 資料庫恢複 附錄---Xtrabackup參數詳解

InnoDB 有個商業的InnoDB Hotbackup,可以對InnoDB引擎的表實作線上熱備。而 percona出品的Xtrabackup,是InnoDB Hotbackup的一個開源替代品,可以線上對InnoDB/XtraDB引擎的表進行實體備份。mysqldump支援線上備份,不過是邏輯備份,效率比較差。xtrabackup是開源的MySQL備份工具,實體備份,效率很不錯。

Xtrabackup有兩個主要的工具:xtrabackup、innobackupex,其中xtrabackup隻能備份InnoDB和XtraDB兩種資料表,innobackupex則封裝了xtrabackup,同時可以備份MyISAM資料表。Xtrabackup做備份的時候不能備份表結構、觸發器等等,智能紛紛.idb資料檔案。另外innobackupex還不能完全支援增量備份,需要和xtrabackup結合起來實作全備的功能。

C語言編寫,可以備份Innodb、XtraD,不拷貝*.frm檔案

支援的引擎有:

InnoDB、Xtradb:hotbackup

MyISAM: with read lock

具有的特點有如下幾點:

§  1)備份過程快速、可靠;

§  (2)備份過程不會打斷正在執行的事務;

§  (3)能夠基于壓縮等功能節約磁盤空間和流量;

§  (4)自動實作備份檢驗;

§  (5)還原速度快;

Xtrabackup工具由Percona公司開發的開源熱備工具,可以到官網下載下傳到最新的版本檔案。

方法一:

安裝依賴的包

yum install perl-DBI  perl-DBD-MySQL  perl-Time-HiRes perl-IO-Socket-SSL installperl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

方法二:

下載下傳好的rpm包,直接使用yum 安裝,自動安裝依賴包,但是需要有epel源的支援,是以要下載下傳配置好epe'源

wget -O /etc/yum.repos.d/epel.repo  http://mirrors.aliyun.com/repo/epel-6.repo

yum install -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

RELOAD 和 LOCKTABLES 權限為了執行 FLUSHTABLES WITH READ LOCK

REPLICATION CLIENT 為了擷取binary log位置

CREATE TABLESPACE 權限為了導入表,使用者表級别的恢複

SUPER權限在slave環境下備份用來啟動和關閉slave線程

InnoDB 和非InnoDB檔案的備份都是通過拷貝檔案,但是實作的方式是不同的。

InnoDB是以page為粒度做的的(Xtrabackup),Xtrabackup在讀取每個page時會校驗checksum值,保證資料塊是一緻的

非InnoDB是cp或者tar 指令,innobackupex在cp MyISAM檔案時已經做了flush(FTWRL),磁盤上的檔案也是完整的,是以最終備份集裡的資料檔案都是寫入完整的

1.5.1備份流程

<a href="http://s5.51cto.com/wyfs02/M00/86/FF/wKiom1fQrpGQrCDkAALW7UHiW68823.png-wh_500x0-wm_3-wmp_4-s_4215194542.png" target="_blank"></a>

<a href="http://s4.51cto.com/wyfs02/M00/86/FD/wKioL1fQrqnBl3hSAALMjooWVNI351.png-wh_500x0-wm_3-wmp_4-s_3431898812.png" target="_blank"></a>

<a href="http://s5.51cto.com/wyfs02/M01/86/FF/wKiom1fQrsDhqOw-AAPGCE50yx0683.png-wh_500x0-wm_3-wmp_4-s_3329256717.png" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M01/86/FD/wKioL1fQruPSgeC-AAIY-0MEszQ988.png-wh_500x0-wm_3-wmp_4-s_3798376976.png" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M02/86/FF/wKiom1fQru6T8zS0AAIeNOk4G2Q643.png-wh_500x0-wm_3-wmp_4-s_3917783122.png" target="_blank"></a>

<a href="http://s4.51cto.com/wyfs02/M01/86/FF/wKiom1fQryCRk1zSAASuWbKNcnU423.png-wh_500x0-wm_3-wmp_4-s_4093613146.png" target="_blank"></a>

<a href="http://s2.51cto.com/wyfs02/M02/86/FD/wKioL1fQry2RfyHaAAMHlbxr3_0079.png-wh_500x0-wm_3-wmp_4-s_2718106500.png" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/86/FD/wKioL1fQrzuxOI1FAARDzItY1-E610.png-wh_500x0-wm_3-wmp_4-s_912354122.png" target="_blank"></a>

規範操作,我們先建好全備和增量備份的路徑

[root@db01 backups]# pwd

/data/backups

[root@db01 backups]# ll

總用量 12

drwxr-xr-x 4 root root 4096 9月   4 17:28 full

drwxr-xr-x 4 root root 4096 9月   4 17:26 inc

操作過程:

 mkdir/data/backups/{full,inc} -p

*****生産環境中為了資料一緻性最好是ROW模式,因為其他的模式資料會丢失*****

指令文法格式:

1

<code>innobackupex --user=User--password=PWD</code><code>/data/backup/full</code> <code>--slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200  --</code><code>rsync</code>

--rsync 這個參數一般用作分布式資料庫叢集的時候

全備步驟:

1、準備一個xtr_test資料庫,并在xtr_test資料庫中插入testbackup表,字段包含id,step兩個字段

2

3

4

5

6

7

8

9

<code>mysql -uroot -p789 -S </code><code>/data/3306/mysql</code><code>.sock</code>

<code>show databases;</code>

<code>create database xtr_test;</code>

<code>use xtr_test;</code>

<code>select</code> <code>database();</code>

<code>create table testbackup(</code><code>id</code> <code>int not nullauto_increment primary key,step varchar(50))engine=innodb;</code>

<code>show tables;</code>

<code>desc testbackup;</code>

<code>show create table testbackup\G</code>

結果樣子:

10

11

12

13

14

15

16

17

<code>mysql&gt; desc testbackup;</code>

<code>+-------+-------------+------+-----+---------+----------------+</code>

<code>| Field | Type        | Null | Key | Default | Extra          |</code>

<code>| </code><code>id</code>    <code>|int(11)     | NO   | PRI | NULL    | auto_increment |</code>

<code>| step  |varchar(50) | YES  |     | NULL   |                |</code>

<code>2 rows </code><code>in</code> <code>set</code> <code>(0.02 sec)</code>

<code>mysql&gt; show create table testbackup\G</code>

<code>*************************** 1. row***************************</code>

<code>       </code><code>Table:testbackup</code>

<code>Create Table: CREATE TABLE `testbackup` (</code>

<code>  </code><code>`</code><code>id</code><code>`int(11) NOT NULL AUTO_INCREMENT,</code>

<code>  </code><code>`step`varchar(50) DEFAULT NULL,</code>

<code>  </code><code>PRIMARY KEY(`</code><code>id</code><code>`)</code>

<code>) ENGINE=InnoDB DEFAULT CHARSET=utf8</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

2、插入字段“firstfull backup”到testbackup表中

<code>insert into testbackup(step) values(</code><code>'first fullbackup'</code><code>);</code>

操作結果:

<code>mysql&gt; </code><code>select</code> <code>* from testbackup;</code>

<code>+----+-------------------+</code>

<code>| </code><code>id</code> <code>| step              |</code>

<code>|  1 | firstfull backup |</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.02 sec)</code>

3、執行全備

此時,我們建立的xtr_test資料庫中的testbackup表中有資料,而且我們建立的/data/backups/full檔案下面沒有任何内容。下面執行全備,操作指令上面已經給出,此次操作使用的多執行個體是以用到了--socket參數。

<code>innobackupex --user=root --password=789</code><code>/data/backups/full</code> <code>--slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200 --socket=</code><code>/data/3306/mysql</code><code>.sock</code>

執行結果一定要看到“160905 20:01:38 completedOK!" OK的字樣,才表示成功,從打出的日志我們也能看到備份的過程和上面給出的全備流程圖對比起來。

正确輸出以後會在/data/backups/full 指定的目錄中生成一個有時間和序号的目錄,這個目錄就是全備檔案存放地方如:

<code>[root@db01 ~]</code><code># ls -lrt /data/backups/full/</code>

<code>總用量 4</code>

<code>drwxr-x--- 8 root root 4096 9月   5 20:012016-09-05_20-01-32</code>

增量備份的前提是一定要有一個全備 ,隻有有了全備才能進行所謂的增量備份!!!

增量備份的方式有兩種,分别為:

第一種:通過全備的檔案

<code>innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249</code><code>/data/backups/inc</code>  <code>--slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=</code><code>/data/3306/mysql</code><code>.sock</code>

第二種方法:通過LSN

1、準備好全備最新一次的全備檔案,這裡隻做了一次,是以隻有一個目錄

<code>drwxr-x--- 8 root root 4096 9月   5 20:01 2016-09-05_20-01-32</code>

2、對xtr_test資料庫中的testbackup表,進行資料的插入,插入内容為“fist increment backup”

<code>mysql&gt; insert into testbackup(step)values(</code><code>'first increment backup'</code><code>);</code>

<code>Query OK, 1 row affected (0.02 sec)</code>

<code> </code> 

<code>+----+------------------------+</code>

<code>| </code><code>id</code> <code>| step                  |</code>

<code>|  1 | firstfull backup      |</code>

<code>|  2 | firstincrement backup |</code>

<code>2 rows </code><code>in</code> <code>set</code> <code>(0.01 sec)</code>

3、執行增量備份

這裡我們要确定好最新一次的全備(強調)!!!

<code>innobackupex --user=root --password=789--incremental  --incremental-basedir=</code><code>/data/backups/full/</code>

<code>2016-09-05_20-01-32 </code>

<code> </code><code>/data/backups/inc</code> <code>--slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200 --socket=</code><code>/data/3306/mysql</code><code>.sock</code>

這裡執行結果一定要看到“completed OK!" OK的字樣,才表示成功如果是分布式也可以用--rsync,我們會在建立的inc目錄下發現建立了一個以時間和序号命名的目錄,這個目錄就是Xtrabackup備份的增量。

執行結果:

<code>[root@db01 ~]</code><code># ll /data/backups/inc</code>

<code>drwxr-x--- 8 root root 4096 9月   5 20:19 2016-09-05_20-19-48</code>

TIP:innodb預設是使用的系統表空間,我們可以通過配置參數來使idb檔案到獨立空間中innodb_file_per_table = 1 這個是修改idb到獨立空間,如果資料庫是線上的,我們可以在配置檔案my.cnf配置以上參數後,再使用set globalinnodb_file_per_table= 1 臨時生效。

alter table backupstep engine=innodb; 修改表的引擎,這個操作很費時間,需要在業務低點的時候操作

在建立的xtr_test資料庫中的testbackup表中再次插入内容“secondincrement backup”

<code>mysql&gt; insert into testbackup(step) values(</code><code>'secondincrement backup'</code><code>);</code>

<code>Query OK, 1 row affected (0.01 sec)</code>

<code>+----+-------------------------+</code>

<code>| </code><code>id</code> <code>| step                    |</code>

<code>|  1 | firstfull backup       |</code>

<code>|  2 | first incrementbackup  |</code>

<code>|  3 | secondincrement backup |</code>

<code>3 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

1、确定最新的全備檔案

<code>[root@db01 full]</code><code># pwd</code>

<code>/data/backups/full</code>

<code>[root@db01 full]</code><code># ls -lrt</code>

   2、确定上一次增量備份的LSN值

<code>[root@db01 inc]</code><code># ls -lrt</code>

<code>[root@db01 inc]</code><code># cd 2016-09-05_20-19-48/</code>

<code>[root@db01 2016-09-05_20-19-48]</code><code># ls</code>

<code>backup-my.cnf krik    performance_schema      xtrabackup_checkpoints  xtr_test</code>

<code>ibdata1.delta mysql   </code><code>test</code>                    <code>xtrabackup_info</code>

<code>ibdata1.meta  oldboy xtrabackup_binlog_info xtrabackup_logfile</code>

<code>[root@db01 2016-09-05_20-19-48]</code><code># cat xtrabackup_checkpoints </code>

<code>backup_type = incremental</code>

<code>from_lsn = 1793716   </code><code>#這個值一定是和上一次全備的last_lsn一樣,否則就是資料不全</code>

<code>to_lsn = 1794019</code>

<code>last_lsn = 1794019</code>

<code>compact = 0</code>

<code>recover_binlog_info = 0</code>

4、

執行增量備份指令

<code>innobackupex  --user=root --password=789 --incremental--incremental-lsn=1794019 </code><code>/data/backups/inc</code> <code>--slave-info --safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=</code><code>/data/3306/mysql</code><code>.sock</code>

這個值是通過檢視最近一次增量備份的xtrabackup_checkpoints得到

這裡執行結果一定要看到“completed OK!" OK的字樣,才表示成功

執行結果會在指定的目錄/data/backups/inc下生成一個新的檔案

<code>[root@db01 2016-09-05_20-19-48]</code><code># cd ..</code>

<code>[root@db01 inc]</code><code># pwd</code>

<code>/data/backups/inc</code>

<code>總用量 8</code>

<code>drwxr-x--- 8 root root 4096 9月   5 21:18 2016-09-05_21-18-30</code>

到此我們對資料進行了完整的備份,下面會再建立一條語句,但是不會做增量備份,為了是下面測試二進制日志恢複資料。接下來要玩大的了,删庫,後面看看能恢複回來不

生産環境中為了資料一緻性最好是ROW模式,因為其他的模式資料會丢失

<code>mysql&gt; show variables like </code><code>"log_bin"</code><code>;</code>

<code>+---------------+-------+</code>

<code>| Variable_name | Value |</code>

<code>| log_bin      | ON    |</code>

<code>mysql&gt; show variables like</code><code>"%binlog_format%"</code><code>;</code>

<code>| binlog_format | ROW   |</code>

<code>ot root   418 9月   4 15:34backup-my.cnf</code>

<a href="http://s3.51cto.com/wyfs02/M02/86/FD/wKioL1fQsJiCReIpAAO0ToJ-qTo681.png-wh_500x0-wm_3-wmp_4-s_1765177744.png" target="_blank"></a>

<a href="http://s5.51cto.com/wyfs02/M01/86/FF/wKiom1fQsJqDoGuIAAUUglrMp00747.png-wh_500x0-wm_3-wmp_4-s_312740849.png" target="_blank"></a>

<a href="http://s2.51cto.com/wyfs02/M01/86/FF/wKiom1fQsJvRWvfRAAL_aCc9IE0363.png-wh_500x0-wm_3-wmp_4-s_2485763440.png" target="_blank"></a>

這裡隻做redo,不做undo

資料庫的恢複,是從全備---&gt;1次增量---&gt;2次增量......---&gt;N次增量直到故障點的位置的順序來恢複的

如果是全備:最近一次的全備----&gt; binlog

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<code>mysql&gt; insert into testbackup(step)values(</code><code>'second increment backup'</code><code>);</code>

<code>|  2 | firstincrement backup  |</code>

<code>mysql&gt; insert into testbackup(step)values(</code><code>'last  backup'</code><code>);</code>

<code>Query OK, 1 row affected (0.00 sec)</code>

<code>|  4 |last  backup            |</code>

<code>4 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code>mysql&gt; truncate table testbackup;</code>

<code>Query OK, 0 rows affected (0.02 sec)</code>

<code>Empty </code><code>set</code> <code>(0.00 sec)</code>

恢複資料庫的時候一定會重新開機一次資料庫的,是以我們可以選擇停庫操作(如果可以的情況下),下面以停庫操作練習:

1、  停掉資料庫

<code>[root@db01 inc]</code><code># /data/3306/mysql stop</code>

<code>Stoping MySQL...</code>

<code>[root@db01 inc]</code><code># netstat -lntup|grep 3306</code>

<code>[root@db01 inc]</code><code>#</code>

2、  恢複最近一次的全備,*****在操作前一定要先備份*****

<code>[root@db01 backups]</code><code># for i in `ls/data/backups/`;do cp -r $i /data/backups/$i.bak;done</code>

<code>[root@db01 backups]</code><code># ls</code>

<code>full full.bak  inc  inc.bak</code>

<code>[root@db01 backups]</code><code># cp -r /data/3306/data/data/backups/3306_data.bak</code>

<code>3306_data.bak full  full.bak  inc inc.bak</code>

3、  導入全備資料

<code>innobackupex --user=root --password=789 --apply-log--redo-only </code><code>/data/backups/full/2016-09-05_20-01-32--socket</code><code>=</code><code>/data/3306/mysql</code><code>.sock</code>

要确認看到OK字樣,表示導入成功

1、    确定第一次增量備份的檔案目錄

通過時間排序可以看到這裡第一次是2016-09-05_20-19-48,工作中可以自定義一些名字

2、    執行增量恢複

<code>innobackupex --user=root --password=789 --apply-log--redo-only </code><code>/data/backups/full/2016-09-05_20-01-32</code> <code>--incremental-</code><code>dir</code><code>=</code><code>/data/backups/inc/2016-09-05_20-19-48--socket</code><code>=</code><code>/data/3306/mysql</code><code>.sock</code>

 看到OK字樣表示成功

<code>innobackupex --user=root --password=789 --apply-log--redo-only </code><code>/data/backups/full/2016-09-05_20-01-32</code>   <code>--incremental-</code><code>dir</code><code>=</code><code>/data/backups/inc/2016-09-05_21-18-30--socket</code><code>=</code><code>/data/3306/mysql</code><code>.sock</code>

到此Xtrabackup昨晚了redo操作,下面我們要把他寫入資料檔案中。這一步才是把資料放到資料庫中

資料寫入資料檔案:

<code>innobackupex --user=root --password=789--apply-log </code><code>/data/backups/full/2016-09-05_20-01-32</code>  <code>--socket=</code><code>/data/3306/mysql</code><code>.sock</code>

同樣是看到OK字樣表示執行成功。

Xtrabackup恢複是把所有的增量都疊加到了全備的身上,也就是恢複用的全備。它就是資料庫data,我們把這個全備目錄替換了3306資料庫的data資料

33

34

35

36

37

38

39

40

41

<code>[root@db01 full]</code><code># rm -fr /data/3306/data/</code>

<code>[root@db01 full]</code><code># mv 2016-09-05_20-01-32//data/3306/data</code>

<code>[root@db01 full]</code><code># ll /data/3306/data</code>

<code>總用量 163884</code>

<code>-rw-r----- 1 root root       418 9月   5 20:01 backup-my.cnf</code>

<code>-rw-r----- 1 root root 134217728 9月   5 22:12 ibdata1</code>

<code>-rw-r----- 1 root root   4194304 9月   5 22:12 ib_logfile0</code>

<code>-rw-r----- 1 root root   4194304 9月   5 22:12 ib_logfile1</code>

<code>-rw-r----- 1 root root   4194304 9月   5 22:12 ib_logfile2</code>

<code>-rw-r----- 1 root root  12582912 9月   5 22:12 ibtmp1</code>

<code>drwxr-x--- 2 root root      4096 9月   5 22:10 krik</code>

<code>drwxr-x--- 2 root root      4096 9月   5 22:10 mysql</code>

<code>drwxr-x--- 2 root root      4096 9月   5 22:10 oldboy</code>

<code>drwxr-x--- 2 root root      4096 9月   5 22:10 performance_schema</code>

<code>drwxr-x--- 2 root root      4096 9月   5 22:10 </code><code>test</code>

<code>-rw-r----- 1 root root        22 9月   5 22:10 xtrabackup_binlog_info</code>

<code>-rw-r--r-- 1 root root        33 9月   5 22:12 xtrabackup_binlog_pos_innodb</code>

<code>-rw-r----- 1 root root       113 9月   5 22:12 xtrabackup_checkpoints</code>

<code>-rw-r----- 1 root root       630 9月   5 22:10 xtrabackup_info</code>

<code>-rw-r----- 1 root root   8388608 9月   5 22:04 xtrabackup_logfile</code>

<code>drwxr-x--- 2 root root      4096 9月   5 22:10 xtr_test</code>

<code>[root@db01 full]</code><code># chown -R mysql.mysql/data/3306/data/</code>

<code>-rw-r----- 1 mysql mysql       418 9月   5 20:01 backup-my.cnf</code>

<code>-rw-r----- 1 mysql mysql 134217728 9月   5 22:12 ibdata1</code>

<code>-rw-r----- 1 mysql mysql   4194304 9月   5 22:12 ib_logfile0</code>

<code>-rw-r----- 1 mysql mysql   4194304 9月   5 22:12 ib_logfile1</code>

<code>-rw-r----- 1 mysql mysql   4194304 9月   5 22:12 ib_logfile2</code>

<code>-rw-r----- 1 mysql mysql  12582912 9月   5 22:12 ibtmp1</code>

<code>drwxr-x--- 2 mysql mysql      4096 9月   5 22:10 krik</code>

<code>drwxr-x--- 2 mysql mysql      4096 9月   5 22:10 mysql</code>

<code>drwxr-x--- 2 mysql mysql      4096 9月   5 22:10 oldboy</code>

<code>drwxr-x--- 2 mysql mysql      4096 9月   5 22:10 performance_schema</code>

<code>drwxr-x--- 2 mysql mysql      4096 9月   5 22:10 </code><code>test</code>

<code>-rw-r----- 1 mysql mysql        22 9月   5 22:10 xtrabackup_binlog_info</code>

<code>-rw-r--r-- 1 mysql mysql        33 9月   5 22:12 xtrabackup_binlog_pos_innodb</code>

<code>-rw-r----- 1 mysql mysql       113 9月   5 22:12 xtrabackup_checkpoints</code>

<code>-rw-r----- 1 mysql mysql       630 9月   5 22:10 xtrabackup_info</code>

<code>-rw-r----- 1 mysql mysql   8388608 9月   5 22:04 xtrabackup_logfile</code>

<code>drwxr-x--- 2 mysql mysql      4096 9月   5 22:10 xtr_test</code>

重新開機資料庫測試

<code>[root@db01 full]</code><code># cd /data/3306</code>

<code>[root@db01 3306]</code><code># ./mysql start</code>

<code>Starting MySQL...</code>

<code>[root@db01 3306]</code><code># netstat -lntup|grep 3306</code>

<code>tcp       0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      56714</code><code>/mysqld</code>

<code>測試增量恢複正常,但是我們最後做的一次操作,沒有出現,下面使用二進制binglog來恢複</code>

使用binlog恢複資料,我們需要來确定一個“範圍”這裡我們需要确定從第二次增量備份後到執行删除表的sql語句之前這個範圍;查找範圍,我們可以使用時間範圍、位置點pos來取這個範圍。

<code>[root@db01 2016-09-05_21-18-30]</code><code># catxtrabackup_binlog_info</code>

<code>mysql-bin.000010   1201</code>

這裡我們知道了第二次增量結束後的位置點事1201,我們将以這個位置點為起止位置點

由于測試binlog日志檔案少,這裡很好查找,生産中要根據時間點來截取一段時間範圍内,然後在去查找

<code>[root@db01 3306]</code><code># mysqlbinlog--base64-output=decode-rows mysql-bin.000010</code>

<code># at 1376</code>

<code>#160905 21:46:41 server id 1  end_log_pos 1403     Xid = 164</code>

<code>COMMIT/*!*/;</code>

<code># at 1403</code>

<code>#160905 21:46:59 server id 1  end_log_pos 1495     Query    thread_id=7   exec_time=0   error_code=0</code>

<code>SET TIMESTAMP=1473083219/*!*/;</code>

<code>truncate table testbackup</code>

<code>/*!*/;</code>

<code># at 1495</code>

<code>#160905 21:52:16 server id 1  end_log_pos 1514     Stop</code>

<code>DELIMITER ;</code>

<code># End of log file</code>

<code>ROLLBACK /* added by mysqlbinlog */;</code>

<code>/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;</code>

<code>/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;</code>

通過查找到語句後,我們找到了位置點,我們可以導出一個檔案,通過vim編輯來搜尋語句

通過上面找出的起止點和終止點來恢複資料

<code>mysqlbinlog --base64-output=decode-rows -</code><code>v</code><code>--start-position=1201 --stop-position=1403 mysql-bin.000010</code>

來再次确認

恢複:

<code>[root@db01 3306]</code><code># mysqlbinlog --start-position=1201--stop-position=1403 mysql-bin.000010|mysql -uroot -p789 -S/data/3306/mysql.sock</code>

資料中檢視:

<code>4 rows </code><code>in</code> <code>set</code> <code>(0.01 sec)</code>

Xtrabackup常用參數選項如下:

--slave-info:

   它會記錄master伺服器的binary log的pos和name。會把記錄的資訊記錄在xtrabackup_slave_info。在備份從庫時,可以使用該參數, 加上--slave-info備份目錄下會多生成一個xtrabackup_slave_info 檔案, 這裡會儲存主日志檔案以及偏移, 檔案内容類似于:CHANGE MASTER TOMASTER_LOG_FILE='', MASTER_LOG_POS=0。

    這個參數适用的場景:假設現在有主庫A和從庫B,目前想再添加一台備庫C,并讓備庫C以主庫A為master;因為主庫A是生産庫,壓力一般比較大,是以我們就在備庫B上備份一個資料庫,然後把這個備份拿到C伺服器上 并導入到C庫,接下來再在C伺服器上執行change master的指令:其中 master_host是A的ip,而master_log_file和master_log_pos就是這個xtrabackup_slave_info裡面的值

--safe-salve-backup:

   它會停止slave SQL 程序,等備份完後,重新打開slave的SQL程序

--force-tar --stream=tar /tmp

   這些指令是用來壓縮備份為tar檔案。具體看官方文檔

--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資料庫的資料檔案目錄

本文轉自 kesungang 51CTO部落格,原文連結:http://blog.51cto.com/sgk2011/1850557,如需轉載請自行聯系原作者