添加 README.md
This commit is contained in:
324
README.md
Normal file
324
README.md
Normal 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
|
||||||
Reference in New Issue
Block a user