news 2026/8/17 20:30:46

MySQL 自动备份与覆盖恢复实战:一套脚本搞定全库/按库备份恢复

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 自动备份与覆盖恢复实战:一套脚本搞定全库/按库备份恢复

一、备份脚本

#!/bin/bash # === 配置部分 === BACKUP_BASE_DIR="/data/backup_mysql" DATE=$(date +%F) LOG_FILE="${BACKUP_BASE_DIR}/logs/backup-${DATE}.log" LOCK_FILE="/tmp/mysql_backup.lock" # 备份选项(1=启用,0=禁用) ENABLE_FULL_BACKUP=1 ENABLE_PER_DB_BACKUP=1 # === 日志重定向 === mkdir -p "${BACKUP_BASE_DIR}/logs" exec >> "$LOG_FILE" 2>&1 echo "===== MySQL Backup Started: $(date) =====" # === 加锁,避免重复执行 === exec 9>"$LOCK_FILE" if ! flock -n 9; then echo "❗️ 另一个备份任务正在运行,退出..." exit 1 fi # === 全量备份 === if [ "$ENABLE_FULL_BACKUP" -eq 1 ]; then echo "📦 开始全库备份..." FULL_BACKUP_FILE="${BACKUP_BASE_DIR}/all/all-databases-${DATE}.sql" FULL_GZ_FILE="${FULL_BACKUP_FILE}.gz" mkdir -p "${BACKUP_BASE_DIR}/all" mysqldump --all-databases --single-transaction --quick --lock-tables=false > "$FULL_BACKUP_FILE" if [ $? -eq 0 ]; then echo "✔ 全库备份成功: $FULL_BACKUP_FILE" gzip "$FULL_BACKUP_FILE" if [ $? -eq 0 ]; then echo "✔ 全库压缩成功: $FULL_GZ_FILE" else echo "✘ 全库压缩失败: $FULL_BACKUP_FILE" >&2 fi else echo "✘ 全库备份失败" >&2 rm -f "$FULL_BACKUP_FILE" fi fi # === 每库备份 === if [ "$ENABLE_PER_DB_BACKUP" -eq 1 ]; then echo "📂 开始库级别备份..." databases=$(mysql -e "SHOW DATABASES;" | grep -Ev "^(Database|information_schema|performance_schema|mysql|sys)$") for db in $databases; do echo "🔄 正在备份: $db" DB_BACKUP_DIR="${BACKUP_BASE_DIR}/${db}" mkdir -p "$DB_BACKUP_DIR" DB_BACKUP_FILE="${DB_BACKUP_DIR}/${db}-${DATE}.sql" DB_GZ_FILE="${DB_BACKUP_FILE}.gz" mysqldump --single-transaction --quick --lock-tables=false "$db" > "$DB_BACKUP_FILE" if [ $? -eq 0 ]; then echo "✔ 备份成功: $DB_BACKUP_FILE" gzip "$DB_BACKUP_FILE" if [ $? -eq 0 ]; then echo "✔ 压缩成功: $DB_GZ_FILE" else echo "✘ 压缩失败: $DB_BACKUP_FILE" >&2 fi else echo "✘ 备份失败: $db" >&2 rm -f "$DB_BACKUP_FILE" fi done fi # === 清理过期文件(.sql / .sql.gz) === echo "🧹 清理 7 天前的备份文件..." find "$BACKUP_BASE_DIR" -type f \( -name "*.sql" -o -name "*.sql.gz" \) -mtime +7 -exec rm -f {} \; echo "===== MySQL Backup Completed: $(date) ====="

二、环境信息

  • 服务器主机名:

  • 服务器 IP:

  • 数据库类型:MySQL

  • MySQL 版本:8.0.42 Community Server

  • 目标数据库:imip_ecb

  • 数据库字符集:utf8mb4

  • 排序规则:utf8mb4_general_ci

  • 备份文件路径(恢复来源):
    /data/backup_mysql/imip_ecb/imip_ecb-2025-12-11.sql.gz

  • 恢复前保护性备份路径:
    /data/backup_mysql/manual_before_restore/imip_ecb-before-restore-2025-12-11.sql

  • 恢复类型:覆盖源库恢复(在同一实例上,用备份覆盖原有 imip_ecb 库)

三、实际恢复操作步骤

1. 查询imip_ecb数据库字符集与排序规则

mysql -u root -p -e " SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='imip_ecb'; "

查询结果:

SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME ----------- | -------------------------- | ------------------------ imip_ecb | utf8mb4 | utf8mb4_general_ci

目的:记录当前库的字符集/排序规则,确保重建数据库时保持一致。

2. 创建“恢复前快照”备份目录

mkdir -p /data/backup_mysql/manual_before_restore

