XtraBackup备份与恢复


XtraBackup

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。

  • 数据量非常的大的时间用它;
  • 全量备份和恢复数据库,速度很快;
  • 增量备份和恢复,主从时从服务器可以当做备份;
  • 热备(主库开机时备份数据);
  • 冷备(关闭mysql服务进行备份)。

xtrabackup是percona开源的mysql物理备份工具。

XtraBackup支持MySQL 5.1至8.0版本的备份和恢复。具体来说,不同版本的XtraBackup对MySQL版本的支持情况如下:

  • XtraBackup 2.4版本:可以备份和恢复MySQL 5.1、5.5、5.6和5.7版本的数据库,但不支持MySQL 8.0及以上版本。
  • XtraBackup 8.0版本:专门用于备份和恢复MySQL 8.0版本的数据库。需要注意的是,xtrabackup8.0.12以前版本不支持MySQL 8.0.20及以后版本的备份,因此如果需要备份更新版本的MySQL 8.0,建议使用更新的XtraBackup 8.0版本。

CentOS7 安装Xtrabackup 8.0

# 安装Percona yum存储库
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

# 启用Percona Server 8.0存储库
percona-release enable-only tools release
percona-release setup ps80

# 安装依赖环境
yum -y install  libev perl-DBD-mysql perl-Digest-MD5 epel-release

# 安装
yum -y install percona-xtrabackup-80-8.0.12

# 安装成功后测试版本
xtrabackup --version

#如果成功安装,则会显示Xtrabackup的版本信息。
#安装完成后,我们就可以使用Xtrabackup进行MySQL数据库备份和恢复操作了。

Ubuntu22.04 安装Xtrabackup 8.0

# 添加percona的软件仓库
sudo add-apt-repository 'deb http://repo.percona.com/apt focal main'
# 执行后需要敲一下回车

# 添加percona的公钥
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb

# 安装xtrabackup-80
sudo apt update
sudo apt install percona-xtrabackup-80

# 若安装过程中出现如下错误信息
The following packages have unmet dependencies:
percona-xtrabackup-80 : Depends: libssl1.1 (>= 1.1.1) but it is not installable
# 则下载libssl1.1安装一下

wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb

# 之后继续安装percona-xtrabackup-80

sudo apt install -y percona-xtrabackup-80

# 若安装过程中出现如下错误信息
The following packages have unmet dependencies:
 percona-xtrabackup-24 : Depends: libdbd-mysql-perl but it is not going to be installed
                         Depends: libcurl4-openssl-dev but it is not going to be installed
                         Depends: libev4 (>= 1:4.04) but it is not going to be installed
 percona-xtrabackup-80 : Depends: libdbd-mysql-perl but it is not going to be installed
                         Depends: libcurl4-openssl-dev but it is not going to be installed
                         Depends: libev4 (>= 1:4.04) but it is not going to be installed
                         Depends: libssl1.1 (>= 1.1.1) but it is not installable
                         Conflicts: percona-xtrabackup-24 but 2.4.28-1.jammy is to be installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
# 则根据提示执行相应的命令修复

sudo apt --fix-broken install

# 查看安装版本
sudo xtrabackup --version

全量备份

1.在备份服务器上创建一个目录,用于存储备份文件。

mkdir  /bak/

2.运行以下命令来执行完整备份:

# 全量备份,如果远程备份需要添加参数--host=IP,删除--socket参数
xtrabackup  --defaults-file=/etc/my.cnf  \
            --user=root  \
            --password=root123 \
            --port=3306  \
            --socket=/tmp/mysql.sock \
            --datadir=/usr/local/mysql/data \
            --backup \
            --target-dir=/bak/full

