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)
自动化测试备份和恢复功能。
测试流程:
- 创建测试数据库和测试数据
- 执行全量备份
- 添加增量数据
- 执行增量备份
- 删除测试数据库(模拟数据丢失)
- 从全量备份恢复
- 应用增量备份
- 验证数据完整性
- 清理测试数据
使用方法:
./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
🐛 错误处理
所有脚本都包含完善的错误处理:
- 连接错误:无法连接 MySQL 时会输出详细错误信息
- 权限错误:权限不足时会提示所需权限
- 磁盘空间:备份前检查磁盘空间是否充足
- 锁定机制:防止同时运行多个备份进程
- 日志记录:所有操作都记录到日志文件
📝 日志示例
[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] ============================================================
⚠️ 注意事项
- 生产环境使用前请充分测试
- 建议在低峰期执行全量备份
- 定期验证备份可恢复性
- 保持备份存储的安全性
- 监控备份任务的执行状态
📄 许可证
MIT License
Description
Languages
Shell
100%