Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62

一、XtraBackup 简介

Percona XtraBackup是一个开源的MySQLMariaDB数据库备份工具,它能够创建高性能、一致性的备份,并且对生产环境的影响很小。Percona XtraBackup通过在不停止MySQL服务器的情况下,复制InnoDB存储引擎的数据文件和事务日志,来实现备份和还原操作。

Percona XtraBackup的主要特点如下:

  • 高性能备份:Percona XtraBackup能够以并行方式备份数据库,提供快速备份速度,并且对生产系统影响较小。

  • 一致性备份:Percona XtraBackup使用InnoDB特定的算法来确保备份的一致性,即备份的数据文件和事务日志是同一时刻的状态。

  • 增量备份:Percona XtraBackup支持增量备份,可以根据之前的全量备份来创建增量备份,减少备份时间和存储空间的消耗。

  • 支持压缩和加密:Percona XtraBackup可以在备份过程中使用压缩算法来减小备份文件的大小,还可以对备份文件进行加密,提高数据的安全性。

  • 灵活的备份恢复:Percona XtraBackup支持将备份文件复制回数据库目录进行恢复,也支持以流的方式输出备份数据进行恢复。

  • 兼容性:Percona XtraBackup兼容MySQLMariaDB,可以在不同版本的数据库上使用。

总之,Percona XtraBackup是一个强大而灵活的数据库备份工具,它可以帮助数据库管理员轻松地创建可靠的备份,并在需要时进行高效的还原操作。无论是用于生产环境的数据保护,还是用于开发和测试环境的数据复制,Percona XtraBackup都是一个可靠的选择。

官网地址:https://docs.percona.com/percona-xtrabackup/8.0/

二、环境及部署

2.1 运行环境介绍

本章节所有演示操作均在Docker环境下。

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第1张图片

  • docker 版本 20.10.6
  • docker-compose 版本1.28.5

2.2 Mysql及XtraBackup配置

目录结构如下:

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第2张图片

Mysql配置文件my.cnf

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
default-time_zone='+8:00'
log-bin
log_bin_trust_function_creators=1
lower_case_table_names=1
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
innodb_undo_tablespaces=2
innodb_read_only=off
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

# !includedir /etc/mysql/conf.d/

docker-compose.yml

version: "3.8"
# 通用日志设置
x-logging:
    &default-logging
    # 日志大小和数量
    options:
        max-size: "100m"
        max-file: "3"
    # 文件存储类型
    driver: json-file
services:
  mysql:
    container_name: mysql
    image: mysql:8.0.32
    user: 999:999
    environment:
      - MYSQL_ROOT_PASSWORD=1qaz@WSX
    volumes:
      - data_volume:/var/lib/mysql
      - backup_volume:/backup
      - /root/apps/mysql/my.cnf:/etc/my.cnf:ro
      - /etc/timezone:/etc/timezone:ro
    logging: *default-logging
    ports:
      - "3306:3306"
  xtrabackup-command:
    container_name: xtrabackup-command-line
    image: percona/percona-xtrabackup:8.0.32
    user: 999:999
    restart: always
    depends_on:
      - mysql
    volumes_from:
      - mysql
    command: tail -f /dev/null
volumes:
  data_volume:
    driver: local
  backup_volume:
    driver: local

注意事项一:

  • xtrabackup:请XtraBackup版本和Mysql版本保持一致。
  • volumes_from:表示和docker mysql容器使用相同的容器卷信息
  • user:表示容器运行使用指定的用户,mysqlUIDGID999:999xtrabackup用户与mysql相同出现避免文件权限问题。
  • command: tail -f /dev/null:通过此命令将容器xtrabackup-command-line进行服务常驻,方便后续使用过程演示。

注意事项二:

  • data_volume:使用本地数据卷绑定,默认位置:/var/lib/docker/volumes/mysql_data_volume/_data,因上文中提到容器运行使用指定的用户,需更改此目录权限,容器外部执行:chmod 777 -R /var/lib/docker/volumes/mysql_data_volume/_data
  • backup_volume:使用本地数据卷绑定,默认位置:/var/lib/docker/volumes/mysql_backup_volume/_data,因上文中提到容器运行使用指定的用户,需更改此目录权限,容器外部执行:chmod 777 -R /var/lib/docker/volumes/mysql_backup_volume/_data

2.3 启动服务

cd /root/apps/mysql
docker-compose up -d

在这里插入图片描述

