记录一下常用的Docker版Percona Xtrabackup备份恢复命令
目录
- 场景说明
- 先决条件
- 一、全量备份与恢复
-
- [1.1 创建一个全量备份并且立刻 prepare](#1.1 创建一个全量备份并且立刻 prepare)
- [1.2 使用全量备份恢复操作](#1.2 使用全量备份恢复操作)
- 二、全量压缩备份与恢复
- 三、增量备份与恢复
- 参考官方文档:
场景说明
- Linux系统
- Docker环境
- 要备份的目标数据库
MySQL 8.0.x(x的值一般 22 ~ 44) - 使用Percona Xtrabackup的docker镜像版本是
8.0.35-34.1,该版本可以最高至8.0.44 - 要备份的目标数据库和Percona Xtrabackup的容器
在同一个物理服务器上 - 为什么要使用docker版本的Xtrabackup ? 注意是考虑Linux版本不一样对应的Xtrabackup程序版本也不一样,为了操作运维一致性/便捷性因此选用Docker版本的Xtrabackup。
先决条件
需要在目标数据库(准备要被备份的数据库)创建用于备份数据读取的账号 xtrabackup
sql
CREATE USER 'xtrabackup'@'%' IDENTIFIED WITH mysql_native_password BY 'yourbackpassword';
GRANT SELECT, RELOAD, PROCESS, LOCK TABLES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `xtrabackup`@`%`;
GRANT BACKUP_ADMIN ON *.* TO `xtrabackup`@`%`;
FLUSH PRIVILEGES;
一、全量备份与恢复
只全量备份,适合业务量比较小的业务场景
1.1 创建一个全量备份并且立刻 prepare
prepare目的是使备份可用于恢复
shell
docker run --name pxb -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/full_backup \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword;
xtrabackup --prepare \
--target-dir=/backup/full_backup
"
要点说明:
- --volumes-from mysql8: 将名为 mysql8 的容器的所有卷挂载到当前容器中。这意味着 pxb 容器可以访问 mysql8 容器的数据目录
- -v /data/apps/xtrabackup/backup:/backup: 将宿主机(运行 Docker 的机器)上的 /data/apps/xtrabackup/backup 目录挂载到容器内的 /backup 目录。这是备份文件将存储的位置。
- --datadir=/var/lib/mysql/: 指定目标 MySQL 数据目录在容器内的路径。
- --target-dir=/backup/full_backup: 指定备份文件将存储在容器内的 /backup/full_backup 目录
- xtrabackup --prepare ...: 这是在备份完成后执行准备操作的命令
- --host post user password 是要被备份的目标数据库的信息
执行完成后在 /data/apps/xtrabackup/backup/full_backup 查询如下备份信息:
shell
drwxr-xr-x 7 root root 4096 12月 1 16:04 ./
drwxr-xr-x 7 root root 4096 12月 1 17:43 ../
drwxr-x--- 2 root root 12288 12月 1 16:04 'api@002drcms@002dfactory@002dprod'/
drwxr-x--- 2 root root 4096 12月 1 16:04 'api@002drcms@002dheadoffice@002dprod'/
-rw-r--r-- 1 root root 448 12月 1 16:04 backup-my.cnf
-rw-r--r-- 1 root root 7051 12月 1 16:04 ib_buffer_pool
-rw-r--r-- 1 root root 1073741824 12月 1 16:04 ibdata1
drwxr-x--- 2 root root 4096 12月 1 16:04 mysql/
-rw-r--r-- 1 root root 196 12月 1 16:04 mysql-bin.000782
-rw-r--r-- 1 root root 19 12月 1 16:04 mysql-bin.index
-rw-r--r-- 1 root root 33554432 12月 1 16:04 mysql.ibd
drwxr-x--- 2 root root 4096 12月 1 16:04 performance_schema/
drwxr-x--- 2 root root 4096 12月 1 16:04 sys/
-rw-r--r-- 1 root root 37748736 12月 1 16:04 undo_001
-rw-r--r-- 1 root root 117440512 12月 1 16:04 undo_002
-rw-r--r-- 1 root root 70 12月 1 16:04 xtrabackup_binlog_info
-rw-r----- 1 root root 146 12月 1 15:06 xtrabackup_checkpoints
-rw-r--r-- 1 root root 654 12月 1 16:04 xtrabackup_info
-rw-r--r-- 1 root root 128512 12月 1 16:04 xtrabackup_logfile
-rw-r--r-- 1 root root 39 12月 1 16:04 xtrabackup_tablespaces
1.2 使用全量备份恢复操作
假设之前你已经做完了上面的备份操作,现在开始恢复操作,就在原来的物理服务器上!
- 【步骤1】
创建一个新的mysql容器恢复到一个新创建的目录下,假设准备要做恢复容器的MySQL目录地址如下:
/data/apps/xtrabackup/mysqlrecover/conf/my.cnf
/data/apps/xtrabackup/mysqlrecover/files
/data/apps/xtrabackup/mysqlrecover/data
shell
docker run -u root \
--cap-add=SYS_NICE \
--network=host \
--restart=always \
--name mysqlrecover8 \
-v /data/apps/xtrabackup/mysqlrecover/conf/my.cnf:/etc/mysql/my.cnf \
-v /data/apps/xtrabackup/mysqlrecover/files:/var/lib/mysql-files \
-v /data/apps/xtrabackup/mysqlrecover/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=yourbackpassword \
-d mysql:8.0.22
记得将原来的my.cnf 复制到 /data/apps/xtrabackup/mysqlrecover/conf/my.cnf 记得端口修改 如果不修改端口则需要确认原来MySQL服务已经停止!,这里不建议在原来的目标数据库目录下操作,以便分析数据库损坏的原因。
- 【步骤2】 暂停 mysqlrecover8
shell
docker stop mysqlrecover8
- 【步骤3】 清空 mysqlrecover8 数据目录
shell
docker run \
--volumes-from mysqlrecover8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --rm \
--user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
rm -rf /var/lib/mysql/*
"
这里一定要使用上面的删除方式,确保容器内mysql数据目录是/var/lib/mysql/
- 【步骤4】 Restore backup
shell
docker run \
--volumes-from mysqlrecover8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --rm \
--user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --copy-back \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/full_backup
"
**要点说明:**切记不要使用copy命令复制备份文件,一定使用 xtrabackup --copy-back命令。
- 【步骤5】 Change the owner of the files in mysqlrecover8 from root to mysql
shell
docker run \
--volumes-from mysqlrecover8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --rm \
--user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
chown -R mysql:mysql /var/lib/mysql/
"
- 【步骤6】 重新启动 mysqlrecover8
shell
docker start mysqlrecover8
然后客户端连接测试一下,到此全量备份和恢复测试完毕!
二、全量压缩备份与恢复
这种方式同前面的操作,只不过暂时不要prepare。
【步骤1】 创建一个全量备份并且压缩
shell
docker run --name pxb -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup --compress --compress-threads=4 \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/full_backup \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword
"
【步骤2】 解压缩全量备份 + 清理压缩的文件
shell
docker run --name pxb -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --parallel=4 --remove-original --decompress \
--target-dir=/backup/full_backup
"
【步骤3】 prepare,使备份可用于恢复
shell
docker run --name pxb -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --prepare \
--target-dir=/backup/full_backup
"
【步骤4】恢复操作
参考上面 1.2 使用全量备份恢复操作 章节
三、增量备份与恢复
一次全量备份多次增量备份,可以1小时一次增量也可以一天一次备份,每隔7天重新进行全量备份。
假设用于存储全量和增量的文件目录如下:
/data/apps/xtrabackup/backup/full_backup
/data/apps/xtrabackup/backup/inc1
/data/apps/xtrabackup/backup/inc2
/data/apps/xtrabackup/backup/inc3
- 【步骤1】 创建一个全量备份
shell
docker run --name pxb1 -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/full_backup \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword
"
**要点说明:**切记不要附带 xtrabackup --prepare命令,因为后面要基于这个全量备份做增量备份!
- 【步骤2】 创建第一个增量备份
shell
docker run --name pxb2 -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/inc1 \
--incremental-basedir=/backup/full_backup \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword
"
注意查看 --target-dir 和 --incremental-basedir 参数!
- 【步骤2】 创建第二个增量备份
shell
docker run --name pxb2 -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/inc2 \
--incremental-basedir=/backup/inc1 \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword
"
注意查看 --target-dir 和 --incremental-basedir 参数!
- 【步骤3】 创建第三个增量备份
shell
docker run --name pxb3 -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/inc3 \
--incremental-basedir=/backup/inc2 \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword
"
注意查看 --target-dir 和 --incremental-basedir 参数!
- 【步骤4】 prepare全量备份
shell
docker run --name pxb4 -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --prepare --apply-log-only \
--target-dir=/backup/full_backup
"
注意查看 --target-dir 和 是否携带 --apply-log-only 参数!
- 【步骤5】 prepare 增量inc1
shell
docker run --name pxb5 -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --prepare --apply-log-only \
--target-dir=/backup/full_backup \
--incremental-basedir=/backup/inc1
"
注意查看 --target-dir 和 --incremental-basedir 和 是否携带 --apply-log-only 参数!
- 【步骤6】 prepare 增量inc2
shell
docker run --name pxb6 -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --prepare --apply-log-only \
--target-dir=/backup/full_backup \
--incremental-basedir=/backup/inc2
"
注意查看 --target-dir 和 --incremental-basedir 和 是否携带 --apply-log-only 参数!
- 【步骤7】 prepare 增量最后一个inc3
shell
docker run --name pxb7 -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --prepare \
--target-dir=/backup/full_backup \
--incremental-basedir=/backup/inc3
"
注意查看 --target-dir 和 --incremental-basedir 和 是否携带 --apply-log-only 参数!,最后一次不要--apply-log-only参数!
--apply-log-only 应该在合并增量备份时使用,除了最后一个增量备份。这就是为什么前一行(指合并最后一个增量备份之前的操作)不包含 --apply-log-only 选项。即使在最后一步使用了 --apply-log-only,备份仍然会保持一致性,但在那种情况下,服务器将执行回滚阶段。
简单来说:
(1)在合并除了最后一个增量备份时,你需要使用 --apply-log-only 选项。
(2)合并最后一个增量备份时,不要使用 --apply-log-only。
(3)如果你在合并最后一个增量备份时也使用了 --apply-log-only,备份仍然是有效的,但数据库在恢复时会执行一个额外的回滚操作。
- 【步骤8】恢复操作
参考上面1.2 使用全量备份恢复操作章节
参考官方文档:
https://docs.percona.com/percona-xtrabackup/8.0/quickstart-docker.html
https://docs.percona.com/percona-xtrabackup/8.0/create-full-backup.html