高效管理百万级数据: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 ]; thenecho "[$(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"
elseecho "[$(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" ]; thenLOG_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 ]; thenecho "Usage: $0 <backup_file_path>"exit 1
fiBACKUP_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 ]; thenecho "[$(date +"%Y-%m-%d %H:%M:%S")] Restore successful for database: $DB_NAME from file: $BACKUP_FILE" >> "$LOG_FILE"
elseecho "[$(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

结论

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

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

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

相关文章

streamlit学习-如何修改css样式

streamlit学习-如何修改css样式 效果图代码(srv.py)运行 streamlit默认的样式有时并不符合自己的要求。比如手机上的布局太浪费空间,我们希望一屏能放下所有的元素,本文演示了如何操作 效果图 代码(srv.py) import streamlit as st #1.31.1 import cv2 import numpy as np im…

埋点方案设计之感想

埋点方案设计是指在软件开发或者数据分析中&#xff0c;为了跟踪用户行为、收集数据以及进行分析&#xff0c;需要在代码中插入一些埋点&#xff08;Tracking&#xff09;代码&#xff0c;记录用户在应用中的各种操作和行为。下面是一个简单的埋点方案设计流程&#xff1a; 明…

报错:C51/Inc/Atmel/regx52.h(15):error41:syntax error near ‘sfr‘, expected ‘hdata‘

背景 跟着51单片机教程敲代码&#xff0c;在学习模块化编程这块&#xff0c;一会.h&#xff0c;一会.c文件的&#xff0c;文件切来切去&#xff0c;然后编译的时候就出了如题所示的错。 解决过程 看了报错信息&#xff0c;一直以为是regx52.h里的15行附近我手抖改了什么东西…

实验二(二)OSPF路由协议基础实验

1.实验介绍 1.1关于本实验 开放式最短路径优先 OSPF(Open Shortest Path First)是IETF 组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。目前针对 IPv4 协议使用的是 OSPF Version 2(RFC2328);OSPF 作为基于链路状态的协议&#xff0c;OSPF 具有以下优…

OpenFeign的常规使用

架构: 一.新建module 引入依赖: <!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> yml配置; server:port: 80spring:applicati…

vue3学习与使用

1.setup setup() 函数是 vue3 中&#xff0c;专门为组件提供的新属性。它为我们使用 vue3 的 Composition API 新特性提供了统一的入口&#xff0c;setup 函数会在 beforeCreate 之后&#xff0c;created 之前执行, vue3 也是取消了这两个钩子&#xff0c;统一用 setup 代替, …

【 React 】对React Router的理解?常用的Router 组件有哪些

1 react-router 是什么 react-router等前端路由的原理大致相同&#xff0c;可以实现无刷新的条件下切换显示不同的页面 路由的本质就是页面的URL发生改变时&#xff0c;页面的显示结果可以根据URL的变化而变化&#xff0c;但是页面不会刷新 因此&#xff0c;可以通过前端路由可…

计算机网络(五)

网络层 网络层的主要目的是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输。 要实现网络层&#xff0c;主要解决三个问题&#xff1a; ①网络层向运输层提供怎样的服务&#xff1f;&#xff08;“可靠传输“、”不可靠传输“&#xff09; ②网络层寻址 ③路由选择…

2024年k8s最新版本安装教程

k8s安装教程 1 k8s介绍2 环境搭建2.1 主机准备2.2 主机初始化2.2.1 安装wget2.2.2 更换yum源2.2.3 常用软件安装2.2.4 关闭防火墙2.2.5 关闭selinux2.2.6 关闭 swap2.2.7 同步时间2.2.8 修改Linux内核参数2.2.9 配置ipvs功能 2.3 容器安装2.3.1 设置软件yum源2.3.2 安装docker软…

动态规划(蓝桥杯 C++ 题目 代码 注解)

