# 数据库迁移 - 手动操作指南

## 问题说明
- 本地无法直接连接到远程数据库（IP 白名单限制）
- SSH 密码认证失败（需要配置 SSH 密钥）
- 配置使用 Docker 容器名 `oneos-mysql`

## 解决方案

### 方案 1：在服务器上手动执行（推荐）

#### 步骤 1：登录服务器
```bash
# 使用密码登录（需要手动输入密码）
ssh root@47.103.115.36
# 密码: Passw0rd2026@ssl
```

#### 步骤 2：上传 SQL 文件
在本地执行：
```bash
# 方式 1：使用 scp（需要手动输入密码）
scp sql/update-2026-03-12-停车场和车型参数模块.sql root@47.103.115.36:/tmp/

# 方式 2：复制文件内容，在服务器上创建
# 复制 sql/update-2026-03-12-停车场和车型参数模块.sql 的内容
# 在服务器上执行：
cat > /tmp/update-asset.sql << 'EOF'
# 粘贴 SQL 内容
EOF
```

#### 步骤 3：在服务器上执行 SQL
```bash
# 登录服务器后执行

# 1. 检查 MySQL 容器
docker ps | grep mysql

# 2. 查看数据库列表
docker exec oneos-mysql mysql -uroot -pPassw0rd2026 -e "SHOW DATABASES;"

# 3. 确认使用哪个数据库（可能是 oneos_system 或其他）
# 根据配置，系统使用多个数据库：
# - oneos_system (系统模块)
# - oneos_infra (基础设施)
# - oneos_bpm (工作流)

# 4. 执行 SQL 脚本（假设使用 oneos_system）
docker exec -i oneos-mysql mysql -uroot -pPassw0rd2026 oneos_system < /tmp/update-2026-03-12-停车场和车型参数模块.sql

# 5. 验证表结构
docker exec oneos-mysql mysql -uroot -pPassw0rd2026 oneos_system -e "SHOW TABLES LIKE 'asset_%';"

# 6. 查看停车场表结构
docker exec oneos-mysql mysql -uroot -pPassw0rd2026 oneos_system -e "DESC asset_parking;"

# 7. 查看车型参数表结构
docker exec oneos-mysql mysql -uroot -pPassw0rd2026 oneos_system -e "DESC asset_vehicle_model;"

# 8. 查看车型维保项目关联表
docker exec oneos-mysql mysql -uroot -pPassw0rd2026 oneos_system -e "DESC asset_vehicle_model_maintain_item;"
```

### 方案 2：配置 SSH 密钥（一次性配置）

#### 步骤 1：生成 SSH 密钥（如果没有）
```bash
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```

#### 步骤 2：复制公钥到服务器
```bash
ssh-copy-id root@47.103.115.36
# 输入密码: Passw0rd2026@ssl
```

#### 步骤 3：测试免密登录
```bash
ssh root@47.103.115.36
```

#### 步骤 4：执行自动化脚本
配置好 SSH 密钥后，可以使用自动化脚本：
```bash
cd /Users/kkfluous/Projects/ai-coding/ln-oneos/oneos-backend

# 上传 SQL
scp sql/update-2026-03-12-停车场和车型参数模块.sql root@47.103.115.36:/tmp/

# 执行 SQL
ssh root@47.103.115.36 "docker exec -i oneos-mysql mysql -uroot -pPassw0rd2026 oneos_system < /tmp/update-2026-03-12-停车场和车型参数模块.sql"

# 验证
ssh root@47.103.115.36 "docker exec oneos-mysql mysql -uroot -pPassw0rd2026 oneos_system -e 'SHOW TABLES LIKE \"asset_%\";'"
```

### 方案 3：使用数据库管理工具

#### 工具选择
- Navicat
- DBeaver
- MySQL Workbench
- DataGrip

#### 连接信息
由于使用 Docker 容器，需要：
1. SSH 隧道连接到服务器
2. 通过 Docker 端口映射访问 MySQL

#### SSH 隧道方式
```bash
# 建立 SSH 隧道
ssh -L 3307:localhost:3306 root@47.103.115.36

# 然后在数据库工具中连接
# Host: localhost
# Port: 3307
# User: root
# Password: Passw0rd2026
# Database: oneos_system
```

## SQL 文件内容

文件位置：`sql/update-2026-03-12-停车场和车型参数模块.sql`

包含内容：
1. 停车场表结构完善（9 个新字段）
2. 车型参数表创建（18 个字段）
3. 车型维保项目关联表创建（9 个字段）

## 验证清单

执行 SQL 后，验证以下内容：

### 1. 表是否创建成功
```sql
SHOW TABLES LIKE 'asset_%';
```
预期结果：
- asset_parking
- asset_vehicle_model
- asset_vehicle_model_maintain_item

### 2. 停车场表字段
```sql
DESC asset_parking;
```
检查是否包含：
- principal（公司负责人）
- contact_name（联系人）
- contact_phone（联系电话）
- parked_amount（已停车辆数）
- stock_area（库存区域）
- unusual_action_city（异动城市）
- longitude（经度）
- latitude（纬度）
- remark（备注）

### 3. 车型参数表字段
```sql
DESC asset_vehicle_model;
```
检查是否包含：
- brand（品牌）
- model（车型）
- model_code（车型编号）
- model_name（车型名称）
- hydrogen_capacity（氢瓶容量）
- reserve_electricity（储电量）
- 等 18 个字段

### 4. 车型维保项目关联表字段
```sql
DESC asset_vehicle_model_maintain_item;
```
检查是否包含：
- vehicle_model_id（车型ID）
- maintain_item（保养项目）
- maintain_content（保养内容）
- materials_expenses（材料费）
- hour_fee（工时费）
- kilometer_cycle（公里周期）
- time_cycle（时间周期）

## 常见问题

### Q1: 找不到数据库
**问题**: `ERROR 1049 (42000): Unknown database 'yudao_asset'`

**解决**: 
- 检查实际使用的数据库名称
- 可能是 `oneos_system`、`oneos_infra` 或其他
- 查看 Nacos 配置确认数据库名

### Q2: 表已存在
**问题**: `ERROR 1050 (42S01): Table 'asset_parking' already exists`

**解决**:
- 如果是 ALTER TABLE 失败，检查字段是否已存在
- 如果是 CREATE TABLE 失败，表示表已创建，跳过即可

### Q3: 权限不足
**问题**: `ERROR 1142 (42000): CREATE command denied`

**解决**:
- 确认使用 root 用户
- 检查密码是否正确
- 确认用户有 CREATE、ALTER 权限

## 下一步

数据库迁移完成后：
1. 启动应用服务
2. 执行 API 测试
3. 验证功能正常

---

**创建时间**: 2026-03-12 01:35
**状态**: 等待手动执行
