项目需求 | 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

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

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

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

相关文章

WSL安装Redis

前言 本来一直是在虚拟机的Ubuntu开发 但是 搞着搞着内存不足 导致我某些数据损坏了 然后目前迁移到Wsl开发 运行WSL的相较于虚拟机你不需要很多的性能开销&#xff01; 我只是代码开发和git交互&#xff0c;如果是搞逆向还是虚拟机。 记录一下redis 安装卸载 免得以后又忘了…

java基于PDF底层内容流的解析对文本内容进行编辑

本文实现了基于坐标位置对PDF内容的底层修改而非覆盖&#xff0c;因此不会出现在某些高级PDF编辑器中可以移除插入内容或者文件随着编辑次数增多而大幅增大&#xff08;原因是原内容还在文件中&#xff09;的问题&#xff0c;而且使用的pdfbox是一个开源的、免费的PDF处理库&am…

SSHamble:一款针对SSH技术安全的研究与分析工具

关于SSHamble SSHamble是一款功能强大的SSH技术安全分析与研究工具&#xff0c;该工具基于Go语言开发&#xff0c;可以帮助广大研究人员更好地分析SSH相关的安全技术与缺陷问题。 功能介绍 SSHamble 是用于 SSH 实现的研究工具&#xff0c;其中包含下列功能&#xff1a; 1、针…

ESP01的AT指令连接到阿里云平台

物联网平台提供安全可靠的设备连接通信能力&#xff0c;支持设备数据采集上云&#xff0c;规则引擎流转数据和云端数据下发设备端。此外&#xff0c;也提供方便快捷的设备管理能力&#xff0c;支持物模型定义&#xff0c;数据结构化存储&#xff0c;和远程调试、监控、运维。总…

移动UI案例:工具类app整套案例

工具类App是指提供各种实用工具和功能的手机应用程序。这些工具可以包括但不限于日历、闹钟、备忘录、翻译、计算器、单位转换、天气预报、地图导航、音乐播放器、相机、视频编辑等。这些工具类App能够帮助用户解决日常生活和工作中的各种问题&#xff0c;提高效率和便利性。 …

Java数据结构(十)——冒泡排序、快速排序

文章目录 冒泡排序算法介绍代码实现优化策略复杂度和稳定性 快速排序算法介绍优化策略非递归实现代码演示复杂度和稳定性 冒泡排序 算法介绍 冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就交换。遍历…

多线程篇(其它容器- CopyOnWriteArrayList)(持续更新迭代)

一、CopyOnWriteArrayList&#xff08;一&#xff09; 1. 简介 并发包中的并发List只有CopyOnWriteArrayList。 CopyOnWriteArrayList是一个线程安全的ArrayList&#xff0c;对其进行的修改操作都是在底层的一个复制的数 组&#xff08;快照&#xff09;上进行的&#xff0…

redis 基本数据类型—string类型

一、介绍 Redis 中的字符串&#xff0c;直接就是按照二进制数据的方式存储的&#xff0c;不会做任何的编码转换。 Redis对于 string 类型&#xff0c;限制了大小最大是512M 二、命令 SET 将 string 类型的 value 设置到 key 中。如果 key 之前存在&#xff0c;则覆盖&#…

Jwt、Filter、Interceptor

目录 JWT(Json Web Token) jwt令牌 组成 应用场景 生成令牌 解析令牌 登录实例 Filter过滤器 Filter Filter登录校验 Interceptor拦截器 Interceptor 拦截路径 执行流程 登录实例 JWT(Json Web Token) jwt令牌 定义了一种简洁的、自包含的格式&#xff0c;…

二、(JS)JS中常见的键盘事件

一、常见的键盘事件 onkeydown 某个键盘按键被按下onkeypress 某个键盘按键被按下onkeyup 某个键盘按键被松开 二、事件的执行顺序 onkeydown、onkeypress、onkeyup down 事件先发生&#xff1b;press 发生在文本被输入&#xff1b;up …

【大模型理论篇】大模型周边自然语言处理技术(NLP)原理分析及数学推导(Word2Vec、TextCNN、Gated TextCNN、FastText)

1. 背景介绍 进入到大模型时代&#xff0c;似乎宣告了与过去自然语言处理技术的结束&#xff0c;但其实这两者并不矛盾。大模型时代&#xff0c;原有的自然语言处理技术&#xff0c;依然可以在大模型的诸多场景中应用&#xff0c;特别是对数据的预处理阶段。本篇主要关注TextCN…

使用Python生成多种不同类型的Excel图表

目录 一、使用工具 二、生成Excel图表的基本步骤 三、使用Python创建Excel图表 柱形图饼图折线图条形图散点图面积图组合图瀑布图树形图箱线图旭日图漏斗图直方图不使用工作表数据生成图表 四、总结 Excel图表是数据可视化的重要工具&#xff0c;它通过直观的方式将数字信…

PCIe进阶之TL:First/Last DW Byte Enables Rules Traffic Class Field

1 First/Last DW Byte Enables Rules & Attributes Field 1.1 First/Last DW Byte Enables Rules Byte Enable 包含在 Memory、I/O 和 Configuration Request 中。本文定义了相应的规则。Byte Enable 位于 header 的 byte 7 。对于 TH 字段值为 1 的 Memory Read Request…

【STM32】esp8266通过MQTT连接服务器|订阅发布

1. MQTT协议 该协议为应用层协议&#xff0c;传输层使用的是tcp,MQTT的订阅和发布&#xff0c;就相当于在抖音中你关注了某个领域的博主&#xff08;订阅&#xff09;&#xff0c;如果有其他人发了作品就会推给你&#xff08;发布&#xff09;&#xff0c;默认已经安装好了 简…

哈希表、算法

哈希表 hash&#xff1a; 在编程和数据结构中&#xff0c;"hash" 通常指的是哈希函数&#xff0c;它是一种算法&#xff0c;用于将数据&#xff08;通常是字符 串&#xff09;映射到一个固定大小的数字&#xff08;哈希值&#xff09;。哈希函数在哈希表中尤为重要…

探索图论中的关键算法(Java 实现)

“日出东海落西山 愁也一天 喜也一天 遇事不钻牛角尖” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;||Day031. 最短路径算法Dijkstra算法Java 实现&#xff1a; Bellman-Ford算法Java 实现&#xff1a; 2. 最小生成树算法Prim算法Java 实现&#xff1a; Kruskal算法Ja…

C++速通LeetCode简单第9题-二叉树的最大深度

深度优先算法递归&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right…

Conmi的正确答案——MySQL的层级递归查询(递归公共表表达式,CTE)

数据库&#xff1a;oceanbase-ce 递归sql主体&#xff1a; WITH RECURSIVE country_area_tree AS (-- 非递归部分&#xff0c;初始化查询SELECT id, area_name, parent_id, 0 AS levelFROM country_areaWHERE id 589004044419077UNION ALL-- 递归部分&#xff0c;找到子节点S…

聚类_K均值

import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs1.数据预处理 #创建基于高斯分布的样本点, x是点的坐标&#xff0c;y是所属聚类值 x, y make_blobs(n_samples100, centers6, random_state100, cluster_std0.6) # 设置图形尺寸…

2. 变量和指令(omron 机器自动化控制器)——1

机器自动化控制器——第二章 变量和指令 1 2-1 变量一览表MC通用变量轴变量▶ 轴组变量 运动控制指令的输入变量输入变量的有效范围▶ 枚举体一览表 运动控制指令的输出变量运动控制指令的输入输出变量 2-1 变量一览表 MC功能模块使用的变量分为两类。 一类是监视轴等的状态及…