195 lines
5.5 KiB
Markdown
195 lines
5.5 KiB
Markdown
# 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. 服务器操作系统版本
|