十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Percona XtraBackup简介
专注于为中小企业提供成都网站设计、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业乐昌免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了1000多家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
其是一款开源,免费的MySQL数据库热备工具,可对InnoDB存储引擎进行non-blocking的全备和增备,同时还支持压缩,加密和流式等特性.
安装Generic版本
1. root@db01 /data/software # ls percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz
percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz
2. root@db01 /data/software # tar zxf percona-xtrabackup-2.4.8-Linux-x86_64.tar.gz
3. root@db01 /usr/local # ln -s /data/software/percona-xtrabackup-2.4.8-Linux-x86_64 percona-xtrabackup-2.4.8
4.设置环境变量PATH
root@db01 ~ # grep 'PATH' .bash_profile
PATH=/usr/local/percona-xtrabackup-2.4.8/bin:/usr/local/sysbench-1.0.9/bin:/opt/mysql/bin:$PATH:$HOME/bin
export PATH
root@db01 ~ # xtrabackup --version
xtrabackup version 2.4.8 based on MySQL server 5.7.13 Linux(x86_64) (revision id: 97330f7)
同时也能查看Percona XtraBackup相应命令的man page了,如命令行敲入man xtrabackup.
root@db01 ~ # man -w
/usr/local/percona-xtrabackup-2.4.8/man:/opt/mysql/man:/usr/local/share/man:/usr/share/man/overrides:/usr/share/man/en:/usr/share/man
体会下命令xtrabackup的使用.
1.创建全备
root@db01 /data1/xtrabackup_test # xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_full --backup
创建增备
root@db01 /data1/xtrabackup_test # xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_inc --backup --incremental-basedir=./pxb_full
2. Prepare阶段
root@db01 /data1/xtrabackup_test # xtrabackup --target-dir=./pxb_full --prepare --apply-log-only --use-memory=4G
root@db01 /data1/xtrabackup_test # xtrabackup --target-dir=./pxb_full --prepare --use-memory=4G --incremental-dir=./pxb_inc
3.恢复备份
root@db01 /data1/xtrabackup_test # xtrabackup --defaults-file=/data1/3316/conf/my.cnf --target-dir=./pxb_full --copy-back
上面xtrabackup的工作过程简述如下.
xtrabackup启动后,会先创建redo线程,再创建ibd线程. redo线程负责拷贝事物日志,若是增备情况,其会根据上次备份中文件xtrabackup_checkpoints里to_lsn的值进行拷贝; ibd线程负责拷贝数据文件.
ibd线程拷贝事物数据文件过程中, redo线程会一直监控,并拷贝新增的事物日志.待ibd线程拷贝完事物数据文件, xtrabackup执行FLUSH TABLES WITH READ LOCK,获取全局读锁, ibd线程开始拷贝非事物数据文件,这期间redo线程仍在工作.待ibd线程拷贝完非事物数据文件,该线程结束, xtrabackup执行SHOW MASTER STATUS,获取二进制日志坐标,执行FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS,刷新InnoDB存储引擎日志,这时redo线程结束,执行UNLOCK TABLES,释放锁.最后写元数据.
Prepare阶段, xtrabackup进行crash recovery操作(类似InnoDB存储引擎的崩溃恢复),将提交的事物roll forward,未提交的事物roll back,将数据库恢复到FLUSH TABLES WITH READ LOCK时刻的一致状态.
接下来从三个场景出发进一步熟练xtrabackup的使用.
1.如何在从数据库上进行备份,用于部署一新的从数据库.
这里主要是参数--slave-info的使用,有了该参数,其会记录下主数据库二进制日志的坐标,类似于命令mysqldump的参数--dump-slave,命令行如下.
root@db02 /data1/xtrabackup_test # xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=pxb_full --backup --slave-info
注意,若从数据库开启了多线程复制, xtrabackup会退出,并报错如下.
The --slave-info option requires GTID enabled for a multi-threadedslave.
2. xtrabackup备份属于物理备份,相比mysqldump的逻辑备份,占用磁盘空间较大,实际使用中,一般会把备份文件压缩, xtrabackup有两种压缩方式,一是借助tar和gzip进行压缩,一是其自身提供了压缩功能.
2.1 tar和gzip方式
root@db01 /data1/xtrabackup_test # mkdir pxb_full
root@db01 /data1/xtrabackup_test # time xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_full --backup --stream=tar 2> ./pxb_full/pxb.log | gzip -> ./pxb_full/pxb_full.tar.gz
xtrabackup还提供了并行备份的参数--parallel,是否可以加速上面的过程呢,测试如下:
root@db01 /data1/xtrabackup_test # time xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_full --backup --stream=tar --parallel=4 2> ./pxb_full/pxb.log | gzip - > ./pxb_full/pxb_full.tar.gz
xtrabackup在STDERR中提示如下,参数--parallel不支持tar流,其会被忽略.
xtrabackup: warning: the --parallel option does not have anyeffect when streaming in the 'tar' format. You can use the 'xbstream' formatinstead.
2.2自带的压缩功能, quicklz和xbstream方式
root@db01 /data1/xtrabackup_test # mkdir pxb_full
root@db01 /data1/xtrabackup_test # time xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_full --backup --stream=xbstream --compress=quicklz 2> ./pxb_full/pxb.log > ./pxb_full/pxb_full.qp.xbstream
利用参数--compress-threads和--parallel加速上面的过程.
root@db01 /data1/xtrabackup_test # time xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_full --backup --stream=xbstream --compress=quicklz --compress-threads=4 --parallel=4 2> ./pxb_full/pxb.log > ./pxb_full/pxb_full.qp.xbstream
3.如何尽量快的部署一个从数据库呢...该过程可分成3个步骤:备份数据,传送备份,将数据准备到Prepare阶段前,在后的过程都是一样的.大致有4种方式,分别测试如下.
3.1 tar流, gzip压缩,通过scp传送到远端.
3.1.1备份数据
root@db01 /data1/xtrabackup_test # mkdir pxb_full
root@db01 /data1/xtrabackup_test # time xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_full --backup --stream=tar 2> ./pxb_full/pxb.log | gzip -> ./pxb_full/pxb_full.tar.gz
real 7m14.839s
user 7m7.201s
sys 0m6.227s
3.1.2.传送备份
root@db01 /data1/xtrabackup_test/pxb_full # time scp pxb_full.tar.gz 192.168.1.4:/data1/xtrabackup_test/pxb_full
pxb_full.tar.gz 100% 2214MB 110.7MB/s 00:20
real 0m19.992s
user 0m7.095s
sys 0m4.136s
3.1.3解压备份
root@db02 /data1/xtrabackup_test/pxb_full # time tar zxf pxb_full.tar.gz
real 1m7.359s
user 0m59.890s
sys 0m7.446s
总耗时: 7m14.839s + 0m19.992s + 1m7.359s = 522.190s
3.2 quicklz压缩, xbstream流,通过scp传送到远端.
3.2.1备份数据
root@db01 /data1/xtrabackup_test # time xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_full --backup --stream=xbstream --compress=quicklz --compress-threads=4 --parallel=4 2> ./pxb_full/pxb.log > ./pxb_full/pxb_full.qp.xbstream
real 0m19.780s
user 0m35.536s
sys 0m7.299s
3.2.2传送备份
root@db01 /data1/xtrabackup_test/pxb_full # time scp pxb_full.qp.xbstream 192.168.1.4:/data1/xtrabackup_test/pxb_full
pxb_full.qp.xbstream 100% 3032MB112.3MB/s 00:27
real 0m27.373s
user 0m10.102s
sys 0m6.272s
3.2.3提取,解压备份
解压quicklz算法压缩的文件,需安装工具qpress,将其和命令xtrabackup放在相同目录即可,下载链接: http://www.quicklz.com.
3.2.3.1提取
root@db02 /data1/xtrabackup_test/pxb_full # mkdir for_repl
root@db02 /data1/xtrabackup_test/pxb_full # time xbstream --extract --directory=./for_repl < pxb_full.qp.xbstream
real 0m4.760s
user 0m0.410s
sys 0m4.279s
3.2.3.2解压
root@db02 /data1/xtrabackup_test/pxb_full # time xtrabackup --target-dir=./for_repl --decompress --remove-original --parallel=4
real 0m8.714s
user 0m20.519s
sys 0m9.200s
总耗时: 0m19.780s + 0m27.373s + 0m4.760s + 0m8.714s = 60.627s
3.3 tar流,通过ssh传送到远端.
3.3.1备份,传送数据
root@db01 /data1/xtrabackup_test # mkdir pxb_full
root@db01 /data1/xtrabackup_test # time xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_full --backup --stream=tar 2> ./pxb_full/pxb.log | ssh 192.168.1.4 "tar xfi - --directory=/data1/xtrabackup_test/pxb_full"
real 1m0.779s
user 0m31.110s
sys 0m10.708s
总耗时: 1m0.779s = 60.779s
3.4 quicklz压缩, xbstream流,通过ssh传送到远端.
3.4.1备份数据
root@db01 /data1/xtrabackup_test # mkdir pxb_full
root@db01 /data1/xtrabackup_test # time xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_full --backup --stream=xbstream --compress=quicklz --compress-threads=4 2> ./pxb_full/pxb.log | ssh 192.168.1.4 "/usr/local/percona-xtrabackup-2.4.8/bin/xbstream - --extract --directory=/data1/xtrabackup_test/pxb_full --parallel=4"
real 0m48.778s
user 0m44.296s
sys 0m6.859s
3.4.2解压
root@db02 /data1/xtrabackup_test # time xtrabackup --target-dir=./pxb_full --decompress --remove-original --parallel=4
real 0m8.116s
user 0m20.610s
sys 0m9.236s
总耗时: 0m48.778s + 0m8.116s = 56.894s
可见第四种方法最快,第三种次之,但两者都是流式传送,要求网络环境较好,否则就是第二种方法了.
另,前面还说到xtrabackup提供了备份加密功能,其有key和key-file两种方式,此处选择key-file演示,同时一并梳理整个备份恢复过程.
1.制作key-file文件
root@db01 /data1/xtrabackup_test # openssl rand -base64 24
qEBPZrck0JQHYSnG8ScdW0UjAeKkOCFt
root@db01 /data1/xtrabackup_test # echo -n 'qEBPZrck0JQHYSnG8ScdW0UjAeKkOCFt' > /usr/local/percona-xtrabackup-2.4.8/bin/keyfile
2.备份数据
root@db01 /data1/xtrabackup_test # mkdir pxb_full
root@db01 /data1/xtrabackup_test # xtrabackup --defaults-file=/data1/3316/conf/my.cnf --login-path=mytest --target-dir=./pxb_full --backup --stream=xbstream --compress=quicklz --compress-threads=4 --encrypt=AES256 --encrypt-key-file=/data/software/percona-xtrabackup-2.4.8-Linux-x86_64/bin/keyfile --encrypt-threads=4 --parallel=4 2> ./pxb_full/pxb.log > ./pxb_full/pxb_full.qp.encrypt.xbstream
3.提取
root@db01 /data1/xtrabackup_test/pxb_full # mkdir for_recovery
root@db01 /data1/xtrabackup_test/pxb_full # xbstream --extract --directory=./for_recovery < pxb_full.qp.encrypt.xbstream
4.解密
root@db01 /data1/xtrabackup_test/pxb_full # xtrabackup --target-dir=./for_recovery --encrypt-key-file=/data/software/percona-xtrabackup-2.4.8-Linux-x86_64/bin/keyfile --decrypt=AES256 --remove-original --parallel=4
5.解压
root@db01 /data1/xtrabackup_test/pxb_full # xtrabackup --target-dir=./for_recovery --decompress --remove-original --parallel=4
6. Prepare阶段
root@db01 /data1/xtrabackup_test/pxb_full # xtrabackup --target-dir=./for_recovery --prepare --use-memory=4G
7.恢复
root@db01 /data1/xtrabackup_test/pxb_full # xtrabackup --defaults-file=/data1/3316/conf/my.cnf --target-dir=./for_recovery --copy-back --parallel=4
至此整个MySQL Database Backup Methods系列就结束了,算是自己的一个总结,也希望看到文章的人能有所收获.
再有,马上就国庆,中秋节了,提前祝福节日快乐!
若感兴趣可关注订阅号”数据库最佳实践”(DBBestPractice).