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

相关推荐
Maỿbe1 小时前
MySQL索引失效的情况
mysql
eddy-原1 小时前
Docker与DevOps实战训练:从容器管理到全链路项目部署
docker·容器·devops
神秘的土鸡1 小时前
Linux中使用Docker构建Nginx容器完整教程
linux·nginx·docker
@游子2 小时前
第二章-MySQL之手工注入(二)
数据库·mysql
前进的李工2 小时前
SQL入门:从零掌握数据库查询语言
数据库·sql·mysql
6***94152 小时前
MySQL 字符串日期格式转换
android·数据库·mysql
p***q782 小时前
MySQL——用户管理
android·mysql·adb
g***86692 小时前
MySQL - Navicat自动备份MySQL数据
android·数据库·mysql
q***01772 小时前
【MySQL】数据类型
android·数据库·mysql