当前位置: 首页 > news >正文

项目需求 | MySQL增量备份与恢复的完整操作指南

目录

一、MySql数据库增量备份的工作原理

1、全量备份与增量备份

2、增量备份原理

二、进行增量备份

步骤1:启用二进制日志

使用 SHOW VARIABLES 命令查看二进制日志状态

步骤2:执行增量备份脚本

三、使用增量备份恢复损坏的数据库

步骤1:恢复全量备份

步骤2:执行增量恢复脚本恢复全量备份


一、MySql数据库增量备份的工作原理

1、全量备份与增量备份

在数据库管理中,备份是确保数据安全的关键步骤。数据库发生故障、数据丢失或误操作时,备份是恢复数据的唯一途径。全量备份保存整个数据库的完整副本,但随着数据量增加,备份时间和存储需求也会显著增加。相比之下,增量备份可以有效优化这一过程。增量备份仅保存自上次备份以来的变更数据,极大减少了备份时间和存储空间。特别是在数据更新频繁的业务环境中,增量备份是一种高效且经济的选择,能够快速恢复到最新的数据库状态,确保数据安全与业务连续性。

2、增量备份原理

MySql的增量备份实际上是在完成一次完整的全量备份之后,后续只备份自上次备份以来对数据库所做的变更,例如新增(INSERT)、修改(UPDATE)和删除(DELETE)操作。增量备份呢依赖于 二进制日志(Binary Logs),这些日志记录了所有对数据库的更改(如 INSERTUPDATEDELETE 操作)。在恢复数据库时,先恢复数据库的全备份,恢复到某个时间点的完整数据状态。再从前往后执行备份的增量备份日志,将数据库恢复到最新状态。

  1. 全备份
    • 全备份 是备份整个数据库的完整副本,通常在备份操作的起点进行。它包含所有表结构、数据等。
    • 全备份创建之后,后续的备份可以依赖增量备份来减少备份的数据量和时间。
  2. 二进制日志(Binary Logs)
    • MySql 的二进制日志是一个关键组件,它记录了所有对数据库造成更改的 SQL 语句,包括 INSERTUPDATEDELETE 等操作。通过保存这些二进制日志,可以实现增量备份。
    • 二进制日志不记录 SELECT 操作,因为它们不会更改数据。
  3. 增量备份
    • 增量备份不再保存整个数据库,而是通过读取并保存自上次备份以来的二进制日志文件,记录这些日志所涉及的更改。
    • 增量备份通常以二进制日志文件的方式存在(如 MySql-bin.000001),也可以通过 MySqlbinlog 工具导出为 SQL 格式,以便日后恢复。
  4. 恢复过程
    • 恢复数据库时,首先应用全备份,恢复到某个时间点的完整数据状态。
    • 然后,依次应用每个增量备份(即二进制日志文件),将数据库恢复到最新状态。

二、进行增量备份

步骤1:启用二进制日志

首先,确保 MySql 配置文件中启用了二进制日志功能。编辑 MySql 配置文件(my.cnfmy.ini)并添加以下行:

[MySqld]
log-bin=/var/log/MySql/MySql-bin

启用后,重新启动 MySql 服务:

sudo systemctl restart MySql
使用 SHOW VARIABLES 命令查看二进制日志状态

如果输出结果是 ON,说明二进制日志已开启;如果是 OFF,则表示二进制日志未启用。

步骤2:执行增量备份脚本

创建一个的bash脚本文件backup_MySql.sh,将下面的代码段进行如下四步修改后拷贝进去。

  • MySql_USERMySql_PASSWORD 替换为你的 MySql 用户名和密码。
  • MySql_HOST 设置为 MySql 服务器的地址,通常是 localhost
  • BINLOG_DIR 设置为本机MySql数据库的二进制日志存放目录。
  • 将倒数第二行的sleep后方的数字(文中是sleep 10)修改为你希望的增量备份的时间间隔。