目的:单独存放本次覆盖前的手工备份,便于必要时回滚。

3. 对覆盖前的imip_ecb做一次完整逻辑备份

mysqldump --single-transaction --quick --lock-tables=false \ imip_ecb > /data/backup_mysql/manual_before_restore/imip_ecb-before-restore-`date +%F`.sql

确认备份文件存在:

cd /data/backup_mysql/manual_before_restore ll # imip_ecb-before-restore-2025-12-11.sql

目的:为本次覆盖恢复保留一份“恢复前状态”的 SQL 备份。


4. 删除原有imip_ecb数据库(为覆盖恢复做准备)

mysql -u root -p -e "DROP DATABASE IF EXISTS imip_ecb;"

目的:清理旧库,避免恢复过程中与原有对象冲突,确保是“重建 + 导入”的干净覆盖。

5. 按原字符集/排序规则重建imip_ecb数据库

mysql -u root -p -e " CREATE DATABASE imip_ecb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; "

目的:与恢复前字符集/排序规则保持一致,避免编码相关问题。

6. 使用 2025-12-11 备份文件对imip_ecb进行覆盖恢复

zcat /data/backup_mysql/imip_ecb/imip_ecb-2025-12-11.sql.gz \ | mysql -u root -p imip_ecb

目的:通过zcat解压.sql.gz,并通过管道将逻辑备份数据导入到新建的imip_ecb库,实现在源实例上的覆盖恢复

7. 恢复后检查:确认数据库存在

mysql -u root -p -e "SHOW DATABASES LIKE 'imip_ecb';"

8. 恢复后检查:确认业务表已成功恢复

mysql -u root -p -D imip_ecb -e "SHOW TABLES;"

输出包含业务表,例如:

EMS_EQUIPMENT_INFO EMS_INSPECT_TASK EMS_MAINTENANCE_WORK_ORDER ERP_STOCK ERP_STOCK_IN ERP_STOCK_OUT ERP_SUPPLIER ERP_WAREHOUSE infra_task_attachment ...

目的:确认 EMS/ERP 相关业务表均已从备份中成功恢复,库结构完整。

9.交给业务测试

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 21:13:59

跨语言智能对话革命:PaddleX多语种语音识别实战指南

在当今全球化的数字时代,跨语言沟通已成为企业数字化转型的核心需求。PaddleX作为百度飞桨生态中的全流程开发工具包,其多语种语音识别功能正以其卓越的性能和易用性,为全球用户带来前所未有的智能交互体验。无论您是在构建跨国会议系统、开发…

作者头像 李华
网站建设 2026/8/17 0:46:50

Wan2.2-T2V-A14B能否取代传统视频剪辑师?业内专家这样说

Wan2.2-T2V-A14B能否取代传统视频剪辑师?业内专家这样说 你有没有想过,有一天只要说一句“生成一个宇航员骑自行车穿越火星的视频”,几秒钟后就能看到高清画面自动流淌出来?🤯 不是科幻电影,这事儿正在发生…

作者头像 李华
网站建设 2026/8/17 15:40:41

热力图技术实战指南:从基础应用到企业级解决方案

热力图技术实战指南:从基础应用到企业级解决方案 【免费下载链接】heatmap.js 🔥 JavaScript Library for HTML5 canvas based heatmaps 项目地址: https://gitcode.com/gh_mirrors/he/heatmap.js 热力图作为数据可视化的重要工具,在用…

作者头像 李华
网站建设 2026/8/17 23:53:03

DeepSeek+Dify构建智能体和企业知识库资料

在现代企业中,知识管理与信息检索是非常关键的领域。随着数据量的爆炸性增长,传统的信息检索方式面临着巨大挑战。为了应对这些挑战,向量索引与语义检索技术应运而生,它们能够大幅提升信息检索的准确性和效率。近期,Di…

作者头像 李华
网站建设 2026/8/17 20:15:41

终极Arial字体资源库:获取与完整使用指南

想要快速获取专业的Arial字体吗?这里为您提供完整的Arial字体资源,包含所有常用字重和样式。无论您是网页设计师还是文档编辑者,这些字体资源都能满足您的需求。Arial字体作为经典的无衬线字体,在各类设计场景中都有出色表现。 【…

作者头像 李华
网站建设 2026/8/17 8:17:35

揭秘多模态Agent服务协同瓶颈:如何用Docker Compose实现高效编排?

第一章:多模态 Agent 服务编排的核心挑战在构建基于多模态输入(如文本、图像、语音)的智能 Agent 系统时,服务编排面临前所未有的复杂性。不同模态的数据处理依赖异构的服务模块,如何高效协调这些模块并保证整体系统的…

作者头像 李华