当前位置: 首页 > news >正文

mysql全量备份、全量恢复demo

mysql全量备份、全量恢复demo

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

mysql_backup.sh

#!/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"
elseecho "[$(date +'\%Y-\%m-\%d \%H:\%M:\%S')] 备份失败,请检查错误日志" >> "$LOG_FILE"rm -f "$BACKUP_FILE"  # 删除不完整的备份
fi

mysql_restore.sh

#!/bin/bash# MySQL全量恢复脚本
BACKUP_DIR="/opt/mysql_backups"
MYSQL_USER="root"
MYSQL_PASSWORD="cnmsb123"
LOG_FILE="$BACKUP_DIR/restore.log"# 检查备份目录是否存在
if [ ! -d "$BACKUP_DIR" ]; thenecho "[$(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" ]; thenecho "[$(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 ]; thenecho "[$(date +'%Y-%m-%d %H:%M:%S')] 恢复成功!" | tee -a "$LOG_FILE"# 恢复后刷新权限(重要!)mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "FLUSH PRIVILEGES;" 2>> "$LOG_FILE"
elseecho "[$(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
http://www.dtcms.com/a/303215.html

相关文章:

  • 二叉树基本概念
  • 安装anaconda后,如何进入python解释器
  • 禾纳AET3156AP数据手册,增强型p沟道MOSFET芯片,替代AO4805方案
  • C#_运算符重载 operator
  • 【办公类-109-01】20250728托小班新生挂牌(学号姓名)
  • 微服务的编程测评系统7-题库接口
  • windows平台计划任务批处理实现定时任务
  • 循环神经网络 中文情感分析案例
  • WAIC首日 | RWKV-7s 新型高效大模型架构正式亮相
  • django 按照外键排序
  • uvm_do sequence marcos
  • SQL之防止误删数据
  • Spring核心机制:深入理解控制反转(IoC)
  • Kotlin的datetime库
  • 荣耀应用市场《2025上半年应用合规治理报告》丨开发加油站
  • C# 静态类_静态方法_静态字段(static 声明静态的关键字 )
  • R语言与作物模型(DSSAT模型)技术应用
  • 未授权访问漏洞 总结
  • mysql 关于树形数据结构的一些操作
  • STM32中集成USB驱动
  • SQL 查询语法笔记
  • C语言笔记03 :关于指针的补充
  • 力扣面试150题--颠倒二进制位
  • 第18章 泛型 笔记
  • 第一第二章笔记整理
  • AutoGen - model_clients和model_context使用示例
  • Docker学习相关视频笔记(一)
  • 机器学习sklearn:决策树的参数、属性、接口
  • redis getshell得方式
  • Redis 部署模式详解