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 如何创建基于GTID的Slave
具体看:How to create a new (or repair a broken) GTID based slave
4.4辅助工具手册
具体看:Auxiliary Guides
参考
Xtrabackup安装及使用
Percona Xtrabackup - Documentation
xtrabackup原理及实施