#!/bin/bash# MySql 配置
MySql_USER="root"
MySql_PASSWORD="xxxxxx."
MySql_HOST="localhost"
BACKUP_DIR="./backup"
LOG_FILE="$BACKUP_DIR/backup.log"
BINLOG_DIR="/www/server/data"  # 二进制日志目录
FULL_BACKUP_DIR="$BACKUP_DIR/full"
INCREMENTAL_BACKUP_DIR="$BACKUP_DIR/incremental"
LAST_BACKUP_FILE="$BACKUP_DIR/last_backup_pos.txt"# 检查备份目录是否存在,不存在则创建
mkdir -p "$FULL_BACKUP_DIR" "$INCREMENTAL_BACKUP_DIR"# 完全备份函数
full_backup() {TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")FULL_BACKUP_PATH="$FULL_BACKUP_DIR/full_backup_$TIMESTAMP.sql"echo "Starting full backup at $TIMESTAMP" >> "$LOG_FILE"MySqldump -u "$MySql_USER" -p"$MySql_PASSWORD" -h "$MySql_HOST" --all-databases > "$FULL_BACKUP_PATH"# 记录二进制日志位置MySql -u "$MySql_USER" -p"$MySql_PASSWORD" -h "$MySql_HOST" -e "SHOW MASTER STATUS;" | awk 'NR==2 {print $1, $2}' > "$LAST_BACKUP_FILE"echo "Full backup completed at $TIMESTAMP" >> "$LOG_FILE"
}# 增量备份函数
incremental_backup() {TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")INCREMENTAL_BACKUP_PATH="$INCREMENTAL_BACKUP_DIR/incremental_backup_$TIMESTAMP.sql"echo "Starting incremental backup at $TIMESTAMP" >> "$LOG_FILE"# 读取上次备份的二进制日志位置if [ -f "$LAST_BACKUP_FILE" ]; thenBINLOG_FILE=$(awk '{print $1}' "$LAST_BACKUP_FILE")BINLOG_POS=$(awk '{print $2}' "$LAST_BACKUP_FILE")# 进行增量备份MySqlbinlog --start-position="$BINLOG_POS" "$BINLOG_DIR/$BINLOG_FILE" > "$INCREMENTAL_BACKUP_PATH"# 记录当前的二进制日志位置MySql -u "$MySql_USER" -p"$MySql_PASSWORD" -h "$MySql_HOST" -e "SHOW MASTER STATUS;" | awk 'NR==2 {print $1, $2}' > "$LAST_BACKUP_FILE"echo "Incremental backup completed at $TIMESTAMP" >> "$LOG_FILE"elseecho "No previous backup found, running full backup instead." >> "$LOG_FILE"full_backupfi
}# 每隔3600秒运行增量备份
while true; do# 判断是否是第一次运行(没有完全备份),如果是则先做完全备份if [ ! -f "$LAST_BACKUP_FILE" ]; thenfull_backupelseincremental_backupfi# 休眠10秒sleep 10
done

运行脚本
给脚本添加执行权限并运行:

chmod +x backup_MySql.sh
./backup_MySql.sh

确认备份文件目录:确保增量备份的 SQL 文件存放在 INCREMENTAL_BACKUP_DIR(例如 /backup/MySql/incremental/)目录下,文件名格式为 incremental_backup_*.sql,并按时间顺序命名。

  • 脚本会从指定的备份目录中读取所有按时间命名的增量 SQL 文件,并将它们按顺序恢复到指定的 MySql 数据库中。
  • 如果恢复过程中遇到错误,脚本会停止并提示出错的文件。

三、使用增量备份恢复损坏的数据库

向数据库中生成一些数据,执行增量备份。

删除生成的数据,模拟数据库损毁的情况。

步骤1:恢复全量备份

MySql -uroot -p. < ./full_backup_2024-09-12_16-01-04.sql

以下参数需要进行替换或注意:

  • -uroot:将root用户替换为你想使用的你的 MySql 用户名。
  • -p:提示输入密码(恢复时需要输入 MySql 密码)。
  • ./full_backup_2024-09-12_16-01-04.sql:将此文件替换为脚本执行时产生的全量备份文件。

步骤2:执行增量恢复脚本恢复全量备份

在增量备份脚本相同目录下创建restore_incremental.sh文件,将下面的代码段进行如下四步修改后拷贝进去。

  • MySql_USERMySql_PASSWORD 替换为你的 MySql 用户名和密码
  • MySql_HOST 设置为 MySql 服务器的地址,通常是 localhost
  • BINLOG_DIR 设置为本机MySql数据库的二进制日志存放目录。
