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版本。
核心功能对比
对比维度 | MySQL dump | XtraBackup |
---|---|---|
备份类型 | 逻辑备份(生成 SQL 脚本) | 物理备份(复制数据文件) |
备份速度 | 较慢(需逐条读取数据并生成 SQL) | 较快(直接复制文件,效率接近文件系统拷贝) |
恢复速度 | 较慢(需执行大量 SQL 插入数据) | 较快(直接拷贝文件,仅需少量日志恢复) |
对数据库影响 | 备份时会加锁(MyISAM 表)或产生读写压力 | 几乎无锁(InnoDB 表支持热备份,不阻塞读写) |
备份一致性 | 需通过--single-transaction 保证 InnoDB 一致性 | 自动通过 redo log 实现崩溃恢复,确保一致性 |
支持增量备份 | 不原生支持(需手动对比数据差异) | 原生支持(基于 LSN 日志序列号追踪变化) |
跨版本兼容性 | 较好(SQL 脚本可跨小版本恢复) | 较差(物理文件与 MySQL 版本绑定较紧) |
备份内容 | 仅包含数据库逻辑结构和数据 | 包含数据文件、日志、配置等完整物理文件 |
3. 适用场景
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-80sudo 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 installedDepends: libcurl4-openssl-dev but it is not going to be installedDepends: libev4 (>= 1:4.04) but it is not going to be installedpercona-xtrabackup-80 : Depends: libdbd-mysql-perl but it is not going to be installedDepends: libcurl4-openssl-dev but it is not going to be installedDepends: libev4 (>= 1:4.04) but it is not going to be installedDepends: libssl1.1 (>= 1.1.1) but it is not installableConflicts: 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进行逻辑备份和恢复,虽然可以节省磁盘空间,但是速度很慢。
本条目发布于 2021-11-14 。属于MySQL 分类, 作者是 zuojie@88.com 。