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

195 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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