4 如何使用和案例(How-tos and Recipes)

4.1 innobackupex案例

4.1.1 本地全备(备份,预备,还原)

创建备份


$ innobackupex /data/backups

备份完成

100313 02:43:07  innobackupex: completed OK!

 

预备备份


使用--apply-log来预备,使用--user-memory来加快预备速度

$ innobackupex --use-memory=4G --apply-log /data/backups/2010-03-13_02-42-44/

完成

100313 02:51:02  innobackupex: completed OK!

 

还原备份


使用--copy-back来还原备份

innobackupex --copy-back /data/backups/2010-03-13_02-42-44/

## Use chmod to correct the permissions, if necessary!

 

还原的位子由my.cnf中的datadir决定。

注意修改文件所有者

$ chown -R mysql:mysql /var/lib/mysql

 

4.1.2 使用Stream备份

tar使用例子


是用留备份归档到文件 ‘backup.tar’

$ innobackupex --stream=tar ./ > backup.tar

压缩归档文件

$ innobackupex --stream=tar ./ | gzip - > backup.tar.gz

加密备份

$ innobackupex --stream=tar . | gzip - | openssl des3 -salt -k "password" > backup.tar.gz.des3

把备份复制到远程

$ innobackupex --stream=tar ./ | ssh user@desthost "cat - > /data/backups/backup.tar"

使用netcat复制到远程

## On the destination host:

$ nc -l 9999 | cat - > /data/backups/backup.tar

## On the source host:

$ innobackupex --stream=tar ./ | nc desthost 9999

和上面一样只是一样完成

$ ssh user@desthost "( nc -l 9999 > /data/backups/backup.tar & )" \

&& innobackupex --stream=tar ./  |  nc desthost 9999

限制传输速度为10MB/s 需要pv工具。可以通过apt-get 安装

$ innobackupex --stream=tar ./ | pv -q -L10m \

| ssh user@desthost "cat - > /data/backups/backup.tar"

在备份的时候计算checksum

## On the destination host:

$ nc -l 9999 | tee >(sha1sum > destination_checksum) > /data/backups/backup.tar

## On the source host:

$ innobackupex --stream=tar ./ | tee >(sha1sum > source_checksum) | nc desthost 9999

## compare the checksums

## On the source host:

$ cat source_checksum

65e4f916a49c1f216e0887ce54cf59bf3934dbad  -

## On the destination host:

$ destination_checksum

65e4f916a49c1f216e0887ce54cf59bf3934dbad  -

 

xbstream使用例子


备份并归档为‘backup.xbstream

innobackupex --stream=xbstream ./ > backup.xbstream

使用压缩归档

innobackupex --stream=xbstream --compress ./ > backup.xbstream

解包

xbstream -x <  backup.xbstream

把备份发送到其他目录

innobackupex --compress --stream=xbstream ./ | ssh user@otherhost "xbstream -x"

并发压缩归档

innobackupex --compress --compress-threads=8 --stream=xbstream --parallel=4 ./ > backup.xbstream

4.1.3 创建增量备份

创建备份


先创建一个全备:

innobackupex --user=USER --password=PASSWORD /path/to/backup/dir/

全备会生成一个时间戳的子目录,备份在子目录里,如/path/to/backup/dir/2011-12-24_23-01-00/,并记为$FULLBACK

创建增量备份

innobackupex --incremental /path/to/inc/dir \
  --incremental-basedir=$FULLBACKUP --user=USER --password=PASSWORD

生成的目录为:/path/to/inc/dir/2011-12-25_00-01-00/并记为$INCREMENTALBACKUP

 

预备备份


innobackupex --apply-log --redo-only $FULLBACKUP \

 --use-memory=1G --user=USER --password=PASSWORD

--user-memory可以加速预备速度。

输出:

111225 01:10:12 InnoDB: Shutdown completed; log sequence number 91514213

然后应用增量

innobackupex --apply-log --redo-only $FULLBACKUP

 --incremental-dir=$INCREMENTALBACKUP

 --use-memory=1G --user=DVADER --password=D4RKS1D3

因为是应用到 $FULLBACK下的,所以不再增量备份文件夹下。

 

如果还原多个增量备份,但是忘记了备份顺序可以查看xtrabackup_checkpoint文件

如:

backup_type = full-backuped

from_lsn =0

to_lsn =1291135

 

backup_type = incremental

from_lsn =1291135

to_lsn =1291340

一旦都预备好之后,就可以回滚未提交事务,然后还原备份使用了

innobackupex-1.5.1 --apply-log $FULLBACKUP --use-memory=1G \

  --user=$USERNAME --password=$PASSWORD

 

4.1.4 创建压缩备份

备份


带--compress创建压缩备份

$ innobackupex --compress /data/backup

如果想要加快速度,可以使用--compress-threads加速

$ innobackupex --compress --compress-threads=4 /data/backup

