使用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

相关推荐
江湖有缘1 分钟前
Fenrus + Docker 实战:构建简洁高效的浏览器新标签页
运维·docker·容器
Full Stack Developme13 分钟前
Mycat 2 实现 MySQL 读写分离,并且实现 主从同步
android·数据库·mysql
alonewolf_9930 分钟前
MySQL Explain详解与索引优化实战
数据库·mysql·adb
それども35 分钟前
MySQL 查询索引最左前缀原则,如果是(a,b)的联合索引,WHERE b = ? AND a = ?会走索引吗
数据库·mysql
それども35 分钟前
MySQL EXPLAIN Impossible WHERE noticed after reading const tables
数据库·mysql
唯情于酒11 小时前
Docker学习
学习·docker·容器
喵叔哟11 小时前
20.部署与运维
运维·docker·容器·.net
萧曵 丶13 小时前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
德育处主任14 小时前
『NAS』在群晖部署一个文件加密工具-hat.sh
前端·算法·docker