huawei-cloud-dws-migration-teradata-to-dws · git:20260929.dbb1d02 · 2026-09-29 · sha256 d6a5da63a2adf0e2

huawei-cloud-dws-migration-teradata-to-dws git:20260929.dbb1d02A

Immutable. This exact content never changes and is served at /api/v1/blob/d6a5da63a2adf0e2.

---
name: huawei-cloud-dws-migration-teradata-to-dws
description: |
  Teradata 到华为云 DWS(数据仓库服务)的全流程迁移 skill。严格遵循源端 Teradata 只读、
  Teradata→DWS 数据类型映射、先迁移表结构(DDL)后迁移数据(DML)、OBS 临时目录导出、
  COPY 命令批量导入等核心规则。包含迁移前预检(pre_migration_check)、表结构迁移(migrate_schema)、
  PPI 分区表转换(ppi_converter)、视图/宏/存储过程迁移(migrate_views_procs)、
  数据迁移(migrate_data)与迁移验证(validate_migration)等完整工具链。
  Applicable when users need to migrate Teradata databases to Huawei Cloud DWS,
  convert Teradata schema/data types to DWS, or move TD workloads to GaussDB DWS.
  触发词:"Teradata迁移"、"迁移到DWS"、"Teradata to DWS"、"TD迁移"、"DWS迁移"、
  "Teradata转DWS"、"迁移Teradata"、"TD到DWS"、"Migrate Teradata"、"Teradata to GaussDB"、"migrate to DWS"
tags: [huawei-cloud, dws, teradata, migration, data-warehouse]
---

# Teradata to DWS Migration Skill

## 概述

本 skill 用于将 Teradata 数据库迁移到华为云 DWS(数据仓库服务)。迁移过程严格遵循以下核心规则:

1. **禁止在源端 Teradata 进行任何写操作** — 所有对源端的访问均为只读
2. **遵循 Teradata 到 DWS 的数据类型映射规则** — 参考 https://support.huaweicloud.com/migration-dws/dws_15_0131.html
3. **迁移分为两大步骤** — 先迁移表结构(DDL),后迁移表数据(DML)
4. **重复表需用户确认** — 发现 DWS 中已存在的表时,列出并询问用户确认后才删除重建
5. **OBS 临时目录** — 数据导出到 OBS 而非本地磁盘,避免磁盘容量问题
6. **COPY 命令批量导入** — 使用 COPY 命令替代逐行 INSERT,性能提升 10-100 倍,支持 TB 级数据

## 迁移流程

```
Step 0   迁移前预检     pre_migration_check.py  网络/源端/目标端/业务影响/时间预估(全部只读)
  ↓
Step 1   表结构 DDL    migrate_schema.py       只读提取 DDL → 数据类型映射 → PPI 分区转换(ppi_converter)
                                                  → 生成 DWS DDL → 重复表确认 → 建表
  ↓
Step 2   表数据 DML    migrate_data.py         CSV/OBS 临时目录导出 → 实时进度 → COPY/OBS 外表导入 → 校验
  ↓
Step 2.5 视图/宏/过程  migrate_views_procs.py  提取(SHOW VIEW/MACRO/PROCEDURE) → SQL 语法转换 → DWS 重建
  ↓
Step 3   数据校验       validate_migration.py   表数/行数/列/聚合/抽样/TIMESTAMP 精确值比对
  ↓
Step 3.5 功能性校验     validate_functional.py  宏/存储过程/视图调用与结果比对
```

## 使用前提

### 环境要求

- Python 3.8+
- Teradata ODBC 驱动 或 teradatasql Python 包
- DWS gsql 客户端 或 psycopg2 Python 包
- (可选)DSC 工具 — 用于 SQL 脚本迁移,需 JDK 1.8+
- (可选)obsutil — 用于通过 OBS 中转导入数据

### 安装依赖

```bash
pip3 install teradatasql psycopg2-binary
```

