# QAUP 数据导出导入指南

## 概述

本指南介绍如何从现有 QAUP 数据库导出数据，并在新环境中导入这些数据。我们采用分层数据管理策略，将数据分为不同类别，以便灵活管理。

## 数据分类

### 1. 系统基础配置数据（必需）
- **包含表**: `sys_config`, `sys_dict_type`, `sys_dict_data`, `sys_dept`, `sys_post`, `sys_role`, `sys_menu`, `sys_user`, `sys_user_role`, `sys_user_post`, `sys_role_menu`, `sys_role_dept`, `sys_notice`
- **用途**: 系统运行的基础配置，包括菜单、角色、权限等
- **特点**: 必须导入，否则系统无法正常运行

### 2. 业务基础数据（推荐）
- **包含表**: `sys_vehicle_type`, `airport_areas`, `spatial_rules`, `spatial_rule_vehicle_types`, `transport_routes`
- **用途**: 业务配置数据，如车辆类型、机场区域、空间规则等
- **特点**: 建议导入，包含实际业务配置

### 3. 示例数据（可选）
- **包含表**: `sys_vehicle_info`
- **用途**: 示例车辆信息，用于演示和测试
- **特点**: 可选导入，生产环境可能不需要

### 4. 实时数据（不导出）
- **包含表**: `vehicle_locations`, `vehicle_trajectories`, `vehicle_commands`, `geofence_events`, `uv_violation_events`, `sys_logininfor`, `sys_oper_log`, `sys_job_log` 等
- **用途**: 实时运行数据、日志等
- **特点**: 不导出，新环境启动后自动生成

## 数据导出

### 前提条件
- 安装 PostgreSQL 客户端工具（包含 `pg_dump`）
- 能够连接到现有的 QAUP 数据库
- 有足够的磁盘空间存储导出文件

### 导出步骤

#### 1. 设置环境变量
```bash
export DB_HOST=localhost          # 数据库主机
export DB_PORT=5432              # 数据库端口
export DB_NAME=qaup              # 数据库名称
export DB_USER=postgres          # 数据库用户
export EXPORT_DIR=./export       # 导出目录
```

#### 2. 执行导出（推荐方式）
```bash
cd deploy/docker/postgres
./db-manager.sh export-initial
```

这将生成以下文件：
- `01_system_data.sql` - 系统基础配置数据
- `02_business_data.sql` - 业务基础数据
- `03_sample_data.sql` - 示例数据
- `initial_data_complete.sql` - 合并的完整初始数据文件

#### 3. 其他导出选项
```bash
# 导出分层初始数据（推荐）
./db-manager.sh export-initial

# 导出完整数据库
./db-manager.sh export-all

# 仅导出表结构
./db-manager.sh export-schema

# 数据库备份
./db-manager.sh backup
```

## 数据导入

### 方法一：使用合并文件（推荐）
1. 将 `initial_data_complete.sql` 复制到 `deploy/docker/postgres/initial_data.sql`
2. 启动 Docker 容器，数据会自动导入

```bash
cp export/initial_data_complete.sql deploy/docker/postgres/initial_data.sql
./deploy.sh install
```

### 方法二：分层导入
如果需要选择性导入，可以分别处理各层数据：

```bash
# 1. 复制系统基础数据（必需）
cp export/01_system_data.sql deploy/docker/postgres/initial_data.sql

# 2. 可选：追加业务数据
cat export/02_business_data.sql >> deploy/docker/postgres/initial_data.sql

# 3. 可选：追加示例数据
cat export/03_sample_data.sql >> deploy/docker/postgres/initial_data.sql

# 4. 启动容器
./deploy.sh install
```

### 方法三：手动导入
如果容器已经运行，可以手动导入数据：

```bash
# 进入数据库容器
docker exec -it qaup-postgres psql -U postgres -d qaup

# 在容器内执行
\i /docker-entrypoint-initdb.d/initial_data.sql
```

## 验证导入

### 1. 检查表数据
```sql
-- 检查用户表
SELECT COUNT(*) FROM sys_user;

-- 检查菜单表
SELECT COUNT(*) FROM sys_menu;

-- 检查车辆类型表
SELECT COUNT(*) FROM sys_vehicle_type;

-- 检查机场区域表
SELECT COUNT(*) FROM airport_areas;
```

### 2. 测试登录
- 使用导出的管理员账号登录系统
- 检查菜单和权限是否正确显示
- 验证业务功能是否正常

## 注意事项

### 1. 密码处理
- 导出的用户密码是加密的，可以直接使用
- 如果需要重置密码，请在系统中操作

### 2. 序列值
- 导出脚本会自动更新序列值
- 确保新插入的数据不会产生主键冲突

### 3. 外键约束
- 导入时会临时禁用触发器
- 导入完成后会重新启用

### 4. 数据一致性
- 建议在业务低峰期进行导出
- 确保导出过程中数据不被修改

## 故障排除

### 1. 连接失败
```bash
# 检查数据库连接
pg_isready -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME
```

### 2. 权限问题
```bash
# 确保用户有足够权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO your_user;
```

### 3. 导入失败
- 检查 SQL 文件语法
- 查看 PostgreSQL 日志
- 确认表结构已正确创建

### 4. 数据不完整
- 检查导出日志
- 验证源数据库数据完整性
- 重新执行导出过程

## 最佳实践

1. **定期备份**: 建议定期导出数据作为备份
2. **版本控制**: 将初始数据文件纳入版本控制
3. **环境隔离**: 不同环境使用不同的数据集
4. **测试验证**: 在测试环境先验证导入过程
5. **文档更新**: 及时更新数据结构变更文档

## 自动化脚本

可以创建自动化脚本定期导出数据：

```bash
#!/bin/bash
# auto-export.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="./backups/$DATE"

mkdir -p "$BACKUP_DIR"
export EXPORT_DIR="$BACKUP_DIR"

./export-data.sh -i

echo "数据导出完成: $BACKUP_DIR"
```

这样可以确保始终有最新的数据备份可用于新环境部署。