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

 更新时间:2026年02月11日 09:55:02   作者:小时候的阳光  
本文详细介绍了如何在Linux系统Docker环境中使用Docker版PerconaXtrabackup进行MySQL数据库的全量备份、全量压缩备份和增量备份,并提供了详细的命令操作步骤

记录一下常用的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

 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目的是使备份可用于恢复

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 查询如下备份信息:

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
 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
docker stop  mysqlrecover8
  • 【步骤3】 清空 mysqlrecover8 数据目录
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
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
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
docker start  mysqlrecover8

然后客户端连接测试一下,到此全量备份和恢复测试完毕!

二、全量压缩备份与恢复

这种方式同前面的操作,只不过暂时不要prepare。

【步骤1】 创建一个全量备份并且压缩

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】 解压缩全量备份 + 清理压缩的文件

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,使备份可用于恢复

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】 创建一个全量备份
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】 创建第一个增量备份
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】 创建第二个增量备份
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】 创建第三个增量备份
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全量备份
 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
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
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
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 使用全量备份恢复操作 章节

参考官方文档:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot使用docker-compose实现动态配置过程

    Springboot使用docker-compose实现动态配置过程

    这篇文章主要介绍了Springboot使用docker-compose实现动态配置全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 使用docker部署hadoop集群的详细教程

    使用docker部署hadoop集群的详细教程

    这篇文章主要介绍了使用docker部署hadoop集群的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值需要的朋友可以参考下
    2020-09-09
  • Dockerfile文件详解

    Dockerfile文件详解

    Dockerfile是一个用来构建镜像的文本文件,文本内容包含一条条构建镜像所需的指令和说明。本文详细讲解了Dockerfile文件,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • docker删除镜像的实现方式详解

    docker删除镜像的实现方式详解

    这篇文章主要为大家介绍了docker删除镜像的实现方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Docker部署nGrinder性能测试平台过程解析

    Docker部署nGrinder性能测试平台过程解析

    这篇文章主要介绍了Docker部署nGrinder性能测试平台过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • docker容器如何查看运行日志

    docker容器如何查看运行日志

    这篇文章主要介绍了docker容器如何查看运行日志问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 解决docker磁盘空间不足问题

    解决docker磁盘空间不足问题

    这篇文章主要介绍了解决docker磁盘空间不足问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • docker-compose安装及执行命令

    docker-compose安装及执行命令

    Docker Compose是一个用来定义和运行复杂应用的Docker工具,这篇文章主要介绍了docker-compose安装方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • docker灵活的构建PHP环境的实现

    docker灵活的构建PHP环境的实现

    这篇文章主要介绍了docker灵活的构建PHP环境的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • docker mysql修改root账号密码并赋予权限

    docker mysql修改root账号密码并赋予权限

    本文主要介绍了docker mysql修改root账号密码并赋予权限,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07

最新评论