1 Percona XtraBackup介绍
Percona XtraBackup是一个开源的MySQL热备份实用工具,用于执行MySQL的InnoDB和XtraDB数据库的非阻塞备份。
无论是24x7高负载服务器还是低事务量环境,Percona XtraBackup都能高效地进行热备份,而不会影响业务可用性和占用过多的数据库资源以及服务器性能。
Percona XtraBackup有以下优势:
- 免费和开源;
- 备份效率高,十分安全可靠;
- 备份不会阻塞事务;
- 不会占用过多的磁盘空间和网络带宽(可压缩);
- 自动备份验证;
- 恢复时间快
- 支持流、压缩和增量MySQL备份。
官方参考文档:https://docs.percona.com/percona-xtrabackup/8.0/about-xtrabackup.html
2 安装Percona XtraBackup
注意:下载前先确认自己的服务器和数据库的版本信息,根据实际情况下载相应的版本。
手动下载地址:https://www.percona.com/downloads
2.1 rpm包安装方式
一、使用YUM下载方式,下载RPM包:
[root@mysql001 xtrabackup]$ sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
二、启用percona库:
[mysql@mysql001 ~]$ sudo percona-release enable-only tools release
三、依赖包下载
[mysql@mysql001 ~]$ sudo yum install lz4 zstd
三、安装
[mysql@mysql001 ~]$ sudo yum install percona-xtrabackup-80
四、检查
[mysql@mysql001 ~]$ xtrabackup --version
xtrabackup: recognized server arguments: --datadir=/disk1/data --log_bin=/disk1/data/binlog/binlog --innodb_log_file_size=100M
xtrabackup version 8.0.22-15 based on MySQL server 8.0.22 Linux (x86_64) (revision id: fea8a0e)
四、卸载
如果版本不可用,需要卸载重装,卸载脚本如下:
[mysql@mysql001 ~]$ yum list | grep percona
[mysql@mysql001 ~]$ yum remove percona-xtrabackup-80.x86_64
2.2 tar包安装
tar包下载要选择的服务器版本是LINUX-GENERIC:
#解压:
[mysql@mysql001 xtrabackup]$ tar xvf percona-xtrabackup-8.0.34-29-Linux-x86_64.glibc2.17-minimal.tar.gz
#简化路径:
[mysql@mysql001 xtrabackup]$ mv percona-xtrabackup-8.0.34-29-Linux-x86_64.glibc2.17-minimal xtrabackup
[mysql@mysql001 xtrabackup]$ cd xtrabackup
#安装依赖包:
[mysql@mysql001 xtrabackup]$ sudo yum install -y perl-Digest-MD5 perl-DBD-MySQL libev
#bin目录,可执行文件
[mysql@mysql001 bin]$ cd /home/mysql/tools/xtrabackup/xtrabackup/bin/
[mysql@mysql001 bin]$ pwd
/home/mysql/tools/xtrabackup/xtrabackup/bin
#添加环境变量
[mysql@mysql001 bin]$ sudo vim /etc/profile
添加:
export XTRABACKUP_HOME=/home/mysql/tools/xtrabackup/xtrabackup
export PATH=$PATH:$HOME/bin:$XTRABACKUP_HOME/bin
#环境变量生效
[mysql@mysql001 bin]$ source /etc/profile
#检查,包含版本号、数据路径等信息
[mysql@mysql001 ~]$ xtrabackup --version
2024-01-04T01:31:22.623365+08:00 0 [Note] [MY-011825] [Xtrabackup] recognized server arguments: --datadir=/disk1/data --log_bin=/disk1/data/binlog/binlog --innodb_log_file_size=100M
xtrabackup version 8.0.34-29 based on MySQL server 8.0.34 Linux (x86_64) (revision id: 5ba706ee)
3 使用Percona XtraBackup
XtraBackup的备份恢复过程可以分为备份、准备(prepare)和恢复(restore)三个阶段。
在备份阶段,XtraBackup会复制InnoDB的数据文件,同时记录redo日志的变化。这个过程分为两个阶段,首先是备份redo日志文件,然后是复制InnoDB的数据文件。在备份数据文件时,XtraBackup会检测每个表空间中每个页的LSN(Log Sequence Number),如果LSN大于上次备份时的LSN,则备份该页。同时,XtraBackup还会记录当前检查点的LSN,以确保只备份自上次备份以来发生更改的数据页。
在准备阶段,XtraBackup的主要工作是通过回滚未提交的事务及同步已经提交的事务至数据文件来使数据文件达到一致性状态。这个过程类似于InnoDB的实例恢复。
在恢复阶段,XtraBackup会启动一个内嵌的InnoDB实例,然后回放xtrabackup日志(xtrabackup_log),将提交的事务信息变更应用到InnoDB数据/表空间,同时回滚未提交的事务。
3.1 备份
全量备份
[mysql@mysql001 full]$ xtrabackup --user=root --password=Mysql123. --backup --parallel=8 --target-dir=/disk1/bak/full
[mysql@mysql001 full]$ ls /disk1/bak/full/
backup-my.cnf binlog.index ibdata1 mysql.ibd sakila undo_001 xtrabackup_binlog_info xtrabackup_info xtrabackup_tablespaces
binlog.000045 ib_buffer_pool mysql performance_schema sys undo_002 xtrabackup_checkpoints xtrabackup_logfile
增量备份
一、在上面"–target-dir=/disk1/bak/full"全量备份的基础上进行增量备份:
[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --backup --parallel=8 --target-dir=/disk1/bak/inc --incremental-basedir=/disk1/bak/full
[mysql@mysql001 inc]$ ls /disk1/bak/inc/
backup-my.cnf ib_buffer_pool mysql performance_schema undo_001.delta undo_002.meta xtrabackup_info
binlog.000046 ibdata1.delta mysql.ibd.delta sakila undo_001.meta xtrabackup_binlog_info xtrabackup_logfile
binlog.index ibdata1.meta mysql.ibd.meta sys undo_002.delta xtrabackup_checkpoints xtrabackup_tablespaces
以delta结尾的文件,是记录原文件变化的数据。
二、在上面"–target-dir=/disk1/bak/inc --incremental-basedir=/disk1/bak/full"增量备份的基础上再进行增量备份:
[mysql@mysql001 inc1]$ xtrabackup --user=root --password=Mysql123. --backup --parallel=8 --target-dir=/disk1/bak/inc1 --incremental-basedir=/disk1/bak/inc
[mysql@mysql001 inc1]$ ls /disk1/bak/inc1
backup-my.cnf ib_buffer_pool mysql performance_schema test undo_002.delta xtrabackup_checkpoints xtrabackup_tablespaces
binlog.000047 ibdata1.delta mysql.ibd.delta sakila undo_001.delta undo_002.meta xtrabackup_info
binlog.index ibdata1.meta mysql.ibd.meta sys undo_001.meta xtrabackup_binlog_info xtrabackup_logfile
3.2 准备
以全量备份的准备阶段为例:
[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --prepare --parallel=8 --target-dir=/disk1/bak/full
3.3 恢复
要执行恢复备份,必须满足以下条件:
- 备份集要完成准备。
- 数据目录datadir必须为空。
- 不能恢复到正在运行的mysqld实例的数据目录(除非导入部分备份),在执行恢复之前需要关闭MySQL服务器。
以恢复全量备份为例:
[mysql@mysql001 disk1]$ sudo systemctl stop mysqld
[mysql@mysql001 disk1]$ systemctl status mysqld
[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --copy-back --target-dir=/disk1/bak/full
3.4 报错处理
报错信息如下:
[ERROR] [MY-011825] [Xtrabackup] Failed to connect to MySQL server: Can't connect to local MySQL server through socket
原因是在localhost连接Mysql服务时,会优先使用sock文件进行连接,而不是使用IP端口进行连接。
所以当可执行文件xtrabackup尝试使用sock文件进行连接时,无法获取sock文件的位置。
解决办法是给XtraBackup命令指定socket路径:
#添加
[mysql@mysql001 ~]$ sudo vim /etc/my.cnf
添加:
[xtrabackup]
socket=/var/lib/mysql/mysql.sock
添加的这个路径和[mysqld]中的保持一致。
#重启
[mysql@mysql001 ~]$ sudo systemctl restart mysqld