天天看点

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,如需转载请自行联系原作者