### 配置文件

在使用前,需要准备以下配置文件:

1. **Teradata 连接配置** — 参考 `config/teradata_config_template.ini`
2. **DWS 连接配置** — 参考 `config/dws_config_template.ini`
3. **迁移配置文件**(视图/宏/存储过程迁移与功能性校验使用)— 参考模板 `config/migration_config_template.yaml`,复制为 `config/migration_config.yaml` 并填写 Teradata/DWS 连接信息(含 `source_database`、目标 `schema` 等字段),格式说明见下文「迁移配置文件(migration_config.yaml)」

### 迁移配置文件(migration_config.yaml)

`migrate_views_procs.py`(Step 2.5)与 `validate_functional.py`(Step 3.5)通过 `--config config/migration_config.yaml` 读取 Teradata/DWS 连接信息。该文件不在 skill 包内随附,需从模板创建:

```bash
cp config/migration_config_template.yaml config/migration_config.yaml
# 编辑 config/migration_config.yaml 填写实际连接信息
```

**格式说明**(YAML,字段说明见模板内注释):

```yaml
teradata:
  host: <teradata_host>          # Teradata 主机地址
  port: 1025                     # Teradata 端口(默认 1025)
  user: <td_user>                # Teradata 只读账号
  password: <td_password>        # 或通过环境变量 TD_PASSWORD 注入
  database: DBC                  # 连接数据库(默认 DBC)
  logmech: TD2                   # 登录机制(默认 TD2)
  source_database: <source_db>   # 待迁移的源数据库名(必填)
dws:
  host: <dws_host>               # DWS 集群连接端点
  port: 25308                    # DWS 端口(默认 25308)
  database: <dws_database>       # DWS 数据库名
  user: <dws_user>               # DWS 账号
  password: <dws_password>       # 或通过环境变量 DWS_PASSWORD 注入
  schema: public                 # 目标 Schema(默认 public)
  target_schema: public          # target_schema 优先于 schema 用于目标表
```

**密码注入**:`migrate_views_procs.py` 要求配置文件中必须填写 `password` 字段;`validate_functional.py` 支持密码留空并回退读取 `TD_PASSWORD` / `DWS_PASSWORD` 环境变量。为安全起见,可优先通过环境变量注入密码(`validate_functional.py` 场景),避免明文落盘。

## 使用方法

### 迁移前预检(推荐先执行)

```bash
python3 scripts/pre_migration_check.py \
    --td-config config/teradata_config.ini \
    --dws-config config/dws_config.ini \
    --schema <schema_name> \
    --output-dir ./output
```

预检内容包括:
- **网络连通性**:源端 Teradata 和目标端 DWS 端口可达性
- **源端 Teradata**:连接测试、活跃会话数、运行中查询、CPU 使用率、数据量预估
- **目标端 DWS**:连接测试、集群版本、连接数、存储空间、Schema 存在性、节点状态
- **业务影响评估**:根据源端负载评估迁移风险等级(低/中/高),给出建议
- **迁移时间预估**:按 direct/csv/obs 三种方式估算迁移耗时

预检报告保存为 JSON 文件 `{schema}_pre_migration_check.json`。

### 完整迁移(预检 + 表结构 + 表数据 + 校验)

