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 版本 20.10.6
  • docker-compose 版本1.28.5

2.2 Mysql及XtraBackup配置

目录结构如下:

在这里插入图片描述

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: mysqlimage: mysql:8.0.32user: 999:999environment:- MYSQL_ROOT_PASSWORD=1qaz@WSXvolumes:- data_volume:/var/lib/mysql- backup_volume:/backup- /root/apps/mysql/my.cnf:/etc/my.cnf:ro- /etc/timezone:/etc/timezone:rologging: *default-loggingports:- "3306:3306"xtrabackup-command:container_name: xtrabackup-command-lineimage: percona/percona-xtrabackup:8.0.32user: 999:999restart: alwaysdepends_on:- mysqlvolumes_from:- mysqlcommand: tail -f /dev/null
volumes:data_volume:driver: localbackup_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`;

在这里插入图片描述

三、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

在这里插入图片描述

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

在这里插入图片描述

3.2.3 查看完整备份

ls -lh /backup/full

注意事项:

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

在这里插入图片描述

3.2.4 模拟原数据库损坏

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

在这里插入图片描述

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`;

在这里插入图片描述
至此完整备份及恢复介绍完毕。

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

在这里插入图片描述

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

在这里插入图片描述

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目录中。

在这里插入图片描述

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

在这里插入图片描述

3.3.7 模拟原数据库损坏

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

3.2.8 完整备份还原

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

在这里插入图片描述

3.2.7 启动数据库及验证

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

在这里插入图片描述
至此增量备份及恢复介绍完毕。

3.3 其他

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/56402.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fetch-github-hosts间隔一年大更新v2.6发布,多端支持

前言 fetch-github-hosts是一款同步 github hosts 的工具&#xff0c;用于帮助您解决github时而无法访问的问题。在间隔了一年之久的时间&#xff0c;最近抽空将fetch-github-hosts的依赖及UI进行了一波大更新&#xff0c;同时也增加了一些实用的功能。 主要更新 更新了基础依…

Linux 中利用设备树学习Ⅳ

系列文章目录 第一章 Linux 中内核与驱动程序 第二章 Linux 设备驱动编写 &#xff08;misc&#xff09; 第三章 Linux 设备驱动编写及设备节点自动生成 &#xff08;cdev&#xff09; 第四章 Linux 平台总线platform与设备树 第五章 Linux 设备树中pinctrl与gpio&#xff08;…

【传统视觉】C#创建、封装、调用类库

任务 因为实现代码相对简单&#xff0c;然后又没有使用Opencv&#xff0c;所以就直接用C#实现&#xff0c;C#调用。 1.创建类库 1.1新建一个类库 vs2015 > 文件 > 新建 > 项目 using System; using System.Collections.Generic; using System.Linq;namespace Yo…

【go-zero】docker镜像直接部署API与RPC服务 如何实现注册发现?docker network 实现 go-zero 注册发现

一、场景&问题 使用docker直接部署go-zero微服务会发现API无法找到RPC服务 1、API无法发现RPC服务 用docker直接部署 我们会发现API无法注册发现RPC服务 原因是我们缺少了docker的network网桥 2、系统内查看 RPC服务运行正常API服务启动,通过docker logs 查看日志还是未…

python#django数据库一对一/一对多/多对多

一对一OneToOneField 用户和用户信息 搭建 # 一对一 class TestUser(models.Model): usernamemodels.CharField(max_length32) password models.CharField(max_length32) class TestInfo(models.Model): mick_namemodels.CharField(max_length32) usermode…

Session与Cookie的区别(五)

储存状态的方式 小明的故事说完了&#xff0c;该来把上面这一段变成网络的实际案例了。其实在网络世界中问题也是一样的。 前面已经提到过我们会把状态存在 Cookie 里面&#xff0c;让 Request 之间能够变得有关联。 假设我们今天要来做一个会员系统&#xff0c;那我要怎么知道…

云道资本:2023中国氢能源产业-氢制备深度研究报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 中国可再生能源消纳能力提升远远滞后于发电占比的提升。大规模的可再生能源发电是实现碳中和的关键一步&#xff0c;但风电、光伏发电间歌性、波动性强&#xff0c;电网消纳压力较大&#xff0c;且电…

【C++】哈希闭散列

一.哈希的概念 在前面学习了二叉搜索树、AVL树、红黑树之后&#xff0c;我们得知顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须经过关键码的多次比较。顺序查找的时间复杂度为 O(N)&#xff0c…

【MapGIS精品教程】010:空间叠置分析案例教程

文章目录 一、叠置分析介绍(一) 什么是叠加分析(二)叠加分析的分类二、叠加分析操作一、叠置分析介绍 (一) 什么是叠加分析 叠加分析是依靠把分散在不同层上的空间属性信息按相同的空间位置加到一起,合为新的一层。该层的属性由被叠加层各自的属性组合而成,这种组合可…

Pytest测试框架3

目录&#xff1a; pytest结合数据驱动-yamlpytest结合数据驱动-excelpytest结合数据驱动-csvpytest结合数据驱动-jsonpytest测试用例生命周期管理&#xff08;一&#xff09;pytest测试用例生命周期管理&#xff08;二&#xff09;pytest测试用例生命周期管理&#xff08;三&a…

【java安全】原生反序列化利用链JDK7u21

文章目录 【java安全】原生反序列化利用链JDK7u21前言原理equalsImpl()如何调用equalsImpl()&#xff1f;HashSet通过反序列化间接执行equals()方法如何使hash相等&#xff1f; 思路整理POCGadget为什么在HashSet#add()前要将HashMap的value设为其他值&#xff1f; 【java安全】…

轮足机器人硬件总结

简介 本文主要根据“轮腿机器人Hyun”总结的硬件部分。 轮腿机器人Hyun开源地址&#xff1a;https://github.com/HuGuoXuang/Hyun 1 电源部分 1.1 78M05 78M05是一款三端稳压器芯片&#xff0c;它可以将输入电压稳定输出为5V直流电压. 1.2 AMS1117-3.3 AMS1117-3.3是一种输…