335 lines
8.2 KiB
Markdown
335 lines
8.2 KiB
Markdown
# 数据库初始化脚本说明
|
||
|
||
## 📋 概述
|
||
|
||
本目录包含数据库初始化脚本,用于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
|