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