Percona XtraBackup
简介
Percona XtraBackup是世界上唯一的开源免费MySQL热备份软件,可为InnoDB和XtraDB 数据库执行无阻塞备份。使用Percona XtraBackup,有以下优点
- 备份快速可靠地完成
- 备份期间不间断的事务处理
- 节省磁盘空间和网络带宽
- 自动备份验证
- 由于更快的恢复时间,正常运行时间更长
Percona XtraBackup可与MySQL,MariaDB和Percona Server配合使用。它支持InnoDB,XtraDB和HailDB 存储引擎的完全非阻塞备份。此外,它还可以通过在备份结束时暂时暂停写入来备份以下存储引擎:MyISAM, Merge和Archive,包括分区表,触发器和数据库选项。
这里有一点需要注意,在MariaDB10.3.x及以上的版本用Percona XtraBackup工具会有问题。原因可能是MariaDB10.3以上版本的redo日志格式和之前不同了。
Percona的官方文档:https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
Mariabackup的官方文档:https://mariadb.com/kb/en/library/mariabackup-overview/
这个物理备份工具的原理可以参考这篇文章: http://mysql.taobao.org/monthly/2016/03/07/
功能
- 创建热InnoDB备份而不暂停数据库
- 进行MySQL的增量备份
- 将压缩的MySQL备份流式传输到另一台服务器
- 在线MySQL服务器之间移动表
- 轻松创建新的MySQL从库
- 备份MySQL而不增加服务器负载
安装
官网下载页面: https://www.percona.com/downloads/XtraBackup/LATEST/
1.安装yum仓库
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
2.安装Percona XtraBackup
yum install percona-xtrabackup-24
常用选项
- - -apply-log-only
此选项仅在准备备份时,执行重做阶段。在恢复之前,需要将事务日志里的变化合并到物理数据中,这个过程叫做apply-log - - -backup
进行备份 - - -compress
此选项告诉xtrabackup使用指定的压缩算法压缩所有输出数据,包括事务日志文件和元数据文件。目前唯一支持的算法是quicklz。生成的文件具有qpress存档格式,即*.qpxtrabackup生成的每个文件本质上都是一个文件的qpress存档,可以通过qpress 文件存档提取和解压缩。 - - -copy-back
将先前制作的备份中的所有文件从备份目录复制到data目录位置。 - - -defaults-file=[MY.CNF]
仅读取给定文件中的默认选项。必须作为命令行中的第一个选项。必须是真实的文件; 它不能成为一种象征性的联系。 - - -incremental-basedir=DIRECTORY
创建增量备份时,这是包含完整备份的目录,该备份是增量备份的基础数据集。 - - -incremental-dir=DIRECTORY
准备增量备份时,这是增量备份与完整备份组合的目录,以进行新的完整备份。 - - -move-back
将先前制作的备份中的所有文件从备份目录移动到其原始位置。由于此选项会删除备份文件,因此必须谨慎使用。 - - -target-dir=DIRECTORY
此选项指定备份的目标目录。如果该目录不存在,则xtrabackup会创建它。如果目录确实存在且为空,则xtrabackup将成功。 但是,xtrabackup不会覆盖现有文件; - - -user=USERNAME
此选项指定连接到服务器时使用的MySQL用户名 - - -password=PASSWORD
此选项指定连接到数据库时要使用的密码 - - -prepare
使xtrabackup在使用创建的备份上执行恢复 - - -parallel=#
设置并发数量,一般可以4个,但是具体根据cpu调整
完全备份
- 完全备份
备份的时候,会立即将内存中已提交的数据页落盘,然后开始备份数据,记录此时的LSN号,数据库可能还会继续跑,然后不断地监控redo和undo日志,如果有变化,也会把事务日志也一起备走并记录最后一个LSN号。
xtrabackup --user=root --password=centos --backup \
-S /tmp/mysql.sock \
--target-dir=/backup/fullback
完全备份的恢复
- 准备备份
使用该选项进行备份后,您首先需要准备它以便恢复它。数据文件在准备之前不是时间点一致的,因为它们在程序运行时的不同时间被复制,在数据文件中的LSN号和事务日志中的LSN号不一致,备份的数据结合事务日志,该回滚回滚,该提交提交,相当于模拟了CSR的过程,这时候就能保证数据的一致性,数据库才能启动,否则检测到数据不一致是无法启动的。
xtrabackup --prepare --target-dir=/backup/fullback
- 恢复全备
xtrabackup --copy-back --target-dir=/backup/fullback
- 修改权限
chown -R mysql:mysql /usr/local/mysql/data/
至此一次完全备份与恢复完成
增量备份
无论xtrabackup和innobackupex工具支持增量备份,这意味着它们可以只复制自上次备份以来发生变化的数据。
增量备份有效,因为每个InnoDB页面都包含一个日志序列号或LSN。该LSN是整个数据库系统的版本号。每个页面的LSN显示它最近的更改。
增量备份的方式是基于上一次备份进行的,增量备份无法单独恢复,必须基于全备进行恢复,所有的增量必须要按照顺序合并到全备中
- 创建一个全备
xtrabackup -uroot -p123456 --backup --target=dir=/backup/fullback/
- 基于全备做第一次增量备份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/xtrabackup_backupfiles/
- 基于全备做第二次增量备份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1/
查看三个备份的xtrabackup_checkpoints,可以看到里面的LSN是连续的
[root@localhost backup]# cat /backup/xtrabackup_backupfiles/xtrabackup_checkpoints /backup/inc1/xtrabackup_checkpoints /backup/inc2/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 63271483
last_lsn = 63271492
compact = 0
recover_binlog_info = 0
backup_type = incremental
from_lsn = 63271483
to_lsn = 63271483
last_lsn = 63271492
compact = 0
recover_binlog_info = 0
backup_type = incremental
from_lsn = 63271483
to_lsn = 63271483
last_lsn = 63271492
compact = 0
recover_binlog_info = 0
增量备份的恢复
- 准备基础备份(全备)
xtrabackup -uroot -p123456 --prepare --apply-log-only --target-dir=/backup/xtrabackup_backupfiles/
- 准备第一次增量备份
xtrabackup --prepare --apply-log-only --target-dir=/backup/xtrabackup_backupfiles/ --incremental-dir=/backup/inc1
- 准备第二次增量备份
xtrabackup --prepare --target-dir=/backup/xtrabackup_backupfiles/ --incremental-dir=/backup/inc2
查看一下check_point文件
[root@localhost backup]# cat /backup/xtrabackup_backupfiles/xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 63271099
last_lsn = 63271108
compact = 0
recover_binlog_info = 0
- 恢复
xtrabackup -uroot -p123456 --copy-back --target-dir=/backup/xtrabackup_backupfiles/
- 修改权限
chown -R mysql:mysql /data/
至此一次完全备份与恢复完成
备份多出来的文件
-
xtrabackup_info
记录备份的基本信息,uuid、备份命令、备份时间、binlog、LSN、以及其他加密压缩等信息。 -
xtrabackup_checkpoints
记录备份类型(如完全或增量)和LSN(日志序列号)范围信息,xtrabackup备份的时候会先将内存里的数据页刷新到磁盘,然后记录当时的LSN号也就是to_lsn
,这时候数据库可能还会继续跑,last_lsn
就是备份结束的最后一个LSN号码。而from_lsn
增量备份的时候会用到
[root@localhost backup]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 63242125
last_lsn = 63242134
compact = 0
recover_binlog_info = 0
- xtrabackup_logfile
备份过程中的redo日志 - xtrabackup_binlog_info
记录备份时刻,binlog的文件名和结束的position位置