#!/bin/bash# MySql 登录信息
MySql_USER="root"
MySql_PASSWORD="xxxxxx."
MySql_HOST="localhost"# 增量备份目录
INCREMENTAL_BACKUP_DIR="./backup/incremental"# 检查是否有备份文件
if [ ! -d "$INCREMENTAL_BACKUP_DIR" ]; thenecho "增量备份目录不存在: $INCREMENTAL_BACKUP_DIR"exit 1
fi# 获取所有增量备份文件(按时间顺序)
sql_files=$(ls $INCREMENTAL_BACKUP_DIR/incremental_backup_*.sql | sort)# 恢复每一个增量备份文件
for sql_file in $sql_files; doecho "正在恢复增量备份: $sql_file"MySql -u $MySql_USER -p$MySql_PASSWORD -h $MySql_HOST < $sql_fileif [ $? -ne 0 ]; thenecho "恢复 $sql_file 时出错"exit 1fi
doneecho "所有增量备份已成功恢复。"

运行脚本
给脚本添加执行权限并运行:

chmod +x backup_MySql.sh
./backup_MySql.sh

刷新后数据全部恢复成功。

相关文章:

项目需求 | MySQL增量备份与恢复的完整操作指南

目录 一、MySql数据库增量备份的工作原理 1、全量备份与增量备份 2、增量备份原理 二、进行增量备份 步骤1&#xff1a;启用二进制日志 使用 SHOW VARIABLES 命令查看二进制日志状态 步骤2&#xff1a;执行增量备份脚本 三、使用增量备份恢复损坏的数据库 步骤1&#…...

判断当前环境是否为docker容器下

判断当前环境是否为docker容器下 webshell后或登录到系统后台&#xff0c;判断是否为docker容器可使用如下方法&#xff1a; 方式一&#xff1a;使用ls -alh命令查看是否存在.dockerenv来判断是否在docker容器环境内 ls -alh /.dockerenv如下图无.dockerenv文件&#xff0c;所…...

深入理解FastAPI中的root_path:提升API部署灵活性的关键配置

在Web开发领域&#xff0c;FastAPI因其高性能、易于使用和类型提示功能而备受开发者喜爱。然而&#xff0c;当涉及到在生产环境中部署FastAPI应用程序时&#xff0c;我们常常需要面对一些挑战&#xff0c;比如如何正确处理代理服务器添加的路径前缀。这时&#xff0c;root_path…...

QLORA:高效微调量化大型语言模型

人工智能咨询培训老师叶梓 转载标明出处 传统的16位精度微调需要超过780GB的GPU内存&#xff0c;对于参数量极大的模型&#xff0c;如65B&#xff08;即650亿参数&#xff09;的模型&#xff0c;在资源有限的情况下大模型的微调几乎是不可能的。华盛顿大学的研究者团队提出了一…...

CesiumJS+SuperMap3D.js混用实现可视域分析 S3M图层加载 裁剪区域绘制

版本简介&#xff1a; cesium&#xff1a;1.99&#xff1b;Supermap3D&#xff1a;SuperMap iClient JavaScript 11i(2023)&#xff1b; 官方下载文档链家&#xff1a;SuperMap技术资源中心|为您提供全面的在线技术服务 示例参考&#xff1a;support.supermap.com.cn:8090/w…...

Fish-Speech 部署安装指南

Fish Speech 是由 Fish Audio 团队开发的一款开源文本转语音&#xff08;TTS&#xff09;模型&#xff0c;它在多语言支持和性能方面取得了显著的突破。根据证据显示&#xff0c;Fish Speech 最新版本为 1.4 版本&#xff0c;该版本不仅提升了对多种语言的支持&#xff0c;还大…...

Excel 国产化替换新方案

前言 在当前数字化转型和信创&#xff08;信息技术应用创新&#xff09;战略背景下&#xff0c;企业对于安全性、自主可控性和高效办公工具的需求日益增加。作为一款国产自主研发的高性能表格控件&#xff0c;SpreadJS 正成为替换 Excel 的最佳选择。它不仅全面支持国产化认证…...

在职研生活学习--20240908

文章目录 九月八日清晨&#xff0c;我们在鸟鸣声中醒来&#xff0c;精神饱满地迎接大汇演的挑战。上午&#xff0c;我们被分成舞龙队、旗手队、拳队、鼓队四个特色团队进行练习。阳光下&#xff0c;我们挥汗如雨&#xff0c;却乐此不疲。鼓声隆隆&#xff0c;龙舞飞扬&#xff…...