输出:

...

[01] Compressing ./imdb/comp_cast_type.ibd to /data/backup/2013-08-01_11-24-04/./imdb/comp_cast_type.ibd.qp

[01]        ...done

[01] Compressing ./imdb/aka_name.ibd to /data/backup/2013-08-01_11-24-04/./imdb/aka_name.ibd.qp

[01]        ...done

...

130801 11:50:24  innobackupex: completed OK

 

预备


在预备之前先要使用qpress解压

$ for bf in `find . -iname "*\.qp"`; do qpress -d $bf $(dirname $bf) && rm $bf; done

在xtrabackup2.1.4之后也可以使用--decompress解压

$ innobackupex --decompress /data/backup/2013-08-01_11-24-04/

这个选项加压文件原来的文件会被替换为解压后的文件。

注意:使用--decompress需要安装qpress,并且--parallel可以和--decompress一起使用,加速解压缩。

 

然后使用--apply-log预备

$ innobackupex --apply-log /data/backup/2013-08-01_11-24-04/

 

还原


使用--copy-back还原数据库

$ innobackupex --copy-back /data/backups/2013-08-01_11-24-04/

--copy-back读取复制到my.cnf中的datadir的值

 

之后修改文件的所有者

$ chown -R mysql:mysql /var/lib/mysql

之后再启动服务

4.1.5 备份还原独立分区

xtrabackup可以部分备份,这个也让独立区的备份还原变成可能,只要启动innodb_file_per_table。

先创建一个分区表

create table t.tb_part (id int ,v int) partition by hash(id) partitions 4;

然后插入数据

insert t.tb_part values(1,1),(2,1),(3,1),(4,1);

这样保证每个分区都有1条记录。

4.1.5.1 创建备份

使用innobackupex --include进行备份,还有很多其他方法进行部分备份:

innobackupex --user=root  --include='^t[.]tb_part' /home/tiansign/mysql_backup

 

4.1.5.2 预备备份

和独立表还原类似,使用--export进行预备

innobackupex --apply-log --export /home/tiansign/mysql_backup/2014-08-19_23-25-55/

ls

tb_part.frm       tb_part#P#p0.ibd  tb_part#P#p2.cfg  tb_part#P#p3.exp

tb_part.par       tb_part#P#p1.cfg  tb_part#P#p2.exp  tb_part#P#p3.ibd

tb_part#P#p0.cfg  tb_part#P#p1.exp  tb_part#P#p2.ibd

tb_part#P#p0.exp  tb_part#P#p1.ibd  tb_part#P#p3.cfg

有类似如下输出

xtrabackup: export option is specified.

xtrabackup: export metadata of table 't/tb_part#P#p0' to file `./t/tb_part#P#p0.exp` (1 indexes)

xtrabackup:     name=GEN_CLUST_INDEX, id.low=58, page=3

xtrabackup: export metadata of table 't/tb_part#P#p2' to file `./t/tb_part#P#p2.exp` (1 indexes)

xtrabackup:     name=GEN_CLUST_INDEX, id.low=60, page=3

xtrabackup: export metadata of table 't/tb_part#P#p3' to file `./t/tb_part#P#p3.exp` (1 indexes)

xtrabackup:     name=GEN_CLUST_INDEX, id.low=61, page=3

xtrabackup: export metadata of table 't/tb_part#P#p1' to file `./t/tb_part#P#p1.exp` (1 indexes)

xtrabackup:     name=GEN_CLUST_INDEX, id.low=59, page=3

4.1.5.3 从备份还原

这里主要介绍maridb 10.0的方法,也适用于mysql5.6

首先创建表结构:

create table test.tb_part (id int ,v int) partition by hash(id) partitions 4;

create table test.p3 (id int ,v int) ;

然后discard

alter table test.p3 discard tablespace;

复制cfg和ibd到数据库目录下(在mariadb 10.0之后可以不用cfg文件,直接使用ibd文件)

cp tb_part#P#p3.ibd /home/db/test/p3.ibd

然后修改所有者

chown mysql:mysql /home/db/test/p3.ibd

最后 import 表

alter table test.p3 import tablespace;

最后通过exchange partition方式把表数据交换到分区表中

alter table test.tb_part exchange partition p3 with table test.p3;

验证

select *from test.tb_part;

 

4.2 xtrabackup案例

具体看:Recipes for xtrabackup

 

4.3 其他案例

4.3.1 六个步骤安装一个slave

需要的东西


1.TheMaster服务器

       a.需要安装mysql并且能公国tcp/ip访问

       b.配置了SSH服务

       c.有个系统账号,并有一些权限

       d.有个数据库账号,也有相应的权限

       e.服务的binlog启动,并且server-id为1

2.TheSlave,另一个系统安装了mysql,其他都和TheMaster一样,但是server-id要为2

