5.5 KiB
5.5 KiB
Linux服务器MySQL容器多数据库修复指南
🔍 问题分析
在Linux服务器上,MySQL容器的初始化脚本执行顺序可能不稳定,导致只创建了一个数据库。这是因为:
- 文件执行顺序不确定:MySQL容器会按文件名排序执行SQL文件
- 数据库创建冲突:多个SQL文件可能同时尝试创建数据库
- 字符集设置问题:不同文件的字符集设置可能冲突
🛠️ 解决方案
方案一:使用编号的初始化脚本(推荐)
我已经为你创建了以下文件,确保按正确顺序执行:
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:
# 基础镜像
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. 清理现有容器和数据
# 停止所有服务
docker-compose down
# 删除MySQL数据卷(重要!)
docker volume rm storm_mysql_data
# 或者删除整个数据目录
sudo rm -rf ./mysql/data/*
2. 重新构建MySQL容器
# 重新构建MySQL镜像
docker-compose build storm-mysql
# 启动MySQL服务
docker-compose up -d storm-mysql
3. 等待初始化完成
# 查看MySQL容器日志
docker-compose logs -f storm-mysql
# 等待看到 "ready for connections" 消息
4. 验证数据库创建
# 连接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. 检查每个数据库的表
# 检查 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:仍然只创建一个数据库
解决方案:
# 检查文件权限
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:字符集问题
解决方案:
# 检查数据库字符集
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:表结构不完整
解决方案:
# 检查每个数据库的表数量
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)
- 应用程序能正常连接各个数据库
- 数据导入成功
🔄 完全重新初始化
如果问题仍然存在,执行完全重新初始化:
# 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;"
📞 技术支持
如果问题仍然存在,请提供以下信息:
- MySQL容器日志:
docker-compose logs storm-mysql
- 数据库列表:
docker exec -it storm-mysql mysql -u root -p123456 -e "SHOW DATABASES;"
- 文件列表:
ls -la mysql/db/
- 服务器操作系统版本