# 这将备份MySQL数据目录(/usr/local/mysql/data)到指定的目录(/bak/full )中。
通用选项:
-u, --user       # 数据库用户名 -u root            或 --user=root
-p, --password   # 数据库密码   -p root123         或 --password=root123
-P, --port       # 数据库端口号 -P 3306            或 --port=3306
-H, --host       # 远程连接地址 -H 192.168.8.36    或 --host=192.168.8.36
-S, --socket     # 本地数据连接 -S /tmp/mysql.sock 或 --socket=/tmp/mysql.sock
--datadir        # 指定MySQL数据库数据存放路径        --datadir=/usr/local/mysql/data
备份选项:
--backup         # 创建备份并且放入--target-dir目录中
--target-dir     # 指定backup的目的地,如果目录不存在,xtrabakcup会创建。如果目录存在且为空则成功。不会覆盖已存在的文件。
--incremental    # 创建增量备份
还原选项:
--prepare        # 预处理,合并数据文件和日志文件,确保数据完整性。
--apply-log-only # 在备份还在进行准备工作时,跳过消除(undo)阶段,只执行重做(redo)阶段,从而进行增量备份
--copy-back      # 将备份目录下的所有文件复制到数据库数据目录

全量还原

1.首先停止MySQL服务,并确保MySQL数据目录为空。

systemctl stop mysqld
# 或者 /etc/init.d/mysqld stop
rm -rf /usr/local/mysql/data/*

2.进行恢复:

# 1.合并数据文件和日志文件,确保数据完整性。
xtrabackup --prepare \
           --datadir=/usr/local/mysql/data \
           --target-dir=/bak/full

# 2.全备的恢复
xtrabackup  --copy-back \
            --datadir=/usr/local/mysql/data \
            --target-dir=/bak/full

# 3.修复所有者和权限
chown -R mysql:mysql /usr/local/mysql/data

# 4.启动MySQL
systemctl start mysqld
# 或者:/etc/init.d/mysqld start

# 5.登录测试
mysql -uroot -proot123
show databases;

增量备份

增量备份其实只针对的是InnoDB,对于MyISAM来说,还是完整备份。 增量备份前需要有一次全量备份。

# 增量备份
mkdir /bak/{inc1,inc2}
# 第一次增量备份
xtrabackup  --defaults-file=/etc/my.cnf  \
            --user=root  \
            --password=root123 \
            --port=3306  \
            --socket=/tmp/mysql.sock \
            --datadir=/usr/local/mysql/data \
            --backup \
            --target-dir=/bak/inc1 \
            --incremental-basedir=/bak/full

# 第二次增量备份
xtrabackup  --defaults-file=/etc/my.cnf  \
            --user=root \
            --password=root123 \
            --port=3306  \
            --socket=/tmp/mysql.sock \
            --datadir=/usr/local/mysql/data \
            --backup \
            --target-dir=/bak/inc2 \
            --incremental-basedir=/bak/inc1

增量还原

1.首先停止MySQL服务,并确保MySQL数据目录为空。

systemctl stop mysqld
# 或者 /etc/init.d/mysqld stop
rm -rf /usr/local/mysql/data/*

2.进行恢复:

# 增量备份的恢复,需要恢复增量备份到完全备份
## 1.准备全备
### 预处理,此选项--apply--log-only 阻止回滚未完成的事务
xtrabackup --prepare --apply-log-only --target-dir=/bak/full

## 2.将第一次增备添加到全备中
xtrabackup --prepare --apply-log-only --target-dir=/bak/full --incremental-dir=/bak/inc1

## 3.将第二次增备添加到全备中
xtrabackup --prepare --apply-log-only --target-dir=/bak/full --incremental-dir=/bak/inc2

## 4.将合并后的完备再一次准备复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
### A.合并数据文件和日志文件,确保数据完整性。
xtrabackup --prepare \
           --datadir=/usr/local/mysql/data \
           --target-dir=/bak/full
### B.全备的恢复
xtrabackup  --copy-back \
            --datadir=/usr/local/mysql/data \
            --target-dir=/bak/full

# 这将从备份中复制数据文件到MySQL数据目录,并将权限设置正确。

# 5.修复所有者和权限
chown -R mysql:mysql /usr/local/mysql/data

# 6.启动MySQL
systemctl start mysqld
#或者 /etc/init.d/mysqld start

# 7.登录测试
mysql -uroot -proot123
show databases;

Xtrabackup与mysqldump区别

Xtrabackup属于物理备份,mysqldump属于逻辑备份。

Xtrabackup占用的CPU与内存较少,消耗的IO相对较大,备份后的文件较大。

通过mysql自带的工具mysqldump进行逻辑备份和恢复,虽然可以节省磁盘空间,但是速度很慢。