```bash
# Step 0: 预检
python3 scripts/pre_migration_check.py --td-config config/teradata_config.ini --dws-config config/dws_config.ini --schema <schema_name>

# Step 1: 迁移表结构
python3 scripts/migrate_schema.py --td-config config/teradata_config.ini --dws-config config/dws_config.ini --schema <schema_name>

# Step 2: 迁移表数据
python3 scripts/migrate_data.py --td-config config/teradata_config.ini --dws-config config/dws_config.ini --schema <schema_name> \
    --truncate-before-import --timezone-adjust --source-tz UTC-4 --target-tz UTC+8

# Step 2.5: 迁移视图/宏/存储过程
cp config/migration_config_template.yaml config/migration_config.yaml  # 首次使用:从模板创建迁移配置
python3 scripts/migrate_views_procs.py --config config/migration_config.yaml --types views,macros,procedures

# Step 3: 校验验证(含 TIMESTAMP 精确值比对)
python3 scripts/validate_migration.py --td-config config/teradata_config.ini --dws-config config/dws_config.ini --schema <schema_name> \
    --checks table_count row_count columns aggregate sampling timestamp_check \
    --timezone-adjust --source-tz UTC-4 --target-tz UTC+8

# Step 3.5: 功能性校验(宏/存储过程/视图)
python3 scripts/validate_functional.py --config config/migration_config.yaml \
    --output functional_validation_report.json
```

### 功能性校验(Step 3.5)

在数据校验通过后,对迁移的宏、存储过程、视图进行功能性验证:

可通过命令行参数直接指定连接信息(密码一律通过环境变量注入,不写在命令行):

```bash
export TD_PASSWORD=<teradata-密码>
export DWS_PASSWORD=<dws-密码>

python3 scripts/validate_functional.py \
    --td-host <td_host> --td-user <td_user> \
    --td-database <td_database> \
    --dws-host <dws_host> --dws-port <dws_port> \
    --dws-db <dws_db> --dws-user <dws_user> \
    --dws-schema public \
    --output functional_validation_report.json
```

**校验内容**:

| 对象类型 | TD 端调用方式 | DWS 端调用方式 | 比较方式 |
|---------|-------------|--------------|---------|
| 宏 (Macro) | `EXEC macro_name()` | `SELECT * FROM func() AS (col_def)` | 行数 + 前20行数据排序比对 |
| 存储过程 | `CALL proc_name()` | `CALL proc_name()`(事务回滚) | 行数比较 / 执行不报错 |
| 视图 | `SELECT * FROM view` | `SELECT * FROM view` | 行数 + 前20行数据排序比对 |

**关键设计**:

- **宏列类型自动推断**:DWS `SETOF record` 函数调用需提供列定义列表,脚本通过 `pg_attribute` 自动推断返回列类型
- **写操作安全**:写操作存储过程在 DWS 端用事务执行后自动 `ROLLBACK`,不污染数据
- **带参数宏支持**:通过 `--macro-params` JSON 文件指定测试参数值
- **非确定性差异处理**:ROW_NUMBER() tie-breaking 等非确定性问题,比较时关注业务关键字段一致性

**校验报告**:JSON 格式,包含每个对象的校验状态、行数、匹配结果和错误信息

### 仅迁移表结构

```bash
python3 scripts/migrate_schema.py --td-config config/teradata_config.ini --dws-config config/dws_config.ini --schema <schema_name> --output-dir ./output
```

**重复表处理**:执行 DDL 前,脚本会检查 DWS 中已存在的表。如果发现重复表,将列出所有重复表及其行数,并等待用户输入 `yes` 确认后才删除重建。输入 `no` 则跳过这些表。

### 仅迁移表数据

#### 方式 1: CSV 中转(默认,适合中等表)

```bash
python3 scripts/migrate_data.py \
    --td-config config/teradata_config.ini \
    --dws-config config/dws_config.ini \
    --schema <schema_name> \
    --database <td_database> \
    --method csv \
    --truncate-before-import \
    --timezone-adjust --source-tz UTC-4 --target-tz UTC+8
```

使用 COPY 命令批量导入,比逐行 INSERT 快 10-100 倍。

**新增选项**:
- `--truncate-before-import`:导入前自动清空目标表数据,避免重复导入导致数据翻倍
- `--timezone-adjust`:启用 TIMESTAMP 时区转换(自动偏移 TIMESTAMP 列值)
- `--source-tz` / `--target-tz`:指定源端/目标端时区(默认 UTC-4 / UTC+8)

#### 方式 2: OBS 外表并行导入(适合大表/TB级)

