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进行逻辑备份和恢复,虽然可以节省磁盘空间,但是速度很慢。