mysql全量备份、全量恢复demo

mysql全量备份、全量恢复demo

案例:通过cron每分钟备份一次,具体生产按需调整,我用的目录是/opt 、按需调整

mysql_backup.sh

sql 复制代码
#!/bin/bash

# MySQL全量备份脚本(每分钟执行)
BACKUP_DIR="/opt/mysql_backups"
MYSQL_USER="root"
MYSQL_PASSWORD="cnmsb123"
BACKUP_FILE="$BACKUP_DIR/full_backup_$(date +\%Y\%m\%d_\%H\%M\%S).sql"
LOG_FILE="$BACKUP_DIR/backup.log"

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 记录日志
echo "[$(date +'\%Y-\%m-\%d \%H:\%M:\%S')] 开始MySQL全量备份..." >> "$LOG_FILE"

# 执行备份(备份所有数据库)
mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" \
    --all-databases \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    > "$BACKUP_FILE" 2>> "$LOG_FILE"

# 检查是否成功
if [ $? -eq 0 ]; then
    # 压缩备份文件
    gzip "$BACKUP_FILE"
    echo "[$(date +'\%Y-\%m-\%d \%H:\%M:\%S')] 备份成功: ${BACKUP_FILE}.gz" >> "$LOG_FILE"
    
    # 删除1小时前的备份(因为每分钟备份,磁盘会很快占满)
    find "$BACKUP_DIR" -name "full_backup_*.sql.gz" -mmin +60 -exec rm {} \;
    echo "[$(date +'\%Y-\%m-\%d \%H:\%M:\%S')] 已清理60分钟前的备份文件" >> "$LOG_FILE"
else
    echo "[$(date +'\%Y-\%m-\%d \%H:\%M:\%S')] 备份失败,请检查错误日志" >> "$LOG_FILE"
    rm -f "$BACKUP_FILE"  # 删除不完整的备份
fi

mysql_restore.sh

sql 复制代码
#!/bin/bash

# MySQL全量恢复脚本
BACKUP_DIR="/opt/mysql_backups"
MYSQL_USER="root"
MYSQL_PASSWORD="cnmsb123"
LOG_FILE="$BACKUP_DIR/restore.log"

# 检查备份目录是否存在
if [ ! -d "$BACKUP_DIR" ]; then
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 错误:备份目录 $BACKUP_DIR 不存在!" | tee -a "$LOG_FILE"
    exit 1
fi

# 获取最新的备份文件
LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/full_backup_*.sql.gz 2>/dev/null | head -n 1)

if [ -z "$LATEST_BACKUP" ]; then
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 错误:未找到可用的备份文件!" | tee -a "$LOG_FILE"
    exit 1
fi

# 记录恢复开始时间
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始恢复MySQL数据库,使用备份文件: $LATEST_BACKUP..." | tee -a "$LOG_FILE"

# 解压并恢复备份
gunzip -c "$LATEST_BACKUP" | mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" 2>> "$LOG_FILE"

# 检查恢复结果
if [ $? -eq 0 ]; then
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 恢复成功!" | tee -a "$LOG_FILE"
    # 恢复后刷新权限(重要!)
    mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "FLUSH PRIVILEGES;" 2>> "$LOG_FILE"
else
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] 恢复失败,请检查错误日志!" | tee -a "$LOG_FILE"
fi

测试案例

建测试库、表
复制代码
-- 创建测试数据库
CREATE DATABASE IF NOT EXISTS test_backup_db;
USE test_backup_db;

-- 创建测试表
CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    product_name VARCHAR(100) NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

-- 插入模拟数据
INSERT INTO users (username, email) VALUES
    ('alice', 'alice@example.com'),
    ('bob', 'bob@example.com'),
    ('charlie', 'charlie@example.com');

INSERT INTO orders (user_id, product_name, amount) VALUES
    (1, 'Laptop', 999.99),
    (1, 'Mouse', 19.99),
    (2, 'Keyboard', 49.99),
    (3, 'Monitor', 199.99);

-- 验证数据
SELECT * FROM users;
SELECT * FROM orders;
删库跑路
复制代码
mysql -uroot -pcnmsb123 -e "DROP DATABASE test_backup_db;"
恢复
复制代码
./mysql_restore.sh
相关推荐
Decay__几秒前
附-01 · MySQL 压测与容量规划 —— sysbench 基准测试、容量评估与参数基线
运维·数据库·sql·mysql·架构
美狐美颜SDK开放平台26 分钟前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk
2601_9689007732 分钟前
玻璃深加工的工艺窗口:4 道工序的温度与时间参数边界
android·java·javascript
好的佩奇011 小时前
Dart 之类修饰符
android·flutter·dart
YB13751 小时前
Jetpack Compose 动画Modifier.animateContentSize()
android
吹什么轩1 小时前
MySQL 内连接与外连接:从笛卡尔积到 LEFT JOIN,一篇讲透
数据库·mysql
事圆则缓1 小时前
Android 版本号、API Level 和 JDK 版本有什么关系?
android
boy快快长大1 小时前
MySQL 转 PostgreSQL 使用指南
数据库·mysql·postgresql
NineData1 小时前
NineData 社区版 V5.4.0 上线:715 条复制对比链路,AI Agent 新增表结构设计发布能力
大数据·数据库·人工智能·mysql·数据库管理工具·ninedata·数据库迁移工具
zhangguojia71 小时前
Android Activity 生命周期结束流程:从 finish() 到 onDestroy() 的跨进程状态调度
android