Files
schoolNews/docker/init-db
2025-11-24 12:59:51 +08:00
..
2025-11-24 11:50:15 +08:00
2025-11-24 11:50:15 +08:00
2025-11-24 11:50:15 +08:00

数据库初始化脚本说明

📋 概述

本目录包含数据库初始化脚本用于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: 使用自动脚本(推荐)

cd docker/init-db
chmod +x prepare-sql.sh
./prepare-sql.sh

脚本会自动:

  1. schoolNewsServ/.bin/mysql/sql/ 读取所有SQL文件
  2. 合并所有 createTable*.sql02-create-tables.sql
  3. 合并所有 init*.sql03-init-data.sql
  4. 添加Docker环境特定配置爬虫路径等
  5. 生成统计信息

方式2: 手动准备

参见 数据库初始化指南.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环境配置爬虫路径
   ↓
数据库就绪 ✓

🎯 初始化特性

幂等性设计

所有脚本支持重复执行,不会导致错误:

-- 表创建使用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 表来跟踪已执行的脚本:

# 查看已执行的脚本
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

🔄 重新初始化

完全重新初始化(会删除所有数据)

# 停止并删除容器和数据卷
cd docker
docker-compose down -v

# 重新启动
docker-compose up -d

只重置初始化标记

# 清空标记表,下次重启时重新执行脚本
docker exec school-news-mysql mysql -uroot -p123456 -e \
"TRUNCATE TABLE school_news._db_init_status;"

# 重启MySQL容器
docker-compose restart mysql

🧪 验证初始化

1. 查看初始化日志

docker logs school-news-mysql 2>&1 | grep -i "init\|sql"

2. 检查数据库和表

# 检查数据库
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. 验证默认数据

# 检查默认用户
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. 检查初始化状态

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合并到一个文件

-- ❌ 不支持
SOURCE createTableUser.sql;

-- ✅ 需要合并
-- 将createTableUser.sql的内容直接复制过来
CREATE TABLE tb_user (...);

2. 文件执行顺序

文件按字母顺序执行,命名规范:

01-xxx.sql  (最先执行)
02-xxx.sql  (其次执行)
03-xxx.sql  (最后执行)
04-xxx.sql  (可选:迁移脚本)

3. 字符集配置

确保使用UTF8MB4字符集

CREATE TABLE tb_xxx (
    ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

4. 安全性

生产环境必须:

  • 修改默认密码
  • 使用强密码策略
  • 限制数据库访问权限
  • 定期备份数据

🗂️ 数据持久化

数据库数据持久化在Docker数据卷中

volumes:
  mysql-data:
    driver: local

查看和管理数据卷

# 查看所有数据卷
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: 脚本未执行

症状: 数据库创建了但没有表

排查:

# 查看MySQL日志
docker logs school-news-mysql

# 检查SQL文件
ls -l docker/init-db/*.sql

解决:

  • 确保SQL文件有读权限
  • 检查SQL语法是否正确

问题2: 初始化失败

症状: 容器启动失败或反复重启

排查:

# 查看错误日志
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 表跟踪

📚 相关文档

💡 最佳实践

  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