```bash
python3 scripts/migrate_data.py \
    --td-config config/teradata_config.ini \
    --dws-config config/dws_config.ini \
    --schema <schema_name> \
    --database <td_database> \
    --method obs \
    --obs-config config/obs_config.ini \
    --obs-temp-dir migration/temp/<schema_name>
```

**OBS 临时目录**:CSV 数据导出到 OBS 而非本地磁盘,避免磁盘容量问题。脚本会显示 OBS 临时路径:
```
☁️ OBS 临时目录: obs://<bucket>/migration/temp/<schema_name>
   CSV 数据将导出到此 OBS 路径,避免本地磁盘容量问题
```

**并行导入**:通过 DWS 外表(Foreign Table)+ INSERT INTO ... SELECT 并行导入,支持配置并行度和分片大小,适合 TB 级数据迁移。

#### 方式 3: 直接导入(适合小表)

```bash
python3 scripts/migrate_data.py \
    --td-config config/teradata_config.ini \
    --dws-config config/dws_config.ini \
    --schema <schema_name> \
    --database <td_database> \
    --method direct
```

#### 实时进度显示

数据迁移过程中,shell 窗口实时显示每张表的迁移进度:

```
┌─ [3/19] 16% ████░░░░░░░░░░░░░░░░░░░░░░░░
│  表: customer_orders
│  已用: 5.2min  预估剩余: 26.3min
└─ 开始迁移...
  📤 导出进度: ████░░░░░░ 40% (56,000/140,000 行, 12,000 rows/s)
  📤 导出完成: 140,000 行, 45.2MB, 11.7s, 12,000 rows/s
  📋 copy: COPY 导入 140,000 行...
  📥 COPY 导入完成: 140,000 行, 3.2s, 43,750 rows/s
  ✅ [3/19] 16% ████░░░░░░ customer_orders: 140,000 行, 15.1s
```

### 迁移视图/宏/存储过程(Step 2.5)

在表结构和数据迁移完成后,可继续迁移视图、宏和存储过程:

```bash
cp config/migration_config_template.yaml config/migration_config.yaml  # 首次使用:从模板创建迁移配置
python3 scripts/migrate_views_procs.py \
    --config config/migration_config.yaml \
    --types views,macros,procedures
```

**支持的转换**:

| 对象类型 | Teradata | DWS | 关键转换 |
|---------|----------|-----|---------|
| 视图 | CREATE VIEW | CREATE OR REPLACE VIEW | ZEROIFNULL→COALESCE, QUALIFY→CTE+ROW_NUMBER, GROUP BY 位置→列名 |
| 宏 | REPLACE MACRO | CREATE OR REPLACE FUNCTION | 参数引用 `:param`→`param`, 返回 SETOF record |
| 存储过程 | REPLACE PROCEDURE (SPL) | CREATE OR REPLACE PROCEDURE (PL/pgSQL) | SET→`:=`, WHILE..DO→WHILE..LOOP, LEAVE→EXIT |

**常用参数**:

- `--types`:指定迁移类型(`views,macros,procedures`,默认全部)
- `--views`/`--macros`/`--procedures`:指定对象名(逗号分隔)
- `--output-dir`:输出 DDL 到文件而不执行
- `--dry-run`:只转换不执行(不连接 DWS)

**SQL 语法自动转换**:

- `ZEROIFNULL(expr)` → `COALESCE(expr, 0)`
- `NULLIFZERO(expr)` → `NULLIF(expr, 0)`
- `QUALIFY ROW_NUMBER() OVER(...) = 1` → CTE + ROW_NUMBER() + WHERE 子句
- `GROUP BY 1, 2` → `GROUP BY 列名`(位置引用转列名)
- `EXTRACT(YEAR FROM date_col)` → `EXTRACT(YEAR FROM date_col)`(兼容)
- Teradata 数据库引用 `db.table` → `schema.table`