目录 介绍&#xff1a; 题目一&#xff08;数字三角形&#xff09;&#xff1a; 题目二&#xff08;跳跃&#xff09;&#xff1a; 题目三&#xff08;背包问题类型&#xff09;&#xff1a; 题目四&#xff08;蓝肽子序列&#xff09;&#xff1a; 题目五&#xff08;合唱…

学习笔记。。。

1.字符串的拼接 1.sprintf() 往字符串的前面或中间、后面拼接一个字符串。 2.strncpy()用来复制字符串的前n个字符 //dest为目标数组&#xff0c;src为源数组&#xff0c;n为要复制的字符个数 2.char* My_strncpy(char* dest, const char* src, int n) 3.char *strcat(ch…

web蓝桥杯真题:西游记之西天取经

代码&#xff1a; animation-iteration-count: infinite; 考点&#xff1a; animation-iteration-count n | indinite属性定义动画的播放次数。 值描述n定义动画播放次数的数值。infinite规定动画应该无限次播放。

Ubuntu设置时区和时间同步

文章目录 Ubuntu设置时区和时间同步一、前言1.环境 二、正文1.设置时区2.时间同步 Ubuntu设置时区和时间同步 一、前言 1.环境 LInux 发行版本&#xff1a;ubuntu-22.04.3-desktop-amd64.iso Ubuntu Server&#xff1a;https://ubuntu.com/download/server 二、正文 1.设置…

代码训练LeetCode(7)删除有序数组中的重复项

代码训练(7)LeetCode之删除有序数组中的重复项 Author: Once Day Date: 2024年3月10日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09;力扣…

c++ 类内可以定义引用数据成员吗?

在C中&#xff0c;类内是可以定义引用数据成员的&#xff0c;但是在初始化对象时&#xff0c;必须在构造函数的成员初始化列表中对引用进行初始化&#xff0c;因为引用必须在创建时被初始化&#xff0c;并且不能在其生存期内引用不同的对象。下面是一个简单的示例&#xff1a; …

【病毒查杀】“PE启动盘+360杀毒软件”对硬盘病毒查杀

通过本步骤&#xff0c;用户可使用WinPE版本360系统急救箱软件对主板硬盘进行病毒木马扫描和杀毒操作。 360系统急救箱&#xff0c;这款软件是360官方推出的一款杀毒工具箱&#xff0c;可以帮助用户仅在WinPE环境下就可对硬盘进行病毒木马查杀&#xff0c;可能查杀过后因病毒木…

网络安全: Kali Linux 进行 MSFvenom 程序利用

目录 一、实验 1.环境 2. Kali Linux 进行 MSFvenom 程序利用 3. 创建计划任务自动运行 MSFvenom 程序 二、问题 1.在线加密解密 2.MSF 运行失败 3.MobaXterm 连接Ubuntu 失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本IP备注Kali Linux20…

STM32单片机基本原理与应用(十一)

语音识别实验 此实验采用STM32核心板 LD3320模块&#xff0c;通过初始化LD3320并写入待识别关键词&#xff0c;对麦克风说出相应关键词&#xff0c;实现实训平台上的流水灯相应变化的效果。 LD3320 是一颗基于非特定人语音识别 &#xff08;SI-ASR&#xff1a;Speaker-Indepen…

Python基础知识:数字类型及数学函数详解

在开启Python系列学习之后&#xff0c;我们就大概讲了数字类型及数学函数的基础语法。这一篇博客&#xff0c;我们就将详细介绍Python中的数字类型、数学函数、随机数函数、三角函数以及数学常量&#xff0c;同时&#xff0c;为大家提供一些示例代码帮助大家更好地理解它们的用…

C#拾遗补漏之goto跳转语句

前言 在我们日常工作中常用的C#跳转语句有break、continue、return&#xff0c;但是还有一个C#跳转语句很多同学可能都比较的陌生就是goto&#xff0c;今天大姚带大家一起来认识一下goto语句及其它的优缺点。 goto语句介绍 goto 语句由关键字 goto 后跟一个标签名称组成&…