Files
mysql-backup/README.md
2025-12-22 15:34:55 +00:00

325 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 文件,根据实际环境修改以下配置:
```bash
# MySQL 连接配置
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"
# 备份存储配置
BACKUP_ROOT_DIR="/data/mysql_backup"
```
### 2. 设置脚本权限
```bash
chmod +x *.sh
chmod +x lib/*.sh
```
### 3. 执行备份
```bash
# 全量备份所有数据库
./full_backup.sh
# 全量备份指定数据库
./full_backup.sh -d mydb
# 增量备份
./incremental_backup.sh
```
## 📋 脚本说明
### 全量备份 (full_backup.sh)
使用 `mysqldump` 进行逻辑全量备份。
**功能特点:**
- 支持单数据库或所有数据库备份
- 记录 binlog 位置用于后续增量备份
- 支持压缩备份gzip/pigz/lz4
- 自动清理过期备份
- 完善的错误处理和日志记录
**使用方法:**
```bash
./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` 权限
**使用方法:**
```bash
./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)
从全量备份恢复数据库。
**功能特点:**
- 支持恢复全部数据库或指定数据库
- 自动解压压缩备份
- 恢复前可选择性备份当前数据
- 支持验证恢复结果
**使用方法:**
```bash
./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)
- 自动处理备份链
**使用方法:**
```bash
./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. 清理测试数据
**使用方法:**
```bash
./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
```ini
[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 用户权限
备份用户需要以下权限:
```sql
GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES, RELOAD,
REPLICATION CLIENT, REPLICATION SLAVE, EVENT, PROCESS
ON *.* TO 'backup_user'@'localhost';
```
## 🔄 典型恢复流程
### 场景 1完全恢复
```bash
# 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)
```bash
# 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单数据库恢复
```bash
# 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 配置:
```cron
# 每天凌晨 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