3.2个系统都要安装xtrabackup

 

步骤1:创建一个备份并准备


TheMaster$ innobackupex --user=yourDBuser --password=MaGiCdB1 /path/to/backupdir

完成之后预备

TheMaster$ innobackupex --user=yourDBuser --password=MaGiCdB1 /

           --apply-log /path/to/backupdir/$TIMESTAMP/

如果你有特定的配置文件,那么通过--defaults-file=XXXX/my.cnf指定。默认使用备份目录下的backup-my.cnf。

 

步骤2:把备份复制到TheSlave


使用rsync来同步备份文件

TheMaster$ rsync -avprP -e ssh /path/to/backupdir/$TIMESTAMP TheSlave:/path/to/mysql/

关闭,mysql服务,并保存原先的数据库

TheSlave$ mv /path/to/mysql/datadir /path/to/mysql/datadir_bak

然后把备份复制到mysql配置的datadir下

TheSlave$ mv /path/to/mysql/$TIMESTAMP /path/to/mysql/datadir

修改文件所有者

TheSlave$ chown mysql:mysql /path/to/mysql/datadir

 

步骤3:配置Master


配置slave,master连接账号

TheMaster|mysql>GRANT REPLICATION SLAVE ON*.*  TO'repl'@'$slaveip'

 IDENTIFIED BY'$slavepass';

保证TheSlave可以通过这个账号连接到TheMaster

TheSlave$ mysql --host=TheMaster --user=repl --password=$slavepass

验证权限

mysql> SHOW GRANTS;

 

步骤4:配置Slave


先复制master 上的配置文件

TheSlave$ scp user@TheMaster:/etc/mysql/my.cnf /etc/mysql/my.cnf

然后修改server-id=2

server-id=2

启动slave上的服务

 

步骤5:启动复制


先查看xtrabackup_binlog_info来确定binary log的位置

TheSlave$ cat /var/lib/mysql/xtrabackup_binlog_info

TheMaster-bin.000001     481

使用CHANGE MASTER,账号密码使用刚才在master中申请的账号。

TheSlave|mysql>CHANGE MASTER TO

                MASTER_HOST='$masterip',

                MASTER_USER='repl',

                MASTER_PASSWORD='$slavepass',

                MASTER_LOG_FILE='TheMaster-bin.000001',

                MASTER_LOG_POS=481;

然后启动slave

TheSlave|mysql> START SLAVE;

 

步骤6:检查


TheSlave|mysql> SHOW SLAVE STATUS \G

         ...

         Slave_IO_Running: Yes

         Slave_SQL_Running: Yes

         ...

         Seconds_Behind_Master: 13

         ...

io和SQL都要运行,Seconds_behind_master是现在slave执行的语句在master上是13秒之前的数据。这个是master和slave之间的延迟。

4.3.2 再增加一个slave

过程基本上和上面类似

1.备份slave,要带上--slave-info,带上这个选项会产生一个xtrabackup_slave_info其中的master的binary log和位置都记录在这个文件上

TheSlave$ innobackupex --user=yourDBuser --password=MaGiCiGaM /

          --slave-info /path/to/backupdir

2.预备,增加了use-memory来加快预备速度

TheSlave$ innobackupex --apply-log --use-memory=2G /path/to/backupdir/$TIMESTAMP/

3.复制到是slave

rsync -avprP -e ssh /path/to/backupdir/$TIMESTAMP TheNewSlave:/path/to/mysql/datadir

4.在master上,再创建一个账号,当然也可以使用同一个账号,只要能连接上就可以

heMaster|mysql>GRANT REPLICATION SLAVE ON*.*  TO'repl'@'$newslaveip'

             IDENTIFIED BY'$slavepass';

5.复制配置文件,在启动的时候不启动复制,并设置server-id为3

TheNEWSlave$ scp user@TheSlave:/etc/mysql/my.cnf /etc/mysql/my.cnf

修改配置文件

Skip-slave-start

server-id=3

启动slave的服务

6.通过xtrabackup_slave_info获取master的日志名和位置

TheNEWSlave|mysql>CHANGE MASTER TO

                   MASTER_HOST='$masterip',

                   MASTER_USER='repl',

                   MASTER_PASSWORD='$slavepass',

                   MASTER_LOG_FILE='TheMaster-bin.000001',

                   MASTER_LOG_POS=481;

启动slave

TheSlave|mysql> START SLAVE;

4.3.3 使用复制和pt-checksum验证备份

具体看:Verifying Backups with replication and pt-checksum

4.3.4 如何创建基于GTIDSlave

具体看:How to create a new (or repair a broken) GTID based slave

 

4.4辅助工具手册

具体看:Auxiliary Guides

参考

Xtrabackup安装及使用

Percona Xtrabackup - Documentation

xtrabackup原理及实施

 

xtrabackup 安装、备份、还原及错误处理 教程