### PPI 分区表转换(Step 1.3.1)

`ppi_converter.py` 模块将 Teradata PPI (Partitioned Primary Index) 分区语法自动转换为 DWS 分区语法:

**支持的转换模式**:

| Teradata PPI 模式 | DWS 分区语法 | 说明 |
|-----------------|-------------|------|
| 单级 `RANGE_N` with `EACH INTERVAL '1' DAY` | `PARTITION BY RANGE` (按天) | 日级分区 |
| 单级 `RANGE_N` with `EACH INTERVAL 'N' MONTH` | `PARTITION BY RANGE` (按月) | 月级分区 |
| `RANGE_N` with `NO RANGE / UNKNOWN` | DWS 默认分区 | 自动添加默认分区 |
| `CASE_N` | `PARTITION BY LIST` | 列表分区 |
| 多级 `RANGE_N + CASE_N` | 单级 `PARTITION BY RANGE` (降级) | DWS 不支持 SUBPARTITION,降级为单级 RANGE,原 CASE_N 信息保留在注释中 |

**降级说明**:DWS (GaussDB) 不支持 `SUBPARTITION` 语法。当遇到 Teradata 多级 PPI(RANGE_N + CASE_N)时,自动降级为单级 RANGE 分区,原 CASE_N 子分区信息以注释形式保留在 DDL 中,供参考。

### 使用 DSC 工具迁移 SQL 脚本

离线 SQL 脚本迁移可使用 DSC 工具(`runDSC.sh -S teradata -I <input> -O <output> -L <log>`),无需连接数据库即可转换,转换后的脚本在 DWS 端用 gsql 执行(密码通过 `PGPASSWORD` 环境变量注入)。详细步骤见 `references/migration-guide.md`。

## 文件结构

```
huawei-cloud-dws-migration-teradata-to-dws/
├── SKILL.md                          # 本文档
├── scripts/
│   ├── teradata_reader.py            # Teradata 只读连接器(禁止写操作)
│   ├── dws_writer.py                 # DWS 连接和执行器
│   ├── datatype_mapping.py           # 数据类型映射模块
│   ├── pre_migration_check.py        # 迁移前预检脚本(Step 0)
│   ├── migrate_schema.py             # 表结构迁移脚本(Step 1)
│   ├── migrate_data.py               # 表数据迁移脚本(Step 2)
│   ├── migrate_views_procs.py        # 视图/宏/存储过程迁移脚本(Step 2.5,入口)
│   ├── sql_converter.py              # SQL 语法转换器(视图/宏/过程共用)
│   ├── macro_converter.py            # 宏 (MACRO→FUNCTION) 转换器
│   ├── procedure_converter.py        # 存储过程 (SPL→PL/pgSQL) 转换器
│   ├── ppi_converter.py              # PPI 分区表转换器(Teradata PPI → DWS 分区)
│   ├── validate_migration.py         # 数据校验脚本(Step 3)
│   └── validate_functional.py        # 功能性校验脚本(Step 3.5)
├── config/
│   ├── teradata_config_template.ini  # Teradata 连接配置模板
│   ├── dws_config_template.ini       # DWS 连接配置模板
│   ├── obs_config_template.ini       # OBS 连接配置模板(method=obs 时使用)
│   ├── migration_config_template.yaml # 视图/宏/过程迁移与功能性校验连接配置模板
│   └── features-teradata.properties  # DSC Teradata 配置模板
├── references/
│   ├── datatype-mapping.md           # 数据类型映射详细参考
│   ├── migration-guide.md            # 迁移指南
│   ├── cli-installation-guide.md     # KooCLI 安装与凭证配置
│   ├── iam-policies.md               # 最小权限策略
│   ├── verification-method.md        # 迁移验证方法
│   ├── acceptance-criteria.md        # 验收标准
│   └── forbidden-operations.md       # 高危操作禁止列表
└── examples/
    └── sample_migration.sh           # 示例迁移脚本
```

