2025-12-22 15:57:55 +00:00
2025-12-22 15:57:55 +00:00
2025-12-22 15:37:37 +00:00

MySQL 8.0.24 备份恢复工具集

一套完整的 MySQL 8.0.24 备份恢复解决方案,包含全量备份、增量备份、恢复脚本及自动化测试。

📁 项目结构

mysql-backup-scripts/
├── config.sh                  # 配置文件
├── lib/
│   └── common.sh             # 公共函数库
├── full_backup.sh            # 全量备份脚本
├── incremental_backup.sh     # 增量备份脚本
├── restore_full.sh           # 全量备份恢复脚本
├── restore_incremental.sh    # 增量备份恢复脚本
├── test_backup_restore.sh    # 自动化测试脚本
└── README.md                 # 本文档

🚀 快速开始

1. 配置

编辑 config.sh 文件,根据实际环境修改以下配置:

# MySQL 连接配置
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"

# 备份存储配置
BACKUP_ROOT_DIR="/data/mysql_backup"

2. 设置脚本权限

chmod +x *.sh
chmod +x lib/*.sh

3. 执行备份

# 全量备份所有数据库
./full_backup.sh

# 全量备份指定数据库
./full_backup.sh -d mydb

# 增量备份
./incremental_backup.sh

📋 脚本说明

全量备份 (full_backup.sh)

使用 mysqldump 进行逻辑全量备份。

功能特点:

  • 支持单数据库或所有数据库备份
  • 记录 binlog 位置用于后续增量备份
  • 支持压缩备份gzip/pigz/lz4
  • 自动清理过期备份
  • 完善的错误处理和日志记录

使用方法:

./full_backup.sh [选项]

选项:
  -d, --database <name>    指定要备份的数据库 (可多次使用)
  -c, --compress           启用压缩 (默认)
  -n, --no-compress        禁用压缩
  -h, --help               显示帮助信息

示例:
  ./full_backup.sh                     # 备份所有数据库
  ./full_backup.sh -d mydb             # 仅备份 mydb 数据库
  ./full_backup.sh -d db1 -d db2       # 备份多个指定数据库

增量备份 (incremental_backup.sh)

基于 MySQL binlog 的增量备份。

功能特点:

  • 基于 binlog 实现增量备份
  • 从上次全量/增量备份点开始备份
  • 支持压缩
  • 自动清理过期备份

前提条件:

  • 必须先执行过全量备份
  • MySQL 必须启用 binlog (log_bin=ON)
  • MySQL 用户需要 REPLICATION SLAVE, REPLICATION CLIENT 权限

使用方法:

./incremental_backup.sh [选项]

选项:
  -f, --full-backup <path>  指定全量备份基准目录
  -b, --base-backup <path>  指定增量备份基准目录 (用于增量链)
  -c, --compress            启用压缩 (默认)
  -n, --no-compress         禁用压缩
  -h, --help                显示帮助信息

示例:
  ./incremental_backup.sh                          # 基于最新全量备份
  ./incremental_backup.sh -f /path/to/full_backup  # 指定全量备份

全量备份恢复 (restore_full.sh)

从全量备份恢复数据库。

功能特点:

  • 支持恢复全部数据库或指定数据库
  • 自动解压压缩备份
  • 恢复前可选择性备份当前数据
  • 支持验证恢复结果

使用方法:

./restore_full.sh [选项] <备份目录>

选项:
  -d, --database <name>    仅恢复指定数据库
  -y, --yes                跳过确认提示
  --no-backup              恢复前不备份当前数据
  -h, --help               显示帮助信息

示例:
  ./restore_full.sh /path/to/backup
  ./restore_full.sh -d mydb /path/to/backup
  ./restore_full.sh -y --no-backup /path/to/backup

增量备份恢复 (restore_incremental.sh)

应用增量备份中的 binlog。

功能特点:

  • 基于 binlog 应用增量变更
  • 支持指定时间点恢复 (PITR)
  • 自动处理备份链

使用方法:

./restore_incremental.sh [选项] <增量备份目录>

选项:
  -d, --database <name>       仅恢复指定数据库
  -t, --stop-datetime <time>  指定恢复到的时间点 (格式: 'YYYY-MM-DD HH:MM:SS')
  -y, --yes                   跳过确认提示
  -h, --help                  显示帮助信息

示例:
  ./restore_incremental.sh /path/to/incr_backup
  ./restore_incremental.sh -t '2023-12-20 15:30:00' /path/to/incr_backup

自动化测试 (test_backup_restore.sh)

自动化测试备份和恢复功能。

测试流程:

  1. 创建测试数据库和测试数据
  2. 执行全量备份
  3. 添加增量数据
  4. 执行增量备份
  5. 删除测试数据库(模拟数据丢失)
  6. 从全量备份恢复
  7. 应用增量备份
  8. 验证数据完整性
  9. 清理测试数据

使用方法:

./test_backup_restore.sh [选项]

选项:
  --skip-cleanup    测试后不清理数据
  --verbose         显示详细输出
  -h, --help        显示帮助信息

📂 备份目录结构

/data/mysql_backup/
├── full/                                    # 全量备份目录
│   └── mysql_backup_full_20231220_120000/  # 单次全量备份
│       ├── all_databases.sql.gz            # 全库备份文件
│       ├── binlog_position.txt             # binlog 位置
│       └── metadata.txt                    # 备份元数据
├── incremental/                             # 增量备份目录
│   └── mysql_backup_incr_20231220_180000/  # 单次增量备份
│       ├── mysql-bin.000001.gz             # binlog 备份
│       ├── binlog_position.txt             # binlog 位置
│       ├── base_backup_path.txt            # 基准备份路径
│       └── metadata.txt                    # 备份元数据
├── logs/                                    # 日志目录
│   ├── full_backup_20231220_120000.log
│   └── incremental_backup_20231220_180000.log
└── restore_tmp/                             # 恢复临时目录

⚙️ MySQL 配置要求

为了支持增量备份,需要在 MySQL 配置文件 (my.cnf) 中启用 binlog

[mysqld]
# 启用 binlog
log_bin = mysql-bin
server-id = 1
binlog_format = ROW

# 可选:设置 binlog 过期时间
expire_logs_days = 7
# 或者在 MySQL 8.0 中使用
binlog_expire_logs_seconds = 604800

🔐 MySQL 用户权限

备份用户需要以下权限:

GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES, RELOAD, 
      REPLICATION CLIENT, REPLICATION SLAVE, EVENT, PROCESS 
ON *.* TO 'backup_user'@'localhost';

🔄 典型恢复流程

场景 1完全恢复

# 1. 恢复最新的全量备份
./restore_full.sh /data/mysql_backup/full/mysql_backup_full_20231220_120000

# 2. 按顺序应用所有增量备份
./restore_incremental.sh /data/mysql_backup/incremental/mysql_backup_incr_20231220_180000
./restore_incremental.sh /data/mysql_backup/incremental/mysql_backup_incr_20231221_060000

场景 2时间点恢复 (PITR)

# 1. 恢复全量备份
./restore_full.sh /data/mysql_backup/full/mysql_backup_full_20231220_120000

# 2. 应用增量备份到指定时间点
./restore_incremental.sh -t '2023-12-20 15:30:00' /data/mysql_backup/incremental/mysql_backup_incr_20231220_180000

场景 3单数据库恢复

# 1. 恢复指定数据库的全量备份
./restore_full.sh -d mydb /data/mysql_backup/full/mysql_backup_full_20231220_120000

# 2. 应用增量备份
./restore_incremental.sh -d mydb /data/mysql_backup/incremental/mysql_backup_incr_20231220_180000

定时任务配置

推荐的 crontab 配置:

# 每天凌晨 2 点执行全量备份
0 2 * * * /path/to/mysql-backup-scripts/full_backup.sh >> /var/log/mysql_backup.log 2>&1

# 每隔 6 小时执行增量备份 (除了全量备份时间)
0 8,14,20 * * * /path/to/mysql-backup-scripts/incremental_backup.sh >> /var/log/mysql_backup.log 2>&1

🐛 错误处理

所有脚本都包含完善的错误处理:

  1. 连接错误:无法连接 MySQL 时会输出详细错误信息
  2. 权限错误:权限不足时会提示所需权限
  3. 磁盘空间:备份前检查磁盘空间是否充足
  4. 锁定机制:防止同时运行多个备份进程
  5. 日志记录:所有操作都记录到日志文件

📝 日志示例

[INFO] [2023-12-20 12:00:00] ============================================================
[INFO] [2023-12-20 12:00:00] MySQL 全量备份开始
[INFO] [2023-12-20 12:00:00] ============================================================
[INFO] [2023-12-20 12:00:00] 检查 MySQL 连接...
[INFO] [2023-12-20 12:00:00] MySQL 连接成功
[INFO] [2023-12-20 12:00:00] 记录 binlog 位置信息
[INFO] [2023-12-20 12:00:00] Binlog 位置: mysql-bin.000005:12345
[INFO] [2023-12-20 12:00:01] 备份所有数据库
[INFO] [2023-12-20 12:05:00] 全库备份完成,大小: 2.5G
[INFO] [2023-12-20 12:05:00] 备份验证通过
[INFO] [2023-12-20 12:05:00] ============================================================
[INFO] [2023-12-20 12:05:00] MySQL 全量备份完成
[INFO] [2023-12-20 12:05:00] 执行耗时: 00:05:00
[INFO] [2023-12-20 12:05:00] ============================================================

⚠️ 注意事项

  1. 生产环境使用前请充分测试
  2. 建议在低峰期执行全量备份
  3. 定期验证备份可恢复性
  4. 保持备份存储的安全性
  5. 监控备份任务的执行状态

📄 许可证

MIT License

Description
No description provided
Readme 58 KiB
Languages
Shell 100%