当前位置: 代码网 > it编程>数据库>Mysql > MySQL自动备份与覆盖恢复实战指南

MySQL自动备份与覆盖恢复实战指南

2026年03月11日 Mysql 我要评论
一、此前每日备份的脚本#!/bin/bash# === 配置部分 ===backup_base_dir="/data/backup_mysql"date=$(date +%f)log_file="${

一、此前每日备份的脚本

#!/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 相关业务表均已从备份中成功恢复,库结构完整。

以上就是mysql自动备份与覆盖恢复实战指南的详细内容,更多关于mysql自动备份与覆盖恢复的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com