MySQL物理备份恢复实战之XtraBackup
逻辑备份是SQL文件,可编辑。
物理备份就是二进制文件,不可编辑,数据库的一个副本(逻辑备份时SQL文件,可编辑)
特点:
-
有数据文件和目录组成,是mysql数据目录的全部/拷贝
-
速度快,文件复制
-
备份粒度小
-
除了备份数据以外,还可以备份日志和配置文件
适合场景:
最适合大数据量的备份,比如百GB,TB级……
物理备份方法:
-
xtrabackup(percona公司开源免费的,早期对应的官方收费版本innobackup)
-
mysql enterprise backup(MEB/mysqlbackup),官方收费
-
其他:cp/tar/scp/rsync,最适合停机复制和拷贝,
-
mylvmbackup: lvm-snapshot:基于LVM快照的备份,比较麻烦,早期使用,替代品:mysqlbackup+xtrabackup
-
mysqlhotcopy:只针对myisam,不支持innodb,已经被废弃,替代品就是mysqldump+mysqlbackup
xtrabackup
说明
在2.3.3版本之前备份会产生死锁,2.3.3之后就不再死锁了,如果在mysql5.7以后使用,需要使用2.4.4才可以。
优点:
-
支持官方mysql、percona、mariadb,只支持linux,不支持Windows
-
支持在线热备,不会影响正在执行的事务,对服务器不会带来性能问题
-
备份速度快
-
支持压缩
-
支持加密
-
支持自动实现备份验证校验
-
恢复速度快
-
支持在线迁移表
-
支持创建一个slave从库
-
支持并行
-
支持全备,增量备份,部分备份
缺点:
-
不支持脱机备份
-
不支持直接备份到磁盘设备
-
不支持云备份
-
如果备份myisam,还存在阻塞
2.4版本中,innobackupex功能全部集成到xtrabackup里面,innobackupex作为xtrabackup的一个软链接,xtrabackup也支持非innodb表,在下一个版本中,官方信息是说要把innobackupex从产品中移除。
xtrabackup产品有两个工具命令:innobackupex,xtrabackup
-
xtrabackup主要备份innodb和xtraDB两种表
-
innobackupex则封装了xtrabackup,同时可以备份myisam数据表
下载和安装
https://www.percona.com/downloads
[root@itpuxdb app]# pwd
/mysql/app
[root@itpuxdb app]# ll percona-xtrabackup-2.4.11-Linux-x86_64.libgcrypt145.tar.gz
-rw-r--r-- 1 root root 83477311 Oct 4 2021 percona-xtrabackup-2.4.11-Linux-x86_64.libgcrypt145.tar.gz
[root@itpuxdb app]#
#做软连接
[root@itpuxdb app]# ln -sf percona-xtrabackup-2.4.11-Linux-x86_64 xtrabackup
[root@itpuxdb app]# ll
total 81548
drwx------ 2 mysql mysql 16384 Jan 31 2021 lost+found
lrwxrwxrwx 1 mysql mysql 35 Jan 31 2021 mysql -> mysql-5.7.20-linux-glibc2.12-x86_64
drwx------ 9 mysql mysql 4096 Jan 31 2021 mysql-5.7.20-linux-glibc2.12-x86_64
drwxrwxr-x 6 root root 4096 Apr 19 2018 percona-xtrabackup-2.4.11-Linux-x86_64
-rw-r--r-- 1 root root 83477311 Oct 4 2021 percona-xtrabackup-2.4.11-Linux-x86_64.libgcrypt145.tar.gz
lrwxrwxrwx 1 root root 38 Aug 9 23:48 xtrabackup -> percona-xtrabackup-2.4.11-Linux-x86_64
[root@itpuxdb app]#
#相关的命令
[root@itpuxdb bin]# pwd
/mysql/app/xtrabackup/bin
[root@itpuxdb bin]# ll
total 223212
lrwxrwxrwx 1 root root 10 Aug 9 23:47 innobackupex -> xtrabackup # innobackupex链接到xtrabackup但是两者的命令和帮助信息都是不一样的
-rwxr-xr-x 1 root root 5095024 Apr 19 2018 xbcloud #用于云上传和下载等
-rwxr-xr-x 1 root root 3020 Apr 19 2018 xbcloud_osenv #云上的操作
-rwxr-xr-x 1 root root 4981729 Apr 19 2018 xbcrypt #用于加密的
-rwxr-xr-x 1 root root 5046774 Apr 19 2018 xbstream #基于流备份的
-rwxr-xr-x 1 root root 213434185 Apr 19 2018 xtrabackup
[root@itpuxdb bin]#
#修改环境变量
vi ~/.bash_profile
PATH=$PATH:/mysql/app/mysql/bin:/mysql/app/xtrabackup/bin:$HOME/bin
source ~/.bash_profile
#检查版本
[root@itpuxdb bin]# xtrabackup --version
xtrabackup version 2.4.11 based on MySQL server 5.7.19 Linux (x86_64) (revision id: b4e0db5)
[root@itpuxdb bin]#
相关参数介绍
备份相关参数
innobackupex [--compress] [--compress-threads=NUMBER-OF-THREADS]
[--compress-chunk-size=CHUNK-SIZE]
[--encrypt=ENCRYPTION-algorithm]
[--encrypt-threads=NUMBER-OF-THREADS] [--encrypt-chunk-size=CHUNK-SIZE]
[--encrypt-key=LITERAL-ENCRYPTION-key] |
[--encryption-key-file=MY.KEY]
[--include=regexp] [--user=name]
[--password=WORD] [--port=port] [--socket=socket]
[--no-timestamp] [--ibbackup=IBBACKUP-binary]
[--slave-info] [--galera-info] [--stream=tar|xbstream]
[--defaults-file=MY.CNF] [--defaults-group=group-name]
[--databases=list] [--no-lock]
[--tmpdir=directory] [--tables-file=file]
[--history=name]
[--incremental] [--incremental-basedir]
[--incremental-dir] [--incremental-force-scan]
[--incremental-lsn]
[--incremental-history-name=name]
[--incremental-history-uuid=uuid]
[--close-files] [--compact]
backup-ROOT-DIR
准备阶段的参数
innobackupex --apply-log [--use-memory=B]
[--defaults-file=MY.CNF]
[--export] [--redo-only] [--ibbackup=IBBACKUP-binary]
backup-DIR
还原恢复方面的参数
innobackupex --copy-back [--defaults-file=MY.CNF]
[--defaults-group=group-name] backup-DIR
innobackupex --move-back [--defaults-file=MY.CNF]
[--defaults-group=group-name] backup-DIR
解压解密方面的参数
innobackupex [--decompress] [--decrypt=ENCRYPTION-algorithm]
[--encrypt-key=LITERAL-ENCRYPTION-key] |
[--encryption-key-file=MY.KEY]
[--parallel=NUMBER-OF-FORKS] backup-DIR
XtraBackup 备份恢复的流程与原理
xtrabackup支持innodb表,实际工作中是用innobackupex,这个命令下个版本就被废弃了。
innobackupex脚本用来备份非innodb的
xtrabackup脚本备份innodb表
innobackupex和xtrabackup是互通的。如果用innobackupex来备份,如果有innodb的表,innobackupex就会自动调用xtrabackup。
早期xtrabackup工具是由Perl和c同时写的两个进程,导致两个之间通信不好,在2011年时候用c重写了innobackupex,这个时候innobackupex功能全部集成到xtrabackup。为了兼容就做了一个软连接,
xtrabackup 完全备份的流程
第1步: start xtrabackup_log:
innobackupex 开启xtrabackup_log 监控线程,实时监测redo log 文件的变化,将新备份过程中新写入到事务日志中的日志拷贝到innobackup_log(xtrabackup_log)文件中;同时开启xtrabackup 拷贝线程,开始拷贝innodb 文件。
第2步: copy .ibd,ibdata1/2/3:
开始拷贝innodb 文件
第3步: 在复制innodb 文件结束后,进行flush tables with read lock;
第4步: 拷贝非innodb 文件,copy .frm; myd; myi,misc files 等非innodb 类型的文件。
第5步: 记录当前的binlog log position
第6步: 表解锁:unlock tables;
第7步: 停止xtrabackup_log 监控线程。
xtrabackup 完全恢复的流程
-- oracle:先restore 还原文件,再recover 数据一致性。
-- mysql:先prepare(recover)数据一致性,再copy(restore)还原文件。
第1步: 对全备份文件进行xtrabackup_log 日志回放,并对提交的事务进行重做(apply redo log recored),同时回滚未提交的事务(undo space)。这个过程叫prepare 阶段(类似于Oracle 的recover 过程),xtrabackup 会执行crash恢复。
– 在prepare 过程中,恢复备份集的日志,会启动一个mysqld 的服务进程,来做恢复实现一致性。
– 这个过程只针对innodb 表,非innodb(myisam)数据是不恢复的。所以建议以后不要再用myisam
第2步: 将全备文件复制到mysql 下的data 目录中。(所有的)
xtrabackup 增量备份的流程(用得少)
第1步: start xtrabackup_log:
innobackupex 开启xtrabackup_log 监控线程,实时监测redo log 文件的变化,将新备份过程中新写入到事务日志中的日志拷贝到innobackup_log(xtrabackup_log)文件中;同时开启xtrabackup 拷贝线程,开始拷贝innodb 文件。
第2步: 开始拷贝自上次innodb 备份后变化的数据页,条件是:当前的lsn > 上次全备/增量xtrabackup_checkpoints 中的lsn
第3步: copy .ibd,ibdata1/2/3:
开始拷贝innodb 文件
第4步: 在复制innodb 文件结束后,进行flush tables with read lock;
第5步: 拷贝非innodb 文件,copy .frm; myd; myi,misc files 等非innodb 类型的文件。
第6步: 记录当前的binlog log position
第7步: 表解锁:unlock tables;
第8步: 停止xtrabackup_log 监控线程。
xtrabackup 增量恢复的流程
第1步: 恢复全备(prepare)
第2步: 恢复增量,对未提交的事务进行回滚
第3步: 对全备与增量备份合并后的文件进行apply_log
第4步: 将备份文件拷贝到mysql data 目录下。