2.4 准备测试数据

create DATABASE t1;
use t1;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `gender` int NULL DEFAULT 0,
  `birthday` varchar(10) DEFAULT NULL,
  `address` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1;
INSERT INTO `user` ( id, name, gender, birthday, address ) VALUES( 1, '张三', 1, '2023-08-06', '黑龙江');
select * from `user`;

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第3张图片

三、XtraBackup使用详解

3.1 常用参数介绍

Percona XtraBackup中一些常用参数的说明及其默认值:

  • --backup:执行备份操作,默认为启用。

  • --target-dir=<目录路径>:指定备份文件存储的目录路径。

  • --incremental-basedir=<目录路径>:指定增量备份的基准目录路径,表示该增量备份是基于哪个全量备份进行的。

  • --prepare:对备份文件执行准备操作,默认为禁用。

  • --copy-back:将备份文件复制回数据库目录,用于还原操作,默认为禁用。

  • --apply-log:在备份文件上应用事务日志,用于还原操作,默认为禁用。

  • --datadir=<目录路径>:指定数据库的数据目录路径,默认为MySQL配置文件中指定的数据目录。

  • --defaults-file=<文件路径>:指定用于备份和还原的配置文件路径,默认为MySQL的默认配置文件路径。

  • --user=<用户名>:指定连接数据库时使用的用户名,默认为当前系统用户。

  • --password=<密码>:指定连接数据库时使用的密码,默认为空。

  • --host=<主机名>:指定连接数据库时使用的主机名,默认为localhost。

  • --port=<端口号>:指定连接数据库时使用的端口号,默认为3306。

  • --compress:在备份过程中使用压缩算法以减小备份文件的大小,默认为禁用。

  • --compress-threads=<线程数>:指定用于压缩备份文件的线程数,默认为1。

  • --encrypt:在备份过程中对备份文件进行加密,默认为禁用。

  • --encrypt-key=<密钥>:指定用于备份文件加密的密钥。

  • --stream=<流类型>:将备份数据以流的方式输出到标准输出、文件或网络套接字,默认为禁用。

3.2 完整备份及恢复

3.2.1 进入容器

docker exec -it xtrabackup-command-line /bin/bash

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第4张图片

3.2.2 创建完整备份

xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/backup/full --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check

注意事项:

  • 目标目录不存在,XtraBackup 会创建它。
  • 目录存在且为空,XtraBackup 将成功。
  • 目录存在且为不为空,XtraBackup不会覆盖现有文件,它会在运行时失败,显示系统错误17file exists

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第5张图片

3.2.3 查看完整备份

ls -lh /backup/full

注意事项:

  • 备份可能需要很长时间,具体取决于数据库的大小。随时取消是安全的,因为XtraBackup不会修改数据库。

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第6张图片

3.2.4 模拟原数据库损坏

  • 关闭容器
docker stop mysql
  • 删除数据库文件
cd /var/lib/docker/volumes/mysql_data_volume/_data
rm -rf *

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第7张图片

3.2.5 准备完整备份

创建备份后,您需要对其进行准备以进行还原。在准备好数据文件之前,数据文件在时间点上是不一致的,因为它们是在程序运行的不同时间复制的,并且在执行此操作时可能已被更改。

如果你试图用这些数据文件启动InnoDB,它会检测到损坏并停止工作,以避免在损坏的数据上运行。该步骤使文件在单个时刻完全一致,因此您可以在它们上运行InnoDB

您可以在任何机器上运行准备操作;它不需要位于原始服务器或要恢复到的服务器上。您可以将备份复制到实用工具服务器并在那里进行准备。

请注意,Percona XtraBackup 8.0只能准备MySQL 8.0Percona Server for MySQL 8.0Percona XtraDB Cluster 8.0数据库的备份。不支持8.0之前的版本。

在准备操作期间,xtrabackup启动了一种经过修改的嵌入式InnoDBextrabackup链接的库)。这些修改对于禁用InnoDB标准安全检查是必要的,例如:日志文件大小不合适。此警告不适用于处理备份。这些修改仅适用于extrabackup二进制文件;您不需要修改后的InnoDB即可使用xtrabackup进行备份。

准备步骤使用这个“嵌入式InnoDB”,使用复制的日志文件对复制的数据文件执行崩溃恢复。该步骤使用起来非常简单:您只需使用选项运行xtrabackup,并告诉它要准备哪个目录。具体操作如下:

xtrabackup --prepare --target-dir=/backup/full

注意事项:

  • 不建议在准备备份时中断XtraBackup过程,因为这可能会导致数据文件损坏并且备份将变得不可用。如果准备过程中断,则不保证备份有效性。
  • 如果希望备份作为进一步增量备份的基础,则应在准备备份时使用--apply-log-only选项,否则将无法对其应用增量备份。有关更多详细下文介绍。

完成此操作后,您应该会看到如下所示的消息,其中 LSN 的值将再次取决于您的系统:InnoDB shutdown
在这里插入图片描述

3.2.6 完整备份还原

为方便起见,xtrabackup 二进制文件可以选择将备份复制到服务器的 datadir

xtrabackup --copy-back --target-dir=/backup/full

注意事项:

  • 在还原备份之前,数据目录必须为空。此外,请务必注意,在执行还原之前需要关闭MySQL服务。您无法还原到正在运行的 mysqld 实例的数据目录(导入部分备份时除外)。
  • 应该检查还原的文件是否具有正确的所有权和权限,需要时可执行:chown -R mysql:mysql /var/lib/mysql进行所有权更改。

在这里插入图片描述

3.2.7 启动数据库及验证

docker restart mysql
use t1;
select * from `user`;

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第8张图片
至此完整备份及恢复介绍完毕。

3.3 增量备份及恢复

3.3.1 创建完整备份

注意事项:

  • 需先清空/var/lib/docker/volumes/mysql_backup_volume/_data/full目录

详见上文3.2.13.2.23.2.3章节,操作步骤及命令一致

3.3.2 添加增量数据1️⃣

use t1;
INSERT INTO `user` ( id, name, gender, birthday, address ) VALUES(4, '七七', 1, '2023-08-06', '海南');
select * from `user`;

3.3.3 创建增量备份1️⃣

xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第9张图片

3.3.4 添加增量数据2️⃣

use t1;
INSERT INTO `user` ( id, name, gender, birthday, address ) VALUES(5, '八八', 1, '2023-08-06', '合肥');
select * from `user`;

3.3.5 创建增量备份2️⃣

xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1 --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第10张图片

3.3.6 准备备份

增量备份的步骤与完整备份的步骤不同。在完全备份中,执行两种类型的操作以使数据库保持一致:已提交的事务从日志文件相对于数据文件重播,未提交的事务回滚。

在准备增量备份时,您必须跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行中,而且很可能会在下一次增量备份中提交。您应该使用--prepare --apply-log-only选项来阻止回滚阶段。

3.3.6.1 准备完整备份

xtrabackup --prepare --apply-log-only --target-dir=/backup/full --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check

注意事项:
--prepare--apply-log-only:通过配置来阻止回滚阶段。

在这里插入图片描述

3.3.6.2 准备增量备份1️⃣

将第一个增量备份应用于完整备份,请运行以下命令:

xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1 --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check

注意事项:

  • 此备份实际上可以安全地按原样还原,即使已跳过回滚阶段也是如此。如果您还原它并启动MySQLInnoDB将检测到未执行回滚阶段,并且它将在后台执行此操作,就像通常在启动时进行崩溃恢复一样。它将通知您数据库未正常关闭。
  • 最终数据在/backup/full目录中。

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第11张图片

3.3.6.3准备增量备份2️⃣

准备第二个增量备份的过程与第一个类似:

xtrabackup --prepare --target-dir=/backup/full --incremental-dir=/backup/inc2 --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check

注意事项:
---apply-log-only:在合并增量备份(最后一个备份除外)时应使用。这就是上一行不包含该选项的原因。即使在最后一步中使用了 ,备份仍将保持一致,但在这种情况下,服务器将执行回滚阶段。

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第12张图片

3.3.7 模拟原数据库损坏

详见上文3.2.4章节,操作步骤及命令一致

3.2.8 完整备份还原

xtrabackup --copy-back --target-dir=/backup/full

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第13张图片

3.2.7 启动数据库及验证

docker restart mysql
use t1;
select * from `user`;

Docker环境下MySQL备份恢复工具XtraBackup使用详解 | Spring Cloud 62_第14张图片
至此增量备份及恢复介绍完毕。

3.3 其他

关于XtraBackup压缩备份及部分备份稍后整理介绍。

参考:https://blog.51cto.com/u_11750496/6753459

你可能感兴趣的:(docker,mysql,XtraBackup)