添加 README.md

This commit is contained in:
k
2025-12-22 15:34:55 +00:00
commit 3724221a77

324
README.md Normal file
View File

@@ -0,0 +1,324 @@
# 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