chattr:修改文件的特殊属性

​chattr ​命令用于改变文件的特殊属性&#xff0c;也称为"chattr 属性"。这些属性可以提供额外的安全性和控制&#xff0c;如设置文件为不可修改、只允许在文件末尾添加数据等。 ‍ 一、Linux 文件属性 文件属性是指与文件相关联的元数据&#xff0c;这些属性决…...

vue-router 在新的标签页打开链接/路由

前言 vue-router 在新的标签页打开链接/路由&#xff0c;由于官方没有提供对链接target属性的配置&#xff0c;要实现这个需求&#xff0c;需要自行实现&#xff0c;这里提供几个方案供参考。 调用 API vue-router 的路由实例除了常见的 push, replace, go 等接口&#xff0…...

Ansys HFSS的边界条件与激励端口

本文将介绍HFSS边界条件、激励端口,然后重点介绍连接器信号完整性仿真应用最多的波端口(wave port)及其尺寸设置要点。 HFSS (电磁仿真)边界条件 HFSS中所谓的边界并非真正意义上的边界,边界条件是指定问题区域和对象边缘的场行为接口。在HFSS的背景下,边界的存在主要有两个…...

C++:线程库

C&#xff1a;线程库 threadthreadthis_threadchrono 引用拷贝问题 mutexmutextimed_mutexrecursive_mutexlock_guardunique_lock atomicatomicCAS condition_variablecondition_variable thread 操作线程需要头文件<thread>&#xff0c;头文件包含线程相关操作&#xf…...

StarRocks实时分析数据库的基础与应用

1. 什么是 StarRocks&#xff1f; StarRocks 是一款开源的在线分析处理&#xff08;OLAP&#xff09;数据库&#xff0c;专为实时、低延迟的分析场景而设计。它以其大规模并行处理&#xff08;MPP&#xff09;架构和列式存储设计&#xff0c;极大地提高了查询性能和处理效率。…...

golang学习笔记17——golang使用go-kit框架搭建微服务详解

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

git update-ref

git update-ref 是一个低级别的 Git 命令&#xff0c;用于直接更新 Git 的引用&#xff08;refs&#xff09;。这个命令可以用来设置或删除分支、标签或其他引用的值&#xff0c;通常用于脚本或复杂的 Git 操作中。 基本用法 git update-ref <ref> <new-value> […...

学习使用在windows系统上安装nodejs以及环境配置图文教程整理

学习使用在windows系统上安装nodejs以及环境配置图文教程整理 Node.js 介绍Node.js 安装1、Node.js下载2、Node.js安装3、Node.js测试4、Node.js安装目录5、Node.js环境变量配置6、配置镜像站&#xff0c;提升速度7、检查镜像站配置8、测试环境变量是否生效9、安装cnpm Node.js…...

Hexo框架学习——从安装到配置

第一章 Hexo入门 Hexo 是一个快速、简洁且高效的博客框架。 1.1 Hexo的下载与安装 1.1.1 Hexo下载 在下载Hexo之前&#xff0c;我们需要确保电脑上已经安装好以下软件&#xff1a; Node.js (Node.js 版本需不低于 10.13&#xff0c;建议使用 Node.js 12.0 及以上版本) Git…...

搭建Windows下的Rust开发环境

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 2.1.1 安装vs_buildtools 在Windows系列操作系统中&#xff0c;Rust开发环境需要依…...

[linux 驱动]misc设备驱动详解与实战

目录 1 描述 2 结构体 2.1 miscdevice 2.2 file_operations 3 注册和注销 3.1 misc_register 3.2 misc_deregister 4 解析 misc 内核源码 4.1 核心代码 4.2 函数解析 4.2.1 class_create_file 4.2.2 class_destroy 4.2.3 register_chrdev 5 示例 5.1 简单示例 5…...

C/S架构与B/S架构的适用场景分析

C/S架构&#xff08;客户端/服务器架构&#xff09;与B/S架构&#xff08;浏览器/服务器架构&#xff09;在适用场景上各有特点&#xff0c;主要取决于应用的具体需求、用户群体、系统维护成本、跨平台需求等因素。 一、C/S架构的适用场景 1、高性能与交互性要求高的应用&…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...