使用Docker版Percona Xtrabackup备份恢复MySQL8.0.x

记录一下常用的Docker版Percona Xtrabackup备份恢复命令

目录

场景说明

  • 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

相关推荐
小码农 - 初5 小时前
MySQL 增删改查
mysql
五阿哥永琪12 小时前
MySQL中操作json的函数!
数据库·mysql·json
来者皆善12 小时前
了解Mysql优化吗?如何优化索引?
数据库·mysql
Ai拆代码的曹操16 小时前
MySQL GROUP BY 性能优化:执行计划分析 + 索引重构实战
mysql·性能优化·重构
小小洋洋16 小时前
OpenWrt 从U盘迁移到内置 eMMC,并完成扩容与 Docker 安装
java·docker·eureka
Eloudy17 小时前
docker build 与 docker buildx build 的应用场景
docker·构建
瞬间&永恒~17 小时前
【Docker】(三)联合文件系统UnionFS + Overlay2
docker·云原生·容器
数据知道20 小时前
主机入侵检测(HIDS):OSSEC / Wazuh 部署与规则编写
安全·网络安全·docker
安_20 小时前
MySQL SQL 调优完整指南
数据库·sql·mysql
逐光老顽童21 小时前
第 5 章:搞懂 K8s Service:从 ClusterIP 到负载均衡
docker·云原生·容器