Files
schoolNews/docker/init-db/README.md
2025-11-24 11:50:15 +08:00

335 lines
8.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.

# 数据库初始化脚本说明
## 📋 概述
本目录包含数据库初始化脚本用于Docker容器首次启动时自动初始化数据库。
**基于**: `schoolNewsServ/.bin/mysql/sql/reInit.sh` 的实现逻辑
## 📂 脚本文件
| 文件 | 说明 | 状态 |
|------|------|------|
| `01-init-database.sql` | 创建数据库和初始化标记表 | ✅ 已就绪 |
| `02-create-tables.sql` | 创建所有业务表50+张) | ⚠️ 需准备 |
| `03-init-data.sql` | 导入初始数据(用户、菜单等) | ⚠️ 需准备 |
| `prepare-sql.sh` | 自动准备脚本 | ✅ 已就绪 |
| `数据库初始化指南.md` | 详细说明文档 | ✅ 已就绪 |
## 🚀 快速开始
### 方式1: 使用自动脚本(推荐)
```bash
cd docker/init-db
chmod +x prepare-sql.sh
./prepare-sql.sh
```
脚本会自动:
1. ✅ 从 `schoolNewsServ/.bin/mysql/sql/` 读取所有SQL文件
2. ✅ 合并所有 `createTable*.sql``02-create-tables.sql`
3. ✅ 合并所有 `init*.sql``03-init-data.sql`
4. ✅ 添加Docker环境特定配置爬虫路径等
5. ✅ 生成统计信息
### 方式2: 手动准备
参见 [数据库初始化指南.md](数据库初始化指南.md)
## 📊 脚本执行顺序
MySQL容器会按照文件名的字母顺序自动执行此目录下的`.sql`文件:
```
容器启动
01-init-database.sql
├─ 创建数据库 school_news
└─ 创建初始化标记表 _db_init_status
02-create-tables.sql
├─ 创建用户模块表3+张)
├─ 创建权限模块表10+张)
├─ 创建资源模块表5+张)
├─ 创建学习模块表8+张)
├─ 创建AI模块表5+张)
├─ 创建系统模块表5+张)
├─ 创建成就模块表5+张)
├─ 创建定时任务模块表3+张)
├─ 创建消息模块表3+张)
└─ 创建敏感词模块表1+张)
03-init-data.sql
├─ 导入菜单和权限数据
├─ 导入默认用户和角色
├─ 导入系统配置
└─ 导入Docker环境配置爬虫路径
数据库就绪 ✓
```
## 🎯 初始化特性
### 幂等性设计
所有脚本支持重复执行,不会导致错误:
```sql
-- 表创建使用IF NOT EXISTS
CREATE TABLE IF NOT EXISTS tb_user (...);
-- 数据插入使用INSERT IGNORE
INSERT IGNORE INTO tb_sys_config VALUES (...);
-- 使用_db_init_status表跟踪执行状态
INSERT IGNORE INTO _db_init_status (script_name) VALUES ('02-create-tables.sql');
```
### 避免重复初始化
系统使用 `_db_init_status` 表来跟踪已执行的脚本:
```bash
# 查看已执行的脚本
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
"SELECT * FROM _db_init_status ORDER BY executed_at;"
```
## 🗄️ 数据库结构
### 模块组成
| 模块 | 表数量 | 说明 |
|------|--------|------|
| 用户管理 | 3+ | 用户、部门、角色 |
| 权限管理 | 10+ | 菜单、权限、角色权限映射 |
| 资源管理 | 5+ | 资源、标签、分类、评论 |
| 课程管理 | 3+ | 课程、章节、课件 |
| 学习管理 | 5+ | 学习记录、笔记、错题 |
| 个人中心 | 3+ | 收藏、历史、个人信息 |
| AI智能体 | 5+ | AI对话、知识库 |
| 系统配置 | 5+ | 配置、日志、文件管理 |
| 成就系统 | 5+ | 成就、徽章、等级 |
| 定时任务 | 3+ | 任务、执行记录、元数据 |
| 消息通知 | 3+ | 消息、通知、模板 |
| 敏感词 | 1+ | 敏感词过滤 |
**总计**: 50+ 张表
### 默认数据
#### 默认用户
- **用户名**: admin
- **密码**: admin123
- **角色**: 管理员(拥有所有权限)
#### 系统配置
- `crawler.pythonPath`: /usr/bin/python3
- `crawler.basePath`: /app/crawler
## 🔄 重新初始化
### 完全重新初始化(会删除所有数据)
```bash
# 停止并删除容器和数据卷
cd docker
docker-compose down -v
# 重新启动
docker-compose up -d
```
### 只重置初始化标记
```bash
# 清空标记表,下次重启时重新执行脚本
docker exec school-news-mysql mysql -uroot -p123456 -e \
"TRUNCATE TABLE school_news._db_init_status;"
# 重启MySQL容器
docker-compose restart mysql
```
## 🧪 验证初始化
### 1. 查看初始化日志
```bash
docker logs school-news-mysql 2>&1 | grep -i "init\|sql"
```
### 2. 检查数据库和表
```bash
# 检查数据库
docker exec school-news-mysql mysql -uroot -p123456 -e "SHOW DATABASES;"
# 检查表数量
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
"SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema='school_news';"
# 查看所有表
docker exec school-news-mysql mysql -uroot -p123456 school_news -e "SHOW TABLES;"
```
### 3. 验证默认数据
```bash
# 检查默认用户
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
"SELECT username, nickname, status FROM tb_sys_user WHERE username='admin';"
# 检查系统配置
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
"SELECT config_key, config_value FROM tb_sys_config WHERE config_key LIKE 'crawler.%';"
# 检查菜单数量
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
"SELECT COUNT(*) AS menu_count FROM tb_sys_menu;"
```
### 4. 检查初始化状态
```bash
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
"SELECT script_name, executed_at, status FROM _db_init_status ORDER BY executed_at;"
```
## ⚠️ 注意事项
### 1. SOURCE语句不支持
Docker的mysql镜像**不支持** `SOURCE` 语句需要将所有SQL合并到一个文件
```sql
-- ❌ 不支持
SOURCE createTableUser.sql;
-- ✅ 需要合并
-- 将createTableUser.sql的内容直接复制过来
CREATE TABLE tb_user (...);
```
### 2. 文件执行顺序
文件按字母顺序执行,命名规范:
```
01-xxx.sql (最先执行)
02-xxx.sql (其次执行)
03-xxx.sql (最后执行)
04-xxx.sql (可选:迁移脚本)
```
### 3. 字符集配置
确保使用UTF8MB4字符集
```sql
CREATE TABLE tb_xxx (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
### 4. 安全性
生产环境必须:
- ✅ 修改默认密码
- ✅ 使用强密码策略
- ✅ 限制数据库访问权限
- ✅ 定期备份数据
## 🗂️ 数据持久化
数据库数据持久化在Docker数据卷中
```yaml
volumes:
mysql-data:
driver: local
```
### 查看和管理数据卷
```bash
# 查看所有数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect docker_mysql-data
# 备份数据卷
docker run --rm -v docker_mysql-data:/data -v $(pwd):/backup \
alpine tar czf /backup/mysql-backup.tar.gz /data
# 恢复数据卷
docker run --rm -v docker_mysql-data:/data -v $(pwd):/backup \
alpine tar xzf /backup/mysql-backup.tar.gz -C /
```
## 🐛 故障排查
### 问题1: 脚本未执行
**症状**: 数据库创建了但没有表
**排查**:
```bash
# 查看MySQL日志
docker logs school-news-mysql
# 检查SQL文件
ls -l docker/init-db/*.sql
```
**解决**:
- 确保SQL文件有读权限
- 检查SQL语法是否正确
### 问题2: 初始化失败
**症状**: 容器启动失败或反复重启
**排查**:
```bash
# 查看错误日志
docker logs school-news-mysql 2>&1 | grep -i error
# 进入容器检查
docker exec -it school-news-mysql bash
```
**解决**:
- 检查SQL语法错误
- 确保表之间的依赖关系正确
- 验证数据格式是否正确
### 问题3: 重复执行导致错误
**解决**: 使用幂等性设计
- 使用 `CREATE TABLE IF NOT EXISTS`
- 使用 `INSERT IGNORE`
- 使用 `_db_init_status` 表跟踪
## 📚 相关文档
- [数据库初始化指南](数据库初始化指南.md) - 详细的准备和使用说明
- [reInit.sh](../../schoolNewsServ/.bin/mysql/sql/reInit.sh) - 原始初始化脚本
- [Docker README](../README.md) - Docker部署文档
## 💡 最佳实践
1.**自动化** - 使用 `prepare-sql.sh` 自动准备SQL文件
2.**幂等性** - 确保脚本可以重复执行
3.**版本控制** - SQL文件纳入Git管理注意敏感信息
4.**文档同步** - 表结构变更同步更新SQL文件
5.**定期备份** - 重要数据定期备份
6.**测试验证** - 在测试环境充分验证后再部署生产
---
**更新时间**: 2025-11-24
**基于**: schoolNewsServ/.bin/mysql/sql/reInit.sh v1.1.0