## 核心规则详解

### 规则 1:禁止源端写操作

`teradata_reader.py` 模块通过以下机制确保不会对源端 Teradata 执行任何写操作:

- SQL 语句白名单过滤:只允许 SELECT、SHOW、HELP、SELECT 等只读语句
- 禁止源端一切数据变更/结构变更类操作(增、删、改、清空、建表、删表、改表结构、事务控制等写操作)
- 连接以只读模式建立
- 所有 SQL 在执行前经过安全检查

**完整的高危操作禁止列表见 `references/forbidden-operations.md`**,涵盖:
- 源端 DDL/DML/事务/权限/会话/数据库管理禁止操作
- 目标端破坏性 DDL/数据操作/权限滥用禁止操作
- 系统环境级禁止操作(文件/网络/进程)
- 数据安全/隐私禁止操作
- 迁移逻辑禁止操作
- AI 决策引擎禁止操作
- 只读白名单和安全校验实现规范

### 规则 2:数据类型映射

数据类型映射严格遵循华为云官方文档:
https://support.huaweicloud.com/migration-dws/dws_15_0131.html

完整映射表见 `references/datatype-mapping.md`。

### 规则 3:先表结构后表数据

迁移严格按顺序执行:
1. **表结构迁移** (`migrate_schema.py`):提取 Teradata DDL → 数据类型转换 → 在 DWS 创建表
2. **表数据迁移** (`migrate_data.py`):从 Teradata 导出数据 → 导入到 DWS
3. **校验验证** (`validate_migration.py`):比对源端和目标端数据一致性

### 规则 4:迁移前预检

在执行迁移前,**强烈建议**先运行预检脚本 `pre_migration_check.py`,以:

- 确认源端和目标端网络连通
- 评估源端 Teradata 当前负载,确保迁移不会影响源端业务
- 检查目标端 DWS 存储空间、连接数等资源是否充足
- 预估迁移时间和风险等级

预检脚本**仅执行只读查询**,不会对源端或目标端产生任何副作用。

### 规则 5:迁移进度显示

`migrate_schema.py` 和 `migrate_data.py` 均内置实时进度显示:

- **整体进度条**:`[3/19] 16% ████░░░░░░` 显示当前表序号和百分比
- **预估剩余时间**:基于已完成表的平均耗时动态估算
- **单表耗时统计**:每张表迁移完成后显示行数、耗时和吞吐率
- **子步骤进度**:导出、上传、导入各子步骤独立显示进度和速度
- **迁移汇总报告**:所有表完成后输出汇总表,含每表状态、行数和耗时

### 规则 6:重复表检测与用户确认

`migrate_schema.py` 在执行 DDL 前自动检测 DWS 中已存在的表:

1. **检测阶段**:对比源端表列表和 DWS 已有表,找出重复表
2. **确认阶段**:列出所有重复表及其当前行数,等待用户输入
   - 输入 `yes`:删除重复表并重建
   - 输入 `no`:跳过重复表,保留现有结构
   - 输入 `全部`:确认删除重建所有重复表
   - 输入 `跳过`:跳过所有重复表,仅迁移新表
3. **`--force` 模式**:跳过交互确认,自动删除重建重复表(适用于脚本/CI 环境)
4. **非交互环境处理**:当检测到 stdin 不是终端(如通过脚本/管道运行)且有重复表但未指定 `--force` 时,脚本会打印清晰错误信息并以错误码 1 退出,避免静默跳过 DDL 执行
5. **安全保证**:不会在用户未确认的情况下删除任何表

### 规则 7:OBS 临时目录

`migrate_data.py` 支持将 CSV 数据导出到 OBS 临时目录而非本地磁盘:

