(1)备份开始时会开启一个后台检测进程,实时检测mysql redo(已提交的事务)的变化,一旦发现redo中有新日志写入,立刻将日志记入后台日志文件xtrabackup_log中,
(2)复制InnoDB的数据文件和系统表空间文件ibdata1,
(3)待复制结束后,执行flush tables with read lock操作,复制.frm、.MYI、.MY等文件
(4)执行flush tables with read lock的目的是为了防止数据表发生DML操作,并且在这一时刻获得binlog的位置,
(5)最后会发出unlock tables,把表设置为可读写状态,
(6)最终停止xtrabackup_log。
4.为什么要用XtraBackup
因为当数据库超过100G的话,用mysqldump就没有XtraBackup有优势,工作中mysqldump备份大的数据还会出现卡住,断开的可能性,XtraBackup支持完整备份,增量备份,完整恢复,增量恢复,对于innodb引擎备份时不锁表进行热备份。
二、XtraBackup安装
1.xtrabackup官网有很多个版本,有1.6、2.0-2.4和8.0,每个版本都有不同,根据自己需要下载安装,如:
xtrabackup1.6版本支持MySQL 5.0、5.1和5.5。
xtrabackup2.2和2.3版本支持备份MySQL 5.1 、5.5和5.6。
xtrabackup2.4版本支持MySQL 5.1、5.5、5.6和5.7。
xtrabackup8.0版本只支持MySQL8.0,不支持8.0之前的。
本文章使用xtrabackup2.3。
2.下载安装
官网有源码包下载,二进制包、还有存储库,官网推荐存储库下载,我这里环境用Centos7,所以用yum安装,这里选择安装yum install -y percona-xtrabackup.x86_64
1 yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
2 yum list | greppercona3 percona-xtrabackup.x86_64 2.3.10-1.el7 percona-release-x86_644 percona-xtrabackup-22.x86_64 2.2.13-1.el7 percona-release-x86_645 percona-xtrabackup-22-debuginfo.x86_64 2.2.13-1.el7 percona-release-x86_646 percona-xtrabackup-24.x86_64 2.4.18-1.el7 percona-release-x86_647 percona-xtrabackup-24-debuginfo.x86_64 2.4.18-1.el7 percona-release-x86_648 percona-xtrabackup-80.x86_64 8.0.9-1.el7 percona-release-x86_649 percona-xtrabackup-80-debuginfo.x86_64 8.0.9-1.el7 percona-release-x86_6410 percona-xtrabackup-debuginfo.x86_64 2.3.10-1.el7 percona-release-x86_6411 percona-xtrabackup-test.x86_64 2.3.10-1.el7 percona-release-x86_6412 percona-xtrabackup-test-22.x86_64 2.2.13-1.el7 percona-release-x86_6413 percona-xtrabackup-test-24.x86_64 2.4.18-1.el7 percona-release-x86_6414 percona-xtrabackup-test-80.x86_64 8.0.9-1.el7 percona-release-x86_64
安装之后,可以检查xtrabackup版本,我本地的数据库版本是5.6
1 xtrabackup --version2 xtrabackup version 2.3.6 based on MySQL server 5.6.24 Linux (x86_64) (revision id: )
3.工具介绍
Xtrabackup安装完成后有4个可执行文件,其中2个比较重要的备份工具是innobackupex、xtrabackup
innobackupex
innobackupex是一个封装xtrabackup的Perl脚本。。
xtrabackup
编译后的C二进制文件,提供了使用MyISAM,InnoDB和XtraDB表备份整个MySQL数据库实例的功能。
xbcrypt加密
用于加密和解密备份文件的实用程序。
xbstream
允许以流的形式从xbstream格式提取文件,类似tar。
xbcloud
用于从云中下载xbstream归档的全部或部分或将其上传到云。
官网说明:innobackupex仍然像2.2版本一样支持所有功能和语法,但是现在已弃用,并且将在下一个主要版本中删除,Percona XtraBackup 2.3版本的推荐方式采取的备份是使用xtrabackup脚本,这篇文章介绍innobackupex脚本,差别不大。
4.innobackupex命令参数
--user=#指定数据库备份用户--password=#指定数据库备份用户密码--port=#指定数据库端口--host=#指定备份主机--socket=#指定socket文件路径--databases= #备份指定数据库,多个空格隔开,如--databases="dbname1 dbname2",不加备份所有库--defaults-file=#指定my.cnf配置文件--apply-log #日志回滚--incremental=#增量备份,后跟增量备份路径--incremental-basedir=#增量备份,指上次增量备份路径--redo-only #合并全备和增量备份数据文件--copy-back #将备份数据复制到数据库,数据库目录要为空--no-timestamp #生成备份文件不以时间戳为目录名--stream= #指定流的格式做备份,--stream=tar,将备份文件归档,--stream=xbstream--remote-host=user@ip DST_DIR #备份到远程主机--use-memory=#该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量--parallel #用于复制数据文件的线程数。配合-stream=xbstream--compress #压缩功能,配合-stream=xbstream--compress-threads=4 #用于并行数据压缩的线程数。此选项的默认值为1。配合-stream=xbstream--throttle= #限制innobackupex读写InnoDB数据的速率
三、用innobackupex进行完整备份1.执行完整备份命令
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password="123456" --socket=/tmp/mysql.sock --no-timestamp /data/backup/$(date +%F)/full
最后输出下面信息表示成功备份
xtrabackup: Transaction log of lsn (42677124128) to (42677124128) was copied.
200127 13:21:18 completed OK!
在/data/backup目录下面生成一个当前日期命名的目录,时间目录下面的full目录里面存放着备份出来的文件
1 [root@devops 13:17:24/data/backup/]# ll2 total 2535576
3 drwx------ 3 root root 4096 Jan 27 13:17 2020-01-27
介绍一下目录的文件信息
1 [root@devops 13:21:18/data/backup/]# ll 2020-01-27/full/
2 total 141364
3 -rw-r----- 1 root root 388 Jan 27 13:21 backup-my.cnf #备份命令用到的配置信息4 -rw-r----- 1 root root 144703488 Jan 27 13:17ibdata1 #备份的表空间的文件5 drwx------ 2 root root 4096 Jan 27 13:21mysql #备份出来的mysql、performance_schema、test数据库6 drwx------ 2 root root 4096 Jan 27 13:21performance_schema7 drwx------ 2 root root 4096 Jan 27 13:21test8 -rw-r----- 1 root root 21 Jan 27 13:21xtrabackup_binlog_info #binlog日志信息9 -rw-r----- 1 root root 121 Jan 27 13:21xtrabackup_checkpoints #这个比较重要,里面存放着lsn(日志序列号)10 -rw-r----- 1 root root 602 Jan 27 13:21xtrabackup_info #存放一些工具版本、数据库版本、执行开始结束时间等信息11 -rw-r----- 1 root root 2560 Jan 27 13:21 xtrabackup_logfile #重做日志文件
2.模拟删除整个数据目录
cd /data/ && rm -rf mysqldata
3.kill掉mysql进程
pgrep mysql | xargs kill
4.准备
准备(prepare)一个完全备份
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
innobackupex命令的-apply-log选项可用于实现上述功能
不建议在准备时中断xtrabackup过程,因为这可能会导致数据文件损坏并且备份将变得不可用。如果准备过程中断,则不能保证备份的有效性。
innobackupex --apply /data/backup/2020-01-27/full/
最后输出:200127 13:44:47 completed OK!
5.查看xtrabackup_checkpoints文件
查看合并后的 checkpoints 其中的类型变为 full-prepared 即为可恢复。
backup_type = full-prepared
6.执行恢复之前要在my.cnf指定数据目录
恢复备份之前,datadir必须为空。要注意在执行还原之前需要关闭MySQL服务器。不能还原到正在运行的mysqld实例的数据目录(导入部分备份时除外)
1 cat /usr/local/mysql/my.cnf | grepdatadir2 datadir = /data/mysqldata
7.执行恢复命令
innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back /data/backup/2020-01-27/full
200127 13:56:37 completed OK!
如果恢复最后输出OK就没问题
8.修改权限
由于将保留文件的属性,因此在大多数情况下,mysql在启动数据库服务器之前,需要将文件的所有权更改为mysql
chown -R mysql.mysql /data/mysqldata
9.启动
service mysqld start
10.检查数据
总结:这篇文章介绍xtrabackup完整备份和还原,后面还会继续写,如果那里写得不好,请多多指教,谢谢