Xtrabackup使用文档
使用环境
- 系统版本:基于腾讯云的
Ubuntu18.04 - MySQL版本:基于docker的
mysql8.0.29 - Docker中MySQL目录与主机映射:
- 宿主机 ---> Docker的MySQL目录
- /opt/containerd/mysql/etc/conf/ -> /etc/mysql/conf.d
- /opt/containerd/mysql//var/lib/mysql -> /var/lib/mysql
- /opt/containerd/mysql//var/lib/mysql-files -> /var/lib/mysql-files
- MySQL的my.cnf配置文件信息
[mysqld] datadir=/var/lib/mysql/data basedir=/var/lib/mysql
Xtrabackup安装
参考链接:www.jianshu.com/p/e2d1231bd…
- 下载安装包:
由于我操作系统是Ubuntu18.04,故执行命令:wget https://repo.percona.com/apt/percona-release_latest.bionic_all.deb - 安装:
dpkg -i percona-release_latest.bionic_all.deb - 执行更新:
apt-get update - 查看软件包名称:
apt-cache search xtrabackup - 安装对应MySQL8的包:
apt-get install percona-xtrabackup-80
Xtrabackup备份与还原
- 前置准备工作:准备一个以
.cnf后缀的文件内容如下(此处我命名为my1.cnf,在/opt/dev目录下):
[mysqld]
datadir=/opt/containerd/mysql/var/lib/mysql/data
log-bin=/opt/containerd/mysql/var/lib/mysql/data/binlog
log-bin-index=/opt/containerd/mysql/var/lib/mysql/data/binlog.index
- 新建备份目录,此处我建立的目录为:
/opt/data/mysql_data_bak/full_bak,此目录用于存储备份文件。
全量备份与全量恢复
全量备份
- 首先在MySQL下新建数据库test1,并在库中新建表T1,然后添加数据如下:
- 开始全量备份,命令为:
xtrabackup --defaults-file=/opt/dev/my1.cnf \
--backup \
--datadir=/opt/containerd/mysql/var/lib/mysql/data \
--host=127.0.0.1 \
--user=root \
--password=123456 \
--port=3306 \
--target-dir=/opt/data/mysql_data_bak/full_bak/
###############################################################
其中:
--defaults-file为我们前期准备工作中准备的cnf文件
--target-dir为存储备份文件目录
执行成功后如下图:
此时,可以看到备份文件目录下的文件如下图:
全量恢复
- 清空MySQL的数据目录:
- 执行prepare命令
xtrabackup --prepare --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/,执行成功后如下图: - 执行copy-back命令:
xtrabackup --copy-back --datadir=/opt/containerd/mysql/var/lib/mysql/data --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/,执行成功后如下图: - 重启MySQL服务,由于我是基于Docker安装的,所以只需要重启Mysql对应Docker容器即可,此时可以看到数据已经恢复:
增量备份与增量恢复
- 在前面全量备份的基础上,此时进行增量备份,此时我在前面全量备份目录
full_bak平级新建了incr_bak1、incr_bak2和incr_bak3三个目录,如下图:
开始增量备份
- 在全量备份数据的基础上新增一条数据,如下图:
- 基于当前数据做一次全量备份:
xtrabackup --defaults-file=/opt/dev/my1.cnf --backup --datadir=/opt/containerd/mysql/var/lib/mysql/data --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/。 - 再增加一条数据,然后做第一次增量备份:
xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --backup --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/incre_bak1/ --incremental-basedir=/opt/data/mysql_data_bak/full_bak/,如下两图所示: - 再增加一条数据,然后基于上一次数据做增量备份:
xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --backup --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/incre_bak2/ --incremental-basedir=/opt/data/mysql_data_bak/incre_bak1/,结果如下图:
增量恢复
这里我们做3个实验,分别是:只恢复全量备份的文件、恢复全量备份+第一次增量备份、恢复全量备份+第一次增量+第二次增量。
只恢复全量备份
- 清空mysql存放data的目录:
rm -rf /opt/containerd/mysql/var/lib/mysql/data/* - 执行prepare:
xtrabackup --prepare --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/ - 执行copy-back:
xtrabackup --copy-back --datadir=/opt/containerd/mysql/var/lib/mysql/data --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/ - 重启mysql,最后结果如下图
恢复全量备份+第一次增量备份
- 清空mysql存放data的目录:
rm -rf /opt/containerd/mysql/var/lib/mysql/data/* - 合并全量备份:
xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --prepare --apply-log-only --target-dir=/opt/data/mysql_data_bak/full_bak/ - 合并第一次增量备份到全量备份里:
xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --prepare --target-dir=/opt/data/mysql_data_bak/full_bak/ --incremental-dir=/opt/data/mysql_data_bak/incre_bak1/ - 提交合并:
xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --copy-back --target-dir=/opt/data/mysql_data_bak/full_bak/ - 重启MySQL,最后结果如下图:
恢复全量备份+第一次增量+第二次增量
- 清空mysql存放data的目录:
rm -rf /opt/containerd/mysql/var/lib/mysql/data/* - 合并全量备份:
xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --prepare --apply-log-only --target-dir=/opt/data/mysql_data_bak/full_bak/ - 合并第一次增量备份到全量备份里:
xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --prepare --apply-log-only --target-dir=/opt/data/mysql_data_bak/full_bak/ --incremental-dir=/opt/data/mysql_data_bak/incre_bak1/ - 合并第二次增量备份到全量备份里:
xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --prepare --target-dir=/opt/data/mysql_data_bak/full_bak/ --incremental-dir=/opt/data/mysql_data_bak/incre_bak2/ - 提交合并:
xtrabackup --defaults-file=/opt/dev/my1.cnf --datadir=/opt/containerd/mysql/var/lib/mysql/data --copy-back --target-dir=/opt/data/mysql_data_bak/full_bak/ - 重启MySQL,最后结果如下图:
流式备份与恢复
- 流式备份:执行命令
xtrabackup --defaults-file=/opt/dev/my1.cnf --backup --datadir=/opt/containerd/mysql/var/lib/mysql/data --host=127.0.0.1 --user=root --password=96468223 --port=3306 --stream=xbstream --target-dir /opt/data/mysql_data_bak/full_bak/ >/opt/data/mysql_data_bak/full_bak/all_1.xbstream即可,此时会看到目录下有all_1.xbstream文件,如下图所示: - 流式恢复:
- 首先进行解压:切换到存放压缩文件的目录(本教程是切换到/opt/data/mysql_data_bak/full_bak),执行命令
xbstream -x < all_1.xbstream,此时可以看到该目录下有已经解压出来的文件了,如下图: - 恢复:
- 清空mysql存放data的目录:
rm -rf /opt/containerd/mysql/var/lib/mysql/data/* - 执行prepare:
xtrabackup --prepare --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/ - 执行copy-back:
xtrabackup --copy-back --datadir=/opt/containerd/mysql/var/lib/mysql/data --host=127.0.0.1 --user=root --password=123456 --port=3306 --target-dir=/opt/data/mysql_data_bak/full_bak/ - 重启MySQL。
- 清空mysql存放data的目录:
- 首先进行解压:切换到存放压缩文件的目录(本教程是切换到/opt/data/mysql_data_bak/full_bak),执行命令