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

283 lines
7.8 KiB
Markdown
Raw Permalink 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.
# 数据库迁移设计文档
## 概述
将 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. ✅ 应用程序可正常连接和操作数据库