高效管理百万级数据: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…

实验二(二)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…

计算机网络(五)

网络层 网络层的主要目的是实现网络互连&#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…

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

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

【病毒查杀】“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…

AI训练数据处理和读取

AI训练数据处理和读取 AI数据处理 AI数据处理概述 AI数据处理是指对原始数据进行一系列的操作&#xff0c;以便机器学习算法能够从中提取有用的信息&#xff0c;进而进行模型的训练、验证和部署。数据处理是机器学习流程中的关键步骤&#xff0c;其质量直接影响到模型的性能…

手把手一起开发SV4E-I3C设备(四)

JEDEC DDR5 SPD Hub Devices例程 所有例程&#xff0c;SV4E-I3C设备连接器件均为SPD5芯片&#xff0c;Reg表示MR寄存器&#xff0c;Mem表示NVM存储器 1、ENEC CCC ENEC 启用事件中断&#xff0c;ENEC CCC 仅在设备置于 I3C 基本模式后才受支持。当 SPD5 注册 ENEC CCC 时&am…

【CSS面试题】高度塌陷问题及解决

什么情况下产生 (when 父盒子没有定义高度&#xff0c;但是子元素有高度&#xff0c;希望用子盒子撑起父盒子的高度&#xff0c;但是子盒子添加了浮动属性之后&#xff0c;父盒子高度为0 <template><div class"father"><div class"son"&…

算法第二十六天-删除有序数组中的重复项Ⅱ

删除有序数组中的重复项 题目要求 解题思路 题目要求中提到原地修改&#xff0c;那么肯定需要一个指针指向当前即将放置元素的位置&#xff0c;需要另外一个指针向后遍历所有元素&#xff0c;所以[双指针]解法呼之欲出。 慢指针slow&#xff1a;指向当前元素放置的位置&…

F - Earn to Advance

解题思路 由于对于一点不知道后面得花费&#xff0c;所以无法决策当前是否要停下赚钱或要停下多久考虑一点&#xff0c;可以由其左上方的所有点到达所以从往前推&#xff0c;得出到的总花费然后考虑从之后不赚钱直接到最终所用次数和剩余钱若存在&#xff0c;在后面点赚钱更优…

Python错题集-8:AttributeError(找不到对应的对象的属性)

1问题描述 AttributeError: AxesSubplot object has no attribute arc 2代码详情 import matplotlib.pyplot as plt# 创建一个新的图形和坐标轴 fig, ax plt.subplots()# 定义弧线的参数 center (0.5, 0.5) # 圆心坐标 (x, y) width 1.0 # 半径 height 0.5 # 半径 ang…

沁恒CH32V307VCT6开发板记录---kalrry

沁恒CH32V307VCT6开发板记录---kalrry 一、官网申请开发板二、环境准备图一 一、官网申请开发板 1.沁恒官网 二、环境准备 1.数据手册&#xff1a;CH32V307DS0.PDF&#xff0c;CH32FV2x_V3xRM.PDF 2.CH32V307评估板说明及参考应用例程&#xff1a;CH32V307EVT_ZIP 3.集成开…

腾讯云拼了99元服务器老用户能买,续费不涨价!

良心腾讯云推出99元一年服务器&#xff0c;新用户和老用户均可以购买&#xff0c;续费不涨价&#xff0c;续费也是99元&#xff0c;配置为轻量2核2G4M、50GB SSD盘、300GB月流量、4M带宽&#xff1a;优惠价格99元一年&#xff0c;续费99元&#xff0c;官方活动页面 txybk.com/g…

C++类和对象(中篇)

目录 1. 类的6个默认成员函数 2. 构造函数 3.析构函数 4.拷贝构造函数 5.赋值运算符重载 6.const成员 7.取地址及const取地址操作符重载 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#…