- **避免磁盘容量问题**:TB 级数据不再受本地磁盘空间限制
- **路径可见**:脚本启动时显示 OBS 临时目录路径
- **自动清理**:迁移完成后自动清理 OBS 临时文件
- **配置灵活**:通过 `--obs-temp-dir` 参数指定 OBS 路径

### 规则 8:COPY 命令批量导入

`dws_writer.py` 提供三种数据导入方式,性能递增:

| 方式 | 适用场景 | 性能 | 说明 |
|------|---------|------|------|
| 逐行 INSERT | 小表(<1万行) | 1x | 基准 |
| COPY 命令 | 中等表(1万-1亿行) | 10-100x | CSV 文件批量导入 |
| OBS 外表并行 | 大表(>1亿行/TB级) | 50-500x | 外表+并行INSERT SELECT |

**OBS 外表并行导入**通过创建 DWS Foreign Table 读取 OBS 上的 CSV 文件,然后执行 `INSERT INTO target SELECT * FROM foreign_table` 并行导入,是 TB 级数据迁移的最优方案。

## KooCLI 命令格式标准

核心迁移工具链为 Python 脚本,数据迁移不依赖 KooCLI;以下辅助场景使用华为云 KooCLI(`hcloud`):

1. 查询 DWS 集群列表与连接信息(确认集群状态、版本、连接端点)
2. 查看 OBS 桶列表与对象(`--method obs` 迁移前确认桶可用)

命令格式:区域参数统一通过 `--cli-region` 指定。

```bash
# 查询 DWS 集群列表
hcloud DWS ListClusters --cli-region=cn-south-1 --project_id=<project_id>

# 查询 OBS 桶列表(hcloud obs 为 obsutil 透传命令,使用 obsutil 风格语法)
hcloud obs ls
```

KooCLI 安装、凭证配置与网络排查见 `references/cli-installation-guide.md`。

## 参考文档

- **高危操作禁止列表**:`references/forbidden-operations.md`
- **IAM 权限要求**:`references/iam-policies.md`
- **KooCLI 安装与命令格式**:`references/cli-installation-guide.md`
- **迁移验证方法**:`references/verification-method.md`
- **验收标准**:`references/acceptance-criteria.md`
- **OBS 配置文件模板**:`references/obs-config-template.md`
- **完整变更历史**:`references/change-log.md`
- OBS 参考文档:`obs://cloud-bigdata/teradata_to_dws/dws_doc/`
- 数据类型映射:https://support.huaweicloud.com/migration-dws/dws_15_0131.html
- DWS 数据迁移与同步指南
- DWS 工具指南(DSC、DataCheck)
- DWS SQL 语法参考

## 注意事项

1. **网络连通性**:确保执行环境能同时连接 Teradata 和 DWS
2. **权限要求**:Teradata 需要 SELECT 权限;DWS 需要建表和数据写入权限
3. **数据量评估**:大表数据迁移建议使用 OBS 并行导入或 GDS 工具
4. **字符编码**:确保源端和目标端字符编码一致(推荐 UTF-8)
5. **兼容性**:DWS 兼容 Teradata 模式下,外表不支持 DATE 类型
6. **DSC 工具**:DSC 是离线工具,不需要连接数据库,可零停机迁移 SQL 脚本
7. **OBS 配置**:使用 `--method obs` 时需要准备 OBS 配置文件(包含 bucket、AK/SK、endpoint),并确保 obsutil 已配置
8. **重复表处理**:迁移表结构时如遇到已存在的表,脚本会暂停等待用户确认;非交互环境(脚本/管道)下需使用 `--force` 参数,否则将以错误码退出
9. **TB 级数据**:对于 TB 级数据迁移,推荐使用 `--method obs` + OBS 外表并行导入,避免本地磁盘瓶颈

## OBS 配置文件模板

使用 `--method obs` 时,需准备 OBS 配置文件 `config/obs_config.ini`。完整配置模板与参数说明见 `references/obs-config-template.md`。

## 更新日志

完整变更历史见 `references/change-log.md`。