高效管理百万级数据:MySQL备份与恢复实战指南

简介

在当今数字化时代,数据是企业不可或缺的核心资产之一,而MySQL作为一种流行的关系型数据库管理系统,其百万级数据的高效管理显得尤为重要。本实战指南将深入探讨MySQL备份与恢复的关键策略,为您提供全面而实用的解决方案。通过详细的步骤和最佳实践,您将学会如何有效地备份大规模数据,确保数据的完整性和可靠性。无论是面对突发故障、意外数据丢失还是系统升级,这个指南将为您提供可靠的工具和技巧,帮助您高效管理百万级数据的备份与恢复工作。

开始实验

首先我们先来创建两张表,简单粗暴点,直接上sql语句:

-- 创建主数据表
CREATE TABLE main_table (
  id INT NOT NULL AUTO_INCREMENT,
  data1 VARCHAR(255),
  data2 VARCHAR(255),
  data3 VARCHAR(255),
  data4 INT,
  data5 INT,
  data6 DATE,
  data7 TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

-- 创建关联数据表
CREATE TABLE related_table_1 (
  id INT NOT NULL AUTO_INCREMENT,
  main_id INT,
  data1 VARCHAR(255),
  data2 VARCHAR(255),
  data3 VARCHAR(255),
  data4 INT,
  data5 INT,
  data6 DATE,
  data7 TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  FOREIGN KEY (main_id) REFERENCES main_table(id)
);

在这里插入图片描述
然后直接生成一百万条语句:

INSERT INTO main_table (data1, data2, data3, data4, data5, data6) 
SELECT CONCAT('Data', a.a), CONCAT('Data', b.a), CONCAT('Data', c.a), RAND()*100, RAND()*100, CURDATE() 
FROM (SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
CROSS JOIN (SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
CROSS JOIN (SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c 
LIMIT 1000000; -- 主表插入数据

INSERT INTO related_table_1 (main_id, data1, data2, data3, data4, data5, data6) 
SELECT id, CONCAT('MoreData', a.a), CONCAT('MoreData', b.a), CONCAT('MoreData', c.a), RAND()*100, RAND()*100, CURDATE() 
FROM main_table, 
(SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
CROSS JOIN (SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
CROSS JOIN (SELECT 0 a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c 
LIMIT 1000000; -- 关联表生成约1,000,000条数据

在这里插入图片描述

创建备份脚本

#!/bin/bash

# 配置
DB_USER="your_db_user"
DB_PASSWORD="your_db_password"
DB_NAME="your_db_name"
BACKUP_PATH="/path/to/your/backup/directory"
LOG_PATH="/path/to/your/log/directory"
LOG_FILE="$LOG_PATH/backup.log"
#设置备份文件数量
MAX_BACKUP_FILES=10
#设置日志数量
MAX_LOG_FILES=10
# 设定日志文件大小阈值,例如1MB。
MAX_LOG_SIZE=1048576

# 创建备份和日志目录(如果它们不存在)
mkdir -p "$BACKUP_PATH"
mkdir -p "$LOG_PATH"

# 生成备份文件名
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="$BACKUP_PATH/$DB_NAME_$TIMESTAMP.sql"

# 开始备份,并记录开始时间
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Starting backup for database: $DB_NAME" >> "$LOG_FILE"
START_TIME=$(date +%s)

# 执行备份命令
mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$BACKUP_FILE" 2>> "$LOG_FILE"

# 检查备份命令是否成功
if [ $? -eq 0 ]; then
  echo "[$(date +"%Y-%m-%d %H:%M:%S")] Backup successful: $BACKUP_FILE" >> "$LOG_FILE"
  # 计算备份文件大小
  BACKUP_SIZE=$(du -sh "$BACKUP_FILE" | cut -f1)
  echo "Backup size: $BACKUP_SIZE" >> "$LOG_FILE"
else
  echo "[$(date +"%Y-%m-%d %H:%M:%S")] Error during backup" >> "$LOG_FILE"
fi

# 记录备份结束时间,并计算耗时
END_TIME=$(date +%s)
ELAPSED_TIME=$((END_TIME - START_TIME))
echo "Elapsed time: $ELAPSED_TIME seconds" >> "$LOG_FILE"

# 备份文件轮转,删除最旧的,只保留最新的MAX_BACKUP_FILES个文件
find "$BACKUP_PATH" -name "*.sql" -type f | sort | head -n -"$MAX_BACKUP_FILES" | xargs rm -f
# 日志轮转,保留最新的N个日志文件
# 检查日志文件是否存在及其大小
if [ -f "$LOG_FILE" ]; then
    LOG_SIZE=$(stat -c%s "$LOG_FILE")
    if [ $LOG_SIZE -gt $MAX_LOG_SIZE ]; then
        # 如果当前日志文件超过阈值,则重命名当前日志文件,加上时间戳
        mv "$LOG_FILE" "$LOG_PATH/backup_$(date +"%Y-%m-%d_%H-%M-%S").log"
    fi
fi
find "$LOG_PATH" -name '*.log' -type f | sort | head -n -"$MAX_LOG_FILES" | xargs rm -f

# 结束脚本
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Backup script completed" >> "$LOG_FILE"

在这里插入图片描述

注意事项
权限:确保脚本有执行权限,使用chmod +x mysql_backup.sh命令。
配置:替换脚本中的DB_USER, DB_PASSWORD, DB_NAME, BACKUP_PATH, 和 LOG_PATH为实际值。
定时任务:考虑使用cron任务定期执行此备份脚本,确保数据定期备份。
我是离线安装的MySQL,虽然配置了变量,但还是出现了一个“mysqldump: not found”的报错,好尴尬,但没关系,脚本里备份命令写全路径就行,例如这样/usr/local/mysql/bin/mysqldump。
执行备份脚本:
在这里插入图片描述
可以看到图中已成功生成了备份文件与日志文件。
然后直接干掉这个数据库,运行试试:

--删除数据库
DROP DATABASE test;
--创建数据库
CREATE DATABASE test;
--运行备份文件
source /home/test/bak_sql/2024-03-10_13-08-35.sql;

在这里插入图片描述
看看数据量

select count(*) from related_table_1;

在这里插入图片描述

创建恢复脚本

编写一个数据库恢复脚本实现自动化恢复过程,减少人为错误,废话少说,直接上脚本:

#!/bin/bash
# 检查是否提供了备份文件作为参数
if [ "$#" -ne 1 ]; then
    echo "Usage: $0 <backup_file_path>"
    exit 1
fi

BACKUP_FILE="$1" # 使用脚本参数指定的备份文件
# 配置
DB_USER="your_db_user"
DB_PASSWORD="your_db_password"
DB_NAME="your_db_name_to_restore"
BACKUP_PATH="/path/to/your/backup/directory"
LOG_PATH="/path/to/your/log/directory"
LOG_FILE="$LOG_PATH/restore.log"

# 创建日志目录(如果它不存在)
mkdir -p "$LOG_PATH"

# 开始恢复,并记录开始时间
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Starting restore for database: $DB_NAME from file: $BACKUP_FILE" >> "$LOG_FILE"
START_TIME=$(date +%s)

# 执行恢复命令
mysql -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" < "$BACKUP_FILE" 2>> "$LOG_FILE"

# 检查恢复命令是否成功
if [ $? -eq 0 ]; then
  echo "[$(date +"%Y-%m-%d %H:%M:%S")] Restore successful for database: $DB_NAME from file: $BACKUP_FILE" >> "$LOG_FILE"
else
  echo "[$(date +"%Y-%m-%d %H:%M:%S")] Error during restore" >> "$LOG_FILE"
fi

# 记录恢复结束时间,并计算耗时
END_TIME=$(date +%s)
ELAPSED_TIME=$((END_TIME - START_TIME))
echo "Elapsed time: $ELAPSED_TIME seconds" >> "$LOG_FILE"

# 结束脚本
echo "[$(date +"%Y-%m-%d %H:%M:%S")] Restore script completed" >> "$LOG_FILE"

在这里插入图片描述
和上面出现了一样的报错,找不到MySQL,好吧,小问题,不管了,执行恢复那条语句我就直接写全路径了。
执行命令记得加上参数,就像下面这样

sudo sh mysql_restore.sh /home/test/bak_sql/2024-03-10_13-08-35.sql

结论

本篇文章主要有三个部分:生成数据、备份脚本、恢复脚本,每一步骤都在虚拟机上完成了验证,已确认可以正常运行,请放心食用。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot中RestTemplate 发送http请求

SpringBoot中RestTemplate 发送http请求 引入fastjson <!--fastjson--> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.47</version> </dependency>创建配置文件 新建c…

链表中的经典问题——反转链表

经典问题 对于链表的结构还不太清晰的同学&#xff0c;可以看我的另一篇文章&#xff0c;实践总结&#xff1a;一篇搞懂链表——单链表和双指针技巧 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 方法一&#xff0c;迭代法…

牛客周赛 Round 36

赛况 C题可惜&#xff0c;比赛时模拟没有想明白&#xff0c;只对了一半&#xff0c;赛后看了大佬们的题解后恍然大悟&#xff0c;而F题是压根没思路&#xff0c;况且F题部分分也比较难拿。 题目列表 A-小红的数位删除 思路 将读入的数字整除10做三次后输出即可 参考代码 #inc…

【数据结构】详解时间复杂度和空间复杂度的计算

一、时间复杂度&#xff08;执行的次数&#xff09; 1.1时间复杂度的概念 1.2时间复杂度的表示方法 1.3算法复杂度的几种情况 1.4简单时间复杂度的计算 例一 例二 例三 1.5复杂时间复杂度的计算 例一&#xff1a;未优化冒泡排序时间复杂度 例二&#xff1a;经过优化…

蓝桥杯备战刷题-滑动窗口

今天给大家带来的是滑动窗口的类型题&#xff0c;都是十分经典的。 1&#xff0c;无重复字符的最长子串 看例三&#xff0c;我们顺便来说一下子串和子序列的含义 子串是从字符串里面抽出来的一部分&#xff0c;不可以有间隔&#xff0c;顺序也不能打乱。 子序列也是从字符串里…

5分钟教你使用pyarmnn推理引擎识别一只可爱猫咪~

视频 5分钟教你使用pyarmnn推理引擎识别一只可爱猫咪&#xff5e; 添加仓库 sudo apt install software-properties-common sudo add-apt-repository ppa:armnn/ppa sudo apt update 安装pyarmnn sudo apt-get install -y python3-pyarmnn armnn-latest-all python3-pip安装…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Checkbox)

提供多选框组件&#xff0c;通常用于某选项的打开或关闭。 说明&#xff1a; API version 11开始&#xff0c;Checkbox默认样式由圆角方形变为圆形。 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口…

Python(38):Request的data需入参是json,用转换json.dumps(data)

Python接口自动化测试遇到问题:误传str类型给request 一&#xff1a;request接口请求数据用str传参报错&#xff0c;请求响应报错 排查原因&#xff1a;查看服务器报错是Json解析报错。 1.1、如果直接入参&#xff0c;进行request请求的数据&#xff1a; data请求值为&…

C语言---单身狗问题

1.单身狗初阶 这个题目就是数组里面有一串数字&#xff0c;都是成对存在的&#xff0c;只有一个数字只出现了一次&#xff0c;请你找出来 &#xff08;1&#xff09;异或是满足交换律的&#xff0c;两个相同的数字异或之后是0&#xff1b; &#xff08;2&#xff09;让0和每个…

【LeetCode每日一题】299. 猜数字游戏

文章目录 [299. 猜数字游戏](https://leetcode.cn/problems/bulls-and-cows/)思路&#xff1a;代码&#xff1a; 299. 猜数字游戏 思路&#xff1a; 遍历两个字符串 secret 和 guess&#xff0c;若字符既在相同位置上又相等&#xff0c;则位置和数字都正确&#xff0c;对应的 …

如何对于单元格数据进行清洗处理

如何对于单元格数据进行清洗处理 陪伴意味着有人愿意把最美好的东西给你&#xff0c; 那就是时间。 当然陪伴也是一个很平常的事情&#xff0c; 日复一日&#xff0c;年复一年。 到最后陪伴就成了一种习惯。 约定好的相逢&#xff0c;伴你天荒地老&#xff01; 陪伴是最长情的告…

多线程多进程处理服务器并发(多进程处理如何解决僵死进程)

目录 1.可循环发送数据的代码 2.改成循环之后每次发现只能处理一个客户端 3.服务器端处理并发问题 3.1 思路 3.2 利用多线程实现并发 ​编辑 3.3 利用多进程实现并发 3.3.1 多进程并发产生的僵死进程问题 ​3.3.2 解决僵死进程问题 1.可循环发送数据的代码 服务器代…

AI代码加速器即将发布!傅盛:程序员会写某种代码就能找到工作的时代一去不复返了

在产品介绍视频的最后&#xff0c;代码加速器运行了Prompt生成的代码&#xff0c;是一个为傅盛庆生的祝福“彩蛋”。不得不说&#xff0c;猎户星空的程序员就做到了傅盛说的不止写代码&#xff0c;真是有点浪漫小心机在身上的。 3月6日&#xff0c;猎豹移动董事长兼CEO、猎户星…

木球竞赛抽签计分系统(C# Winform)

前几天做了个小系统&#xff0c;木球竞赛抽签计分系统。种子的设置&#xff0c;和轮空的设置&#xff0c;都是按照运动抽签的规则。目前仅支持8位&#xff0c;16位, 32位&#xff0c;64位报表的生成。 功能模块&#xff1a; 1、比赛管理&#xff1a;名称、承办、时间、地点 2…

使用Certbot解决https证书自动更新的问题

除了各个第三方博客平台之外&#xff0c;我还一直保有一个自建的博客网站https://zxs.io/&#xff0c;还有几个其他的域名用做小工具之类的&#xff0c;之前一直使用阿里云免费https证书&#xff0c;一次申请可以用一年&#xff0c;但现在阿里云免费证书缩短到3个月了&#xff…

云上攻防-云产品篇堡垒机场景JumpServer绿盟SASTeleport麒麟齐治

知识点 1、云产品-堡垒机-产品介绍&攻击事件 2、云产品-堡垒机-安全漏洞&影响产品 章节点&#xff1a; 云场景攻防&#xff1a;公有云&#xff0c;私有云&#xff0c;混合云&#xff0c;虚拟化集群&#xff0c;云桌面等 云厂商攻防&#xff1a;阿里云&#xff0c;腾讯…

【网络工程设计】交换网络技术

&#x1f4dd;本文介绍 本文主要介绍使用GNS3和VMware来构件一个简单的交换网络 &#x1f44b;作者简介&#xff1a;一个正在积极探索的本科生 &#x1f4f1;联系方式&#xff1a;943641266(QQ) &#x1f6aa;Github地址&#xff1a;https://github.com/sankexilianhua &#x…

【MySQL篇】 MySQL基础学习

文章目录 前言基础数据类型DDL数据库操作查询数据库创建数据库删除数据库使用数据库 DDL表操作创建表查询表修改表删除 DML-增删改添加数据更改数据删除数据 DQL-查询基础查询条件查询聚合函数分组查询排序查询分页查询编写顺序 DML-用户及权限用户管理权限控制 函数字符串函数…

修复网络适配器不工作的14种方法,总有一种适合你

网络适配器是将设备连接到internet或其他计算机的关键硬件组件。如果设备发生故障,你可能会面临连接速度慢的问题,在最坏的情况下,互联网将完全停止工作。 这可能是由于损坏的驱动程序、冲突的设备、配置错误的设置,甚至是硬件故障!但也有可能出现互联网问题,使你认为网…

22.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-加载配置文件到分析工具界面

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;21.配置数据保存…