Storm_backend/docker/LINUX-MYSQL-FIX.md
2025-09-28 20:42:16 +08:00

5.5 KiB
Raw Blame History

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

# 基础镜像
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;"

📞 技术支持

如果问题仍然存在,请提供以下信息:

  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. 服务器操作系统版本