# Linux服务器MySQL容器多数据库修复指南 ## 🔍 问题分析 在Linux服务器上,MySQL容器的初始化脚本执行顺序可能不稳定,导致只创建了一个数据库。这是因为: 1. **文件执行顺序不确定**:MySQL容器会按文件名排序执行SQL文件 2. **数据库创建冲突**:多个SQL文件可能同时尝试创建数据库 3. **字符集设置问题**:不同文件的字符集设置可能冲突 ## 🛠️ 解决方案 ### 方案一:使用编号的初始化脚本(推荐) 我已经为你创建了以下文件,确保按正确顺序执行: ``` mysql/db/ ├── 00-init-all-databases.sql # 全局初始化 ├── 01-init-storm-database.sql # 创建 storm 数据库 ├── 02-init-storm-config-database.sql # 创建 storm-config 数据库 ├── 03-init-storm-device-database.sql # 创建 storm-device 数据库 ├── dump-storm-202509032128.sql # storm 表结构 ├── dump-storm-config-202509041019.sql # storm-config 表结构 └── dump-storm-device-202509032130.sql # storm-device 表结构 ``` ### 方案二:修改MySQL Dockerfile 如果方案一不行,可以修改MySQL Dockerfile: ```dockerfile # 基础镜像 FROM mysql:5.7 # 复制初始化脚本 COPY ./db/00-init-all-databases.sql /docker-entrypoint-initdb.d/00-init-all-databases.sql COPY ./db/01-init-storm-database.sql /docker-entrypoint-initdb.d/01-init-storm-database.sql COPY ./db/02-init-storm-config-database.sql /docker-entrypoint-initdb.d/02-init-storm-config-database.sql COPY ./db/03-init-storm-device-database.sql /docker-entrypoint-initdb.d/03-init-storm-device-database.sql COPY ./db/dump-storm-202509032128.sql /docker-entrypoint-initdb.d/04-dump-storm.sql COPY ./db/dump-storm-config-202509041019.sql /docker-entrypoint-initdb.d/05-dump-storm-config.sql COPY ./db/dump-storm-device-202509032130.sql /docker-entrypoint-initdb.d/06-dump-storm-device.sql ``` ## 🚀 部署步骤 ### 1. 清理现有容器和数据 ```bash # 停止所有服务 docker-compose down # 删除MySQL数据卷(重要!) docker volume rm storm_mysql_data # 或者删除整个数据目录 sudo rm -rf ./mysql/data/* ``` ### 2. 重新构建MySQL容器 ```bash # 重新构建MySQL镜像 docker-compose build storm-mysql # 启动MySQL服务 docker-compose up -d storm-mysql ``` ### 3. 等待初始化完成 ```bash # 查看MySQL容器日志 docker-compose logs -f storm-mysql # 等待看到 "ready for connections" 消息 ``` ### 4. 验证数据库创建 ```bash # 连接MySQL检查数据库 docker exec -it storm-mysql mysql -u root -p123456 -e "SHOW DATABASES;" # 应该看到三个数据库: # +--------------------+ # | Database | # +--------------------+ # | information_schema | # | mysql | # | performance_schema | # | storm | # | storm-config | # | storm-device | # | sys | # +--------------------+ ``` ### 5. 检查每个数据库的表 ```bash # 检查 storm 数据库 docker exec -it storm-mysql mysql -u root -p123456 -e "USE storm; SHOW TABLES;" # 检查 storm-config 数据库 docker exec -it storm-mysql mysql -u root -p123456 -e "USE \`storm-config\`; SHOW TABLES;" # 检查 storm-device 数据库 docker exec -it storm-mysql mysql -u root -p123456 -e "USE \`storm-device\`; SHOW TABLES;" ``` ## 🔧 故障排除 ### 问题1:仍然只创建一个数据库 **解决方案**: ```bash # 检查文件权限 ls -la mysql/db/ # 确保所有SQL文件都有执行权限 chmod 644 mysql/db/*.sql # 重新构建容器 docker-compose down docker-compose build --no-cache storm-mysql docker-compose up -d storm-mysql ``` ### 问题2:数据库名称包含特殊字符 **解决方案**: - 在SQL中使用反引号:`` `storm-config` `` - 在应用程序连接时也要使用反引号 ### 问题3:字符集问题 **解决方案**: ```bash # 检查数据库字符集 docker exec -it storm-mysql mysql -u root -p123456 -e " SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME IN ('storm', 'storm-config', 'storm-device');" ``` ### 问题4:表结构不完整 **解决方案**: ```bash # 检查每个数据库的表数量 docker exec -it storm-mysql mysql -u root -p123456 -e " SELECT TABLE_SCHEMA as 'Database', COUNT(*) as 'Table Count' FROM information_schema.TABLES WHERE TABLE_SCHEMA IN ('storm', 'storm-config', 'storm-device') GROUP BY TABLE_SCHEMA;" ``` ## 📋 验证清单 部署完成后,请确认: - [ ] 三个数据库都已创建:`storm`, `storm-config`, `storm-device` - [ ] 每个数据库都包含相应的表 - [ ] 字符集设置正确(utf8mb4) - [ ] 应用程序能正常连接各个数据库 - [ ] 数据导入成功 ## 🔄 完全重新初始化 如果问题仍然存在,执行完全重新初始化: ```bash # 1. 停止所有服务 docker-compose down # 2. 删除所有相关容器和卷 docker-compose rm -f docker volume prune -f # 3. 删除MySQL数据目录 sudo rm -rf ./mysql/data/* # 4. 重新构建并启动 docker-compose build --no-cache docker-compose up -d # 5. 等待初始化完成 sleep 60 # 6. 验证结果 docker exec -it storm-mysql mysql -u root -p123456 -e "SHOW DATABASES;" ``` ## 📞 技术支持 如果问题仍然存在,请提供以下信息: 1. MySQL容器日志:`docker-compose logs storm-mysql` 2. 数据库列表:`docker exec -it storm-mysql mysql -u root -p123456 -e "SHOW DATABASES;"` 3. 文件列表:`ls -la mysql/db/` 4. 服务器操作系统版本