温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MySQL Database Backup Methods Season 3 – Percona XtraBackup

发布时间:2020-07-07 19:52:18 来源:网络 阅读:673 作者:coveringindex 栏目:MySQL数据库

Percona XtraBackup简介

其是一款开源, 免费的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_checkpointsto_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有两种压缩方式, 一是借助targzip进行压缩, 一是其自身提供了压缩功能.

 

2.1 targzip方式

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

 

xtrabackupSTDERR中提示如下, 参数--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 自带的压缩功能, quicklzxbstream方式

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提供了备份加密功能, 其有keykey-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).MySQL Database Backup Methods Season 3 – Percona XtraBackup

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI