Percona XtraBackup
是一款开源免费的 MySQL 热备份软件,使用Percona XtraBackup,您可以获得以下好处:
1.快速可靠地完成备份
2.备份期间不间断的事务处理
3.节省磁盘空间和网络带宽
4.自动备份验证
5.更快的恢复时间,更长的正常运行时间
Percona XtraBackup 支持 InnoDB、XtraDB 和 HailDB 存储引擎的非阻塞备份。此外 Percona XtraBackup 可以通过在备份结束时短暂暂停写入来备份以下存储引擎:MyISAM、 Merge和Archive,包括分区表、触发器和数据库选项。
Percona XtraBackup是一个开源的 MYSQL 热备份实用程序,它可以在不阻塞用户查询的情况下启用 MySQL 备份
Percona XtraBackup 2.4 可以备份 MySQL 5.5、5.6 和 5.7 ,但不支持备份 MySQL 8.0,如果需要备份 MYSQL8.0 就需要安装 Percona XtraBackup 8.0 以上版本。需要注意的是 Percona XtraBackup 2.4 不支持 MyRocks 或 TokuDB 存储引擎
官网下载地址:
https://www.percona.com/downloads
找到对应的下载包根据自己的系统下载就行,我这边是centos7的系统,所以下载centos7的包
直接用rpm安装就行
rpm -ivh percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm
xtrabackup --version 查看版本
[root@web71062 ~]# rpm -ivh percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm
warning: percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
error: Failed dependencies:
libaio.so.1()(64bit) is needed by percona-xtrabackup-24-2.4.26-1.el7.x86_64
libaio.so.1(LIBAIO_0.1)(64bit) is needed by percona-xtrabackup-24-2.4.26-1.el7.x86_64
libaio.so.1(LIBAIO_0.4)(64bit) is needed by percona-xtrabackup-24-2.4.26-1.el7.x86_64
libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.26-1.el7.x86_64
perl(DBD::mysql) is needed by percona-xtrabackup-24-2.4.26-1.el7.x86_64
perl(Digest::MD5) is needed by percona-xtrabackup-24-2.4.26-1.el7.x86_64
这个警告和错误是由于缺少一些依赖项导致的。根据错误信息,缺少的依赖项包括:
libaio.so.1()(64bit)
libaio.so.1(LIBAIO_0.1)(64bit)
libaio.so.1(LIBAIO_0.4)(64bit)
libev.so.4()(64bit)
perl(DBD::mysql)
perl(Digest::MD5)
你需要安装这些依赖项才能成功安装 percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm。你可以使用以下命令来安装这些依赖项:
sudo yum install libaio libev perl-DBD-MySQL perl-Digest-MD5
全量备份很好理解,就是把数据全部备份下来,主要的就是差异备份跟增量备份。
增量备份:
增量备份是基于上一次备份(可以是完整备份或增量备份)的增量更改进行的备份。
增量备份只备份自上一次备份以来发生的更改数据。
在恢复时,需要先恢复最近的完整备份,然后逐个应用增量备份,直到恢复到所需的时间点。
增量备份需要更多的时间和存储空间来进行恢复,因为需要逐个应用增量备份。
差异备份:
差异备份是基于上一次完整备份的差异数据进行的备份。
差异备份只备份自上一次完整备份以来发生的更改数据。
在恢复时,只需要恢复最近的完整备份和最后一个差异备份即可。
差异备份相对于增量备份来说,恢复速度更快,因为只需要应用最后一个差异备份。
总结:
增量备份备份的是自上一次备份以来的所有更改,而差异备份备份的是自上一次完整备份以来的差异数据。
增量备份需要更多的时间和存储空间来进行恢复,而差异备份恢复速度更快。
增量备份需要逐个应用增量备份,而差异备份只需要应用最后一个差异备份。
选择增量备份还是差异备份取决于您的需求和环境。如果您需要频繁备份,并且对恢复速度要求不高,可以选择增量备份。如果您需要快速恢复,并且备份频率较低,可以选择差异备份。
知道了原理那我们加下来讲一下差异备份跟增量备份怎么实现
前提:首先进行一次增量备份,线上环境可以在周日或者周做一次全量备份
全量备份
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --no-timestamp -uroot -p************** --parallel=4 --use-memory=1024M /opt/full_backup
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --no-timestamp -uroot -p************** --apply-log /opt/full_backup
这两条都需要执行
--defaults-file=/etc/my.cnf:指定 MySQL 配置文件的路径。
--no-timestamp:不在备份目录中添加时间戳。
-uroot:指定 MySQL 用户名为 root。
-p:指定 MySQL 密码。
--parallel=4:指定并行备份的线程数为 4。
--use-memory=1024M:指定备份过程中使用的内存大小为 1024M。
--apply-log:应用日志到备份中。
/opt/full_backup:指定备份的目标路径。
增量备份
/usr/bin/innobackupex --defaults-file=/etc/my.cnf -uroot -p*********** --incremental /opt/inc_backup/ --incremental-basedir=/opt/full_backup/
/usr/bin/innobackupex --defaults-file=/etc/my.cnf -uroot -p*********** --incremental /opt/inc_backup/ --incremental-basedir=/opt/inc_backup/2023-11-02_14-43-52
/usr/bin/innobackupex --defaults-file=/etc/my.cnf -uroot -p*********** --incremental /opt/inc_backup/ --incremental-basedir=/opt/inc_backup/2023-11-02_15-00-24
/usr/bin/innobackupex --defaults-file=/etc/my.cnf -uroot -p*********** --incremental /opt/inc_backup/ --incremental-basedir=/opt/inc_backup/2023-11-02_15-14-13
--incremental:指定进行增量备份。
--incremental-basedir=/opt/full_backup/:指定增量备份的基准目录,即全量备份的路径。
下面是三次差异备份的的命令
差异备份
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password=*********** --incremental /opt/inc_backup --incremental-basedir=/opt/full_backup
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password=********** --incremental /opt/inc_backup --incremental-basedir=/opt/full_backup
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password=********** --incremental /opt/inc_backup --incremental-basedir=/opt/full_backup
可以发现第一次进行差异备份跟增量备份的命令是一样的,结果也是一样的
但是,第二次开始就有了区别,增量备份第三次指定的基准目录是上一次增量备份的目录–incremental-basedir=/opt/inc_backup/2023-11-02_14-43-52,而不是最开始全量备份的目录/opt/full_backup
而差异备份每次指定的基准目录都是最开始的全量备份目录–incremental-basedir=/opt/full_backup
恢复
恢复得前提得先把数据库停掉,把数据目录清空,但是我不想停,所以我准备启动一个新的mysql实例配置文件是my38142.cnf 同事里面的datadir指定了新的数据目录datadir=/opt/mysqldata_bak,新的数据目录是空的就可以
/usr/bin/innobackupex --defaults-file=/etc/my38142.cnf -uroot -p********** --apply-log --redo-only /opt/full_backup/
合并数据 (合并的次数要增量备份的次数一样 并且合并的顺序也有与增量备份的顺序一致)
/usr/bin/innobackupex --defaults-file=/etc/my38142.cnf -uroot -p********** --apply-log --redo-only /opt/full_backup/ --incremental-dir=/opt/inc_backup/2023-10-12_16-34-30
合并第一次增量/差异备份
/usr/bin/innobackupex --defaults-file=/etc/my38142.cnf -uroot -p*********** --apply-log --redo-only /opt/full_backup/ --incremental-dir=/opt/inc_backup/2023-10-12_16-53-10
合并第二次增量/差异备份
/usr/bin/innobackupex --defaults-file=/etc/my38142.cnf -uroot -p*********** --apply-log --redo-only /opt/full_backup/ --incremental-dir=/opt/inc_backup/2023-11-02_14-43-52
合并第三次增量/差异备份
/usr/bin/innobackupex --defaults-file=/etc/my38142.cnf -uroot -p********** --copy-back /opt/full_backup/
恢复数据(把合并后的数据拷贝到数据库目录下)
这里需要注意的一点,合并的增量备份跟差异备份语句格式是一样的,指定的目录不一样而已,不是说第一次合并增量,第二次合并差异
启动实例
chown -R mysql:mysql mysqldata_bak
一定要给目录mysql权限
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my38142.cnf &
这样恢复的目录就起来了
但是有一点非常重要就是,合并的次数要增量备份的次数一样 并且合并的顺序也有与增量备份的顺序一致。举个例子我们先合并得第一次的差异备份,然后合并的第三次的差异备份,所以第二次的增量备份就恢复不了了。解决办法就是在合并第一次增量备份的时候就把第一次的全量备份先拷贝一份,养成好习惯,以防研发找恢复之前的备份导致不能用。
cp -Lr /opt/full_backup /opt/full_backup_1