镜像制作

This commit is contained in:
2025-11-24 11:50:15 +08:00
parent 12592c5a24
commit 07bd166257
53 changed files with 3822 additions and 2140 deletions

View File

@@ -0,0 +1,29 @@
-- ========================================
-- 校园新闻管理系统数据库初始化脚本
--
-- 注意:
-- 1. 本脚本仅在数据库首次创建时执行
-- 2. 如果数据库已存在请手动执行或使用02-check-init.sh
-- ========================================
-- 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS school_news
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE school_news;
-- 检查表是否已存在,避免重复初始化
-- 创建一个标记表记录初始化状态
CREATE TABLE IF NOT EXISTS _db_init_status (
id INT PRIMARY KEY AUTO_INCREMENT,
script_name VARCHAR(255) NOT NULL UNIQUE,
executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status VARCHAR(50) DEFAULT 'success'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 记录初始化标记
INSERT IGNORE INTO _db_init_status (script_name) VALUES ('01-init-database.sql');
-- 提示信息
SELECT CONCAT('数据库 school_news 初始化完成。请将您的表结构脚本放在 02-create-tables.sql 中') AS message;

334
docker/init-db/README.md Normal file
View File

@@ -0,0 +1,334 @@
# 数据库初始化脚本说明
## 📋 概述
本目录包含数据库初始化脚本用于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

View File

@@ -0,0 +1,231 @@
#!/bin/bash
##############################################
# 数据库初始化SQL准备脚本
# 功能将SQL文件复制到Docker初始化目录
# 基于schoolNewsServ/.bin/mysql/sql/reInit.sh
##############################################
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 路径定义
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SQL_SOURCE_DIR="../../schoolNewsServ/.bin/mysql/sql"
INIT_DB_DIR="$SCRIPT_DIR"
echo "========================================"
echo "数据库初始化SQL准备"
echo "========================================"
log_info "源SQL目录: $SQL_SOURCE_DIR"
log_info "目标目录: $INIT_DB_DIR"
echo "========================================"
echo ""
# 检查源目录
if [ ! -d "$SQL_SOURCE_DIR" ]; then
log_error "源SQL目录不存在: $SQL_SOURCE_DIR"
exit 1
fi
# 备份现有SQL文件
if ls "$INIT_DB_DIR"/*.sql 1> /dev/null 2>&1; then
log_warn "发现现有SQL文件正在备份..."
BACKUP_DIR="$INIT_DB_DIR/backup_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
mv "$INIT_DB_DIR"/*.sql "$BACKUP_DIR/" 2>/dev/null || true
log_info "已备份到: $BACKUP_DIR"
echo ""
fi
# 创建02-create-tables.sql
log_info "创建表结构脚本: 02-create-tables.sql"
cat > "$INIT_DB_DIR/02-create-tables.sql" << 'EOF'
-- ========================================
-- 校园新闻管理系统 - 表结构创建脚本
-- 自动生成时间: $(date '+%Y-%m-%d %H:%M:%S')
-- 基于: schoolNewsServ/.bin/mysql/sql/
-- ========================================
USE school_news;
-- 检查是否已执行过此脚本
SET @executed = (SELECT COUNT(*) FROM _db_init_status WHERE script_name = '02-create-tables.sql');
-- 如果已执行过,记录并退出
SELECT CASE
WHEN @executed > 0 THEN '表结构已存在,跳过创建'
ELSE '开始创建表结构...'
END AS message;
EOF
# 合并所有createTable*.sql文件
log_info "合并表结构文件..."
TABLE_FILES=(
"createTableUser.sql"
"createTablePermission.sql"
"createTablePermissionControl.sql"
"createTableResource.sql"
"createTableCourse.sql"
"createTableLearning.sql"
"createTableUserCenter.sql"
"createTableAI.sql"
"createTableSystem.sql"
"createTableAchievement.sql"
"createTableCrontab.sql"
"createTableMessage.sql"
"createTableSensitive.sql"
)
for file in "${TABLE_FILES[@]}"; do
if [ -f "$SQL_SOURCE_DIR/$file" ]; then
echo "" >> "$INIT_DB_DIR/02-create-tables.sql"
echo "-- ========================================" >> "$INIT_DB_DIR/02-create-tables.sql"
echo "-- $file" >> "$INIT_DB_DIR/02-create-tables.sql"
echo "-- ========================================" >> "$INIT_DB_DIR/02-create-tables.sql"
cat "$SQL_SOURCE_DIR/$file" >> "$INIT_DB_DIR/02-create-tables.sql"
log_info "$file"
else
log_warn "$file (文件不存在)"
fi
done
# 添加执行状态记录
cat >> "$INIT_DB_DIR/02-create-tables.sql" << 'EOF'
-- 记录执行状态
INSERT IGNORE INTO _db_init_status (script_name)
VALUES ('02-create-tables.sql');
SELECT '表结构创建完成' AS message;
EOF
echo ""
# 创建03-init-data.sql
log_info "创建初始数据脚本: 03-init-data.sql"
cat > "$INIT_DB_DIR/03-init-data.sql" << 'EOF'
-- ========================================
-- 校园新闻管理系统 - 初始数据导入脚本
-- 自动生成时间: $(date '+%Y-%m-%d %H:%M:%S')
-- 基于: schoolNewsServ/.bin/mysql/sql/
-- ========================================
USE school_news;
-- 检查是否已执行过此脚本
SET @executed = (SELECT COUNT(*) FROM _db_init_status WHERE script_name = '03-init-data.sql');
SELECT CASE
WHEN @executed > 0 THEN '初始数据已存在,跳过导入'
ELSE '开始导入初始数据...'
END AS message;
EOF
# 合并初始数据文件
log_info "合并初始数据文件..."
DATA_FILES=(
"initMenuData.sql"
"initAllData.sql"
"initCrontabMetaData.sql"
)
for file in "${DATA_FILES[@]}"; do
if [ -f "$SQL_SOURCE_DIR/$file" ]; then
echo "" >> "$INIT_DB_DIR/03-init-data.sql"
echo "-- ========================================" >> "$INIT_DB_DIR/03-init-data.sql"
echo "-- $file" >> "$INIT_DB_DIR/03-init-data.sql"
echo "-- ========================================" >> "$INIT_DB_DIR/03-init-data.sql"
cat "$SQL_SOURCE_DIR/$file" >> "$INIT_DB_DIR/03-init-data.sql"
log_info "$file"
else
log_warn "$file (文件不存在)"
fi
done
# 添加爬虫配置初始化
cat >> "$INIT_DB_DIR/03-init-data.sql" << 'EOF'
-- ========================================
-- Docker环境爬虫配置
-- ========================================
INSERT IGNORE INTO tb_sys_config (config_key, config_value, config_desc, created_at)
VALUES
('crawler.pythonPath', '/usr/bin/python3', 'Docker容器内Python路径', NOW()),
('crawler.basePath', '/app/crawler', 'Docker容器内爬虫脚本路径', NOW());
-- 记录执行状态
INSERT IGNORE INTO _db_init_status (script_name)
VALUES ('03-init-data.sql');
SELECT '初始数据导入完成' AS message;
SELECT '默认用户: admin, 密码: admin123' AS tip;
EOF
echo ""
# 生成统计信息
log_info "生成文件统计..."
cat > "$INIT_DB_DIR/00-init-summary.txt" << EOF
========================================
数据库初始化脚本准备完成
========================================
生成时间: $(date '+%Y-%m-%d %H:%M:%S')
源目录: $SQL_SOURCE_DIR
生成的文件:
01-init-database.sql - 数据库创建(已存在)
02-create-tables.sql - 表结构创建
03-init-data.sql - 初始数据导入
执行顺序:
1. 创建数据库和初始化标记表
2. 创建所有业务表
3. 导入初始数据(用户、菜单、系统配置等)
默认账户:
用户名: admin
密码: admin123
角色: 管理员
注意事项:
1. 脚本具有幂等性,可以重复执行
2. 使用 _db_init_status 表跟踪执行状态
3. Docker容器启动时自动执行这些脚本
4. 如需重新初始化,删除数据卷: docker-compose down -v
========================================
EOF
echo ""
log_info "========================================"
log_info "准备完成!"
log_info "========================================"
log_info "生成的文件:"
ls -lh "$INIT_DB_DIR"/*.sql 2>/dev/null | awk '{print " " $9 " (" $5 ")"}'
echo ""
log_info "下一步:"
echo " 1. 检查生成的SQL文件"
echo " 2. 运行Docker构建: ./build.sh"
echo " 3. 启动服务: cd docker && docker-compose up -d"
log_info "========================================"

View File

@@ -0,0 +1,372 @@
# Docker环境数据库初始化指南
## 📋 概述
本指南说明如何为Docker环境准备数据库初始化脚本参考 `schoolNewsServ/.bin/mysql/sql/reInit.sh` 的实现。
## 🎯 初始化流程
### MySQL容器启动流程
```
Docker容器启动
执行 /docker-entrypoint-initdb.d/ 中的脚本(按字母顺序)
01-init-database.sql → 创建数据库和初始化标记表
02-create-tables.sql → 创建所有业务表
03-init-data.sql → 导入初始数据
数据库就绪
```
## 📂 文件说明
### 现有文件
| 文件 | 说明 | 状态 |
|------|------|------|
| `01-init-database.sql` | 创建数据库和_db_init_status表 | ✅ 已存在 |
| `README.md` | 数据库初始化说明 | ✅ 已存在 |
### 需要准备的文件
| 文件 | 说明 | 来源 |
|------|------|------|
| `02-create-tables.sql` | 所有表结构 | 从 createTable*.sql 合并 |
| `03-init-data.sql` | 初始数据 | 从 init*.sql 合并 |
## 🔧 准备方法
### 方式1: 使用自动脚本(推荐)
```bash
cd docker/init-db
chmod +x prepare-sql.sh
./prepare-sql.sh
```
脚本会自动:
1. 备份现有SQL文件
2. 合并所有createTable*.sql到02-create-tables.sql
3. 合并所有init*.sql到03-init-data.sql
4. 添加Docker特定配置爬虫路径等
5. 生成统计信息
### 方式2: 手动复制
#### 步骤1: 准备表结构
```bash
cd schoolNewsServ/.bin/mysql/sql
# 合并所有createTable*.sql
cat createTableUser.sql \
createTablePermission.sql \
createTablePermissionControl.sql \
createTableResource.sql \
createTableCourse.sql \
createTableLearning.sql \
createTableUserCenter.sql \
createTableAI.sql \
createTableSystem.sql \
createTableAchievement.sql \
createTableCrontab.sql \
createTableMessage.sql \
createTableSensitive.sql \
> ../../docker/init-db/02-create-tables.sql
```
#### 步骤2: 准备初始数据
```bash
# 合并所有init*.sql
cat initMenuData.sql \
initAllData.sql \
initCrontabMetaData.sql \
> ../../docker/init-db/03-init-data.sql
```
#### 步骤3: 添加Docker配置
`03-init-data.sql` 末尾添加:
```sql
-- Docker环境爬虫配置
INSERT IGNORE INTO tb_sys_config (config_key, config_value, config_desc, created_at)
VALUES
('crawler.pythonPath', '/usr/bin/python3', 'Docker容器内Python路径', NOW()),
('crawler.basePath', '/app/crawler', 'Docker容器内爬虫脚本路径', NOW());
```
## 🔍 脚本内容说明
### initAll.sql 结构
基于 `schoolNewsServ/.bin/mysql/sql/initAll.sql`:
```sql
-- 1. 创建数据库
SOURCE createDB.sql;
-- 2-14. 创建各模块表
SOURCE createTableUser.sql;
SOURCE createTablePermission.sql;
SOURCE createTablePermissionControl.sql;
SOURCE createTableResource.sql;
SOURCE createTableCourse.sql;
SOURCE createTableLearning.sql;
SOURCE createTableUserCenter.sql;
SOURCE createTableAI.sql;
SOURCE createTableSystem.sql;
SOURCE createTableAchievement.sql;
SOURCE createTableCrontab.sql;
SOURCE createTableMessage.sql;
SOURCE createTableSensitive.sql;
-- 15-17. 插入初始数据
SOURCE initMenuData.sql;
SOURCE initAllData.sql;
SOURCE initCrontabMetaData.sql;
```
### 各模块说明
| 模块 | 表数量 | 说明 |
|------|--------|------|
| User | 3+ | 用户、部门、角色 |
| Permission | 10+ | 菜单、权限、角色权限 |
| Resource | 5+ | 资源、标签、分类 |
| Course | 3+ | 课程、章节、课件 |
| Learning | 5+ | 学习记录、笔记 |
| UserCenter | 3+ | 个人中心、收藏、评论 |
| AI | 5+ | AI智能体、对话 |
| System | 5+ | 系统配置、日志 |
| Achievement | 5+ | 成就系统 |
| Crontab | 3+ | 定时任务 |
| Message | 3+ | 消息通知 |
| Sensitive | 1+ | 敏感词 |
## ⚠️ 重要注意事项
### 1. SOURCE语句不支持
Docker的mysql镜像初始化**不支持** `SOURCE` 语句:
```sql
-- ❌ 不支持
SOURCE createTableUser.sql;
-- ✅ 需要合并成一个文件
-- 将所有SQL内容直接写入
CREATE TABLE tb_user (...);
CREATE TABLE tb_role (...);
```
### 2. 幂等性设计
确保脚本可以重复执行:
```sql
-- 使用IF NOT EXISTS
CREATE TABLE IF NOT EXISTS tb_user (...);
-- 使用INSERT IGNORE
INSERT IGNORE INTO tb_sys_config VALUES (...);
-- 检查执行状态
SET @executed = (SELECT COUNT(*) FROM _db_init_status WHERE script_name = '02-create-tables.sql');
```
### 3. 执行顺序
文件按字母顺序执行,因此命名很重要:
```
01-init-database.sql (首先执行)
02-create-tables.sql (其次执行)
03-init-data.sql (最后执行)
```
### 4. 字符集配置
确保使用UTF-8MB4
```sql
CREATE TABLE tb_xxx (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
## 🧪 测试验证
### 1. 检查SQL文件
```bash
# 查看文件大小
ls -lh docker/init-db/*.sql
# 检查SQL语法
cd docker/init-db
mysql --help | grep "Default options"
```
### 2. 本地测试
```bash
# 在本地MySQL测试
mysql -uroot -p123456 < docker/init-db/01-init-database.sql
mysql -uroot -p123456 < docker/init-db/02-create-tables.sql
mysql -uroot -p123456 < docker/init-db/03-init-data.sql
```
### 3. Docker环境测试
```bash
# 删除旧数据
docker-compose down -v
# 启动MySQL
docker-compose up -d mysql
# 查看初始化日志
docker logs school-news-mysql 2>&1 | grep -E "init|sql"
# 检查数据库
docker exec school-news-mysql mysql -uroot -p123456 -e "SHOW DATABASES;"
docker exec school-news-mysql mysql -uroot -p123456 school_news -e "SHOW TABLES;"
# 检查默认用户
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
"SELECT username, nickname FROM tb_sys_user WHERE username='admin';"
```
### 4. 验证初始化状态
```bash
# 查看初始化记录
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
"SELECT * FROM _db_init_status ORDER BY executed_at;"
# 统计表数量
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';"
```
## 🔄 更新数据库结构
### 场景1: 本地开发添加了新表
1.`schoolNewsServ/.bin/mysql/sql/` 中创建SQL文件
2. 更新 `initAll.sql` 添加SOURCE语句
3. 重新运行 `prepare-sql.sh`
4. 重新构建Docker镜像
### 场景2: 修改现有表结构
1. 创建迁移脚本 `04-migration-xxx.sql`
2. 放入 `docker/init-db/` 目录
3. 脚本会自动执行(按字母顺序)
示例迁移脚本:
```sql
-- 04-migration-add-column.sql
USE school_news;
-- 检查是否已执行
SET @executed = (SELECT COUNT(*) FROM _db_init_status WHERE script_name = '04-migration-add-column.sql');
-- 添加新列
ALTER TABLE tb_user ADD COLUMN IF NOT EXISTS new_column VARCHAR(255);
-- 记录执行
INSERT IGNORE INTO _db_init_status (script_name) VALUES ('04-migration-add-column.sql');
```
## 📊 默认数据说明
### 默认用户
| 用户名 | 密码 | 角色 | 说明 |
|--------|------|------|------|
| admin | admin123 | 管理员 | 超级管理员账号 |
### 默认角色
| 角色 | 说明 |
|------|------|
| admin | 管理员,拥有所有权限 |
| freedom | 自由角色,基础权限 |
### 默认部门
| 部门 | 说明 |
|------|------|
| root_department | 超级部门 |
| default_department | 默认部门 |
### 系统配置
| 配置项 | 值 | 说明 |
|--------|-----|------|
| crawler.pythonPath | /usr/bin/python3 | Python路径 |
| crawler.basePath | /app/crawler | 爬虫脚本路径 |
## 🛠️ 故障排查
### 问题1: 初始化脚本未执行
**症状**: 数据库创建了但表不存在
**排查**:
```bash
# 查看MySQL日志
docker logs school-news-mysql
# 检查脚本权限
ls -l docker/init-db/*.sql
```
**解决**: 确保SQL文件有读权限
### 问题2: SQL语法错误
**症状**: 容器启动失败
**排查**:
```bash
# 查看详细错误
docker logs school-news-mysql 2>&1 | grep ERROR
```
**解决**: 检查SQL语法在本地测试
### 问题3: 重复执行导致错误
**症状**: 主键冲突等错误
**解决**: 使用幂等设计
```sql
-- 使用INSERT IGNORE
INSERT IGNORE INTO ...
-- 使用ON DUPLICATE KEY UPDATE
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
-- 检查执行状态
IF NOT EXISTS (SELECT ...)
```
## 📚 相关文档
- [数据库初始化README](README.md)
- [reInit.sh源文件](../../schoolNewsServ/.bin/mysql/sql/reInit.sh)
- [MySQL Docker文档](https://hub.docker.com/_/mysql)
---
**更新时间**: 2025-11-24
**基于**: schoolNewsServ/.bin/mysql/sql/reInit.sh