Files
ccdi/docs/plans/2026-02-28-database-migration-design.md

283 lines
7.8 KiB
Markdown
Raw Normal View History

# 数据库迁移设计文档
## 概述
将 CCDI 纪检初核系统的开发环境数据库完整迁移到生产环境,包括所有表结构和数据的导出与导入。
## 需求分析
### 迁移目标
- **源数据库**: 116.62.17.81:3306/ccdi
- **目标环境**: 全新的生产数据库(空库)
- **迁移范围**: 所有表的结构和数据
### 关键要求
1. 表结构和数据分离导出(两个独立文件)
2. 只导出表,不包括视图、存储过程、触发器等
3. 完整导出所有数据,不需要脱敏
4. 确保字符集正确,避免乱码问题
5. 使用 mysqldump 命令导出
6. 提供自动化脚本简化操作
## 技术方案
### 导出工具
使用 MySQL 官方工具 `mysqldump` 进行导出,优势:
- 标准化工具,兼容性最佳
- 性能优秀,适合大数据库
- 生成的 SQL 文件通用性强
### 字符集处理
- **字符集**: utf8mb4支持完整 Unicode包括 emoji
- **排序规则**: utf8mb4_general_ci
- **客户端字符集**: utf8mb4
关键措施:
1. mysqldump 命令添加 `--default-character-set=utf8mb4` 参数
2. SQL 文件头部添加字符集声明语句
3. 导入时指定字符集参数
4. 导入后验证中文数据正确性
## 导出设计
### 文件组织
```
ccdi/
├── export_database.sh # 自动化脚本
├── db_config.conf.template # 配置模板
├── db_config.conf # 实际配置(不纳入版本控制)
└── doc/
└── database/
└── backup/
├── ccdi_structure.sql # 表结构文件
├── ccdi_data.sql # 数据文件
└── export_guide.md # 操作指南
```
### 表结构导出命令
```bash
mysqldump -h 116.62.17.81 -P 3306 -u root -p \
--no-data \
--skip-triggers \
--skip-add-drop-table \
--default-character-set=utf8mb4 \
--single-transaction \
ccdi > ccdi_structure.sql
```
**参数说明**:
- `--no-data`: 只导出表结构,不导出数据
- `--skip-triggers`: 跳过触发器
- `--skip-add-drop-table`: 不添加 DROP TABLE 语句(避免误删)
- `--default-character-set=utf8mb4`: 指定字符集
- `--single-transaction`: InnoDB 表一致性导出,不锁表
### 数据导出命令
```bash
mysqldump -h 116.62.17.81 -P 3306 -u root -p \
--no-create-info \
--skip-triggers \
--default-character-set=utf8mb4 \
--single-transaction \
--complete-insert \
--extended-insert \
ccdi > ccdi_data.sql
```
**参数说明**:
- `--no-create-info`: 只导出数据,不导出表结构
- `--complete-insert`: INSERT 语句包含列名
- `--extended-insert`: 使用多行 INSERT提高导入效率
### SQL 文件字符集声明
```sql
SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
SET GLOBAL character_set_client=utf8mb4;
SET GLOBAL character_set_connection=utf8mb4;
SET GLOBAL character_set_results=utf8mb4;
```
## 导入设计
### 导入顺序
1. 先导入表结构:`ccdi_structure.sql`
2. 再导入数据:`ccdi_data.sql`
### 导入命令
```bash
# 导入表结构
mysql -h 生产环境IP -P 3306 -u 用户名 -p \
--default-character-set=utf8mb4 \
数据库名 < ccdi_structure.sql
# 导入数据
mysql -h 生产环境IP -P 3306 -u 用户名 -p \
--default-character-set=utf8mb4 \
数据库名 < ccdi_data.sql
```
### 前置条件
1. 目标数据库已创建(如:`CREATE DATABASE ccdi CHARACTER SET utf8mb4;`
2. 目标用户有足够权限
3. 磁盘空间充足
## 自动化脚本设计
### 脚本功能
- **导出模式**: `./export_database.sh export`
- 检查 mysqldump 命令可用性
- 创建备份目录
- 执行结构导出和数据导出
- 添加字符集声明到文件头部
- 验证文件生成
- 记录操作日志
- **导入模式**: `./export_database.sh import [production|test]`
- 读取配置文件获取目标环境信息
- 检查目标数据库连接
- 依次导入结构和数据文件
- 验证导入结果
- 记录操作日志
### 配置文件设计
```bash
# 源数据库配置(开发环境)
SOURCE_DB_HOST=116.62.17.81
SOURCE_DB_PORT=3306
SOURCE_DB_USER=root
SOURCE_DB_PASS=Kfcx@1234
SOURCE_DB_NAME=ccdi
# 生产环境数据库配置
PROD_DB_HOST=生产环境IP
PROD_DB_PORT=3306
PROD_DB_USER=生产环境用户名
PROD_DB_PASS=生产环境密码
PROD_DB_NAME=ccdi
# 测试环境数据库配置(可选)
TEST_DB_HOST=测试环境IP
TEST_DB_PORT=3306
TEST_DB_USER=测试环境用户名
TEST_DB_PASS=测试环境密码
TEST_DB_NAME=ccdi
# 导出文件配置
BACKUP_DIR=doc/database/backup
STRUCTURE_FILE=ccdi_structure.sql
DATA_FILE=ccdi_data.sql
```
### 安全措施
1. `db_config.conf` 添加到 `.gitignore`
2. 提供 `db_config.conf.template` 模板文件
3. 首次运行时检测配置文件,提示用户填写
## 验证测试
### 导出验证
1. 检查生成的 SQL 文件大小是否合理
2. 检查文件头部是否包含字符集声明
3. 随机抽取数据检查是否有乱码
4. 统计表数量和数据行数
### 导入验证
1. 在测试环境先进行导入测试
2. 对比源数据库和目标数据库的表数量
3. 抽查关键表的数据行数
4. 查询包含中文的数据验证编码正确性
5. 使用 `SHOW CREATE TABLE` 检查表字符集
### 验证命令
```sql
-- 查看数据库字符集
SHOW CREATE DATABASE ccdi;
-- 查看表数量
SELECT COUNT(*) FROM information_schema.tables
WHERE table_schema='ccdi';
-- 查看各表行数
SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_schema='ccdi'
ORDER BY table_rows DESC;
-- 检查表字符集
SHOW CREATE TABLE sys_user;
```
## 错误处理
### 常见问题
1. **字符集乱码**
- 原因:未指定字符集参数
- 解决:确保所有命令都添加 `--default-character-set=utf8mb4`
2. **导入失败**
- 原因:外键约束冲突
- 解决:导入前临时禁用外键检查 `SET FOREIGN_KEY_CHECKS=0;`
3. **连接超时**
- 原因:数据库过大或网络慢
- 解决:添加 `--max_allowed_packet=512M` 参数
4. **权限不足**
- 原因:用户权限不够
- 解决:使用 root 用户或授予足够权限
## 操作流程
### 完整迁移流程
1. 配置 `db_config.conf` 文件
2. 执行导出:`./export_database.sh export`
3. 验证导出文件正确性
4. 在测试环境验证导入:`./export_database.sh import test`
5. 验证测试环境数据完整性
6. 在生产环境执行导入:`./export_database.sh import production`
7. 验证生产环境数据完整性
8. 应用程序连接测试
### 回滚方案
保留源数据库,如迁移失败可继续使用源数据库,重新执行迁移流程。
## 交付物
1. **自动化脚本**: `export_database.sh`
2. **配置模板**: `db_config.conf.template`
3. **表结构文件**: `doc/database/backup/ccdi_structure.sql`
4. **数据文件**: `doc/database/backup/ccdi_data.sql`
5. **操作指南**: `doc/database/backup/export_guide.md`
6. **设计文档**: `docs/plans/2026-02-28-database-migration-design.md`
## 时间估算
- 脚本开发30分钟
- 导出执行10-30分钟取决于数据量
- 测试环境导入验证10-30分钟
- 生产环境导入10-30分钟
- 验证测试10分钟
**总计**: 约1.5-2小时
## 风险评估
| 风险项 | 等级 | 缓解措施 |
|--------|------|----------|
| 数据量过大导致超时 | 中 | 添加 max_allowed_packet 参数,分批导出 |
| 字符集乱码 | 高 | 严格遵循字符集规范,导入后验证 |
| 网络中断 | 低 | 本地保存SQL文件可重复导入 |
| 生产环境数据冲突 | 无 | 全新空库,无冲突风险 |
| 权限问题 | 低 | 使用 root 用户或确保权限充足 |
## 成功标准
1. ✅ 所有表结构成功导出,无遗漏
2. ✅ 所有表数据成功导出,无丢失
3. ✅ SQL 文件字符集正确,无乱码
4. ✅ 测试环境导入成功,数据完整
5. ✅ 生产环境导入成功,数据完整
6. ✅ 中文数据正确显示,编码无误
7. ✅ 应用程序可正常连接和操作数据库