Install
openclaw skills install @huaweicloudskill/huawei-cloud-dws-migration-teradata-to-dwsTeradata 到华为云 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"
openclaw skills install @huaweicloudskill/huawei-cloud-dws-migration-teradata-to-dws本 skill 用于将 Teradata 数据库迁移到华为云 DWS(数据仓库服务)。迁移过程严格遵循以下核心规则:
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 宏/存储过程/视图调用与结果比对
pip3 install teradatasql psycopg2-binary
在使用前,需要准备以下配置文件:
config/teradata_config_template.iniconfig/dws_config_template.iniconfig/migration_config_template.yaml,复制为 config/migration_config.yaml 并填写 Teradata/DWS 连接信息(含 source_database、目标 schema 等字段),格式说明见下文「迁移配置文件(migration_config.yaml)」migrate_views_procs.py(Step 2.5)与 validate_functional.py(Step 3.5)通过 --config config/migration_config.yaml 读取 Teradata/DWS 连接信息。该文件不在 skill 包内随附,需从模板创建:
cp config/migration_config_template.yaml config/migration_config.yaml
# 编辑 config/migration_config.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 场景),避免明文落盘。
python3 scripts/pre_migration_check.py \
--td-config config/teradata_config.ini \
--dws-config config/dws_config.ini \
--schema <schema_name> \
--output-dir ./output
预检内容包括:
预检报告保存为 JSON 文件 {schema}_pre_migration_check.json。
# 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
在数据校验通过后,对迁移的宏、存储过程、视图进行功能性验证:
可通过命令行参数直接指定连接信息(密码一律通过环境变量注入,不写在命令行):
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行数据排序比对 |
关键设计:
SETOF record 函数调用需提供列定义列表,脚本通过 pg_attribute 自动推断返回列类型ROLLBACK,不污染数据--macro-params JSON 文件指定测试参数值校验报告:JSON 格式,包含每个对象的校验状态、行数、匹配结果和错误信息
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 则跳过这些表。
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)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 级数据迁移。
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
在表结构和数据迁移完成后,可继续迁移视图、宏和存储过程:
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)(兼容)db.table → schema.tableppi_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 中,供参考。
离线 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 # 示例迁移脚本
teradata_reader.py 模块通过以下机制确保不会对源端 Teradata 执行任何写操作:
完整的高危操作禁止列表见 references/forbidden-operations.md,涵盖:
数据类型映射严格遵循华为云官方文档: https://support.huaweicloud.com/migration-dws/dws_15_0131.html
完整映射表见 references/datatype-mapping.md。
迁移严格按顺序执行:
migrate_schema.py):提取 Teradata DDL → 数据类型转换 → 在 DWS 创建表migrate_data.py):从 Teradata 导出数据 → 导入到 DWSvalidate_migration.py):比对源端和目标端数据一致性在执行迁移前,强烈建议先运行预检脚本 pre_migration_check.py,以:
预检脚本仅执行只读查询,不会对源端或目标端产生任何副作用。
migrate_schema.py 和 migrate_data.py 均内置实时进度显示:
[3/19] 16% ████░░░░░░ 显示当前表序号和百分比migrate_schema.py 在执行 DDL 前自动检测 DWS 中已存在的表:
yes:删除重复表并重建no:跳过重复表,保留现有结构全部:确认删除重建所有重复表跳过:跳过所有重复表,仅迁移新表--force 模式:跳过交互确认,自动删除重建重复表(适用于脚本/CI 环境)--force 时,脚本会打印清晰错误信息并以错误码 1 退出,避免静默跳过 DDL 执行migrate_data.py 支持将 CSV 数据导出到 OBS 临时目录而非本地磁盘:
--obs-temp-dir 参数指定 OBS 路径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 级数据迁移的最优方案。
核心迁移工具链为 Python 脚本,数据迁移不依赖 KooCLI;以下辅助场景使用华为云 KooCLI(hcloud):
--method obs 迁移前确认桶可用)命令格式:区域参数统一通过 --cli-region 指定。
# 查询 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.mdreferences/iam-policies.mdreferences/cli-installation-guide.mdreferences/verification-method.mdreferences/acceptance-criteria.mdreferences/obs-config-template.mdreferences/change-log.mdobs://cloud-bigdata/teradata_to_dws/dws_doc/--method obs 时需要准备 OBS 配置文件(包含 bucket、AK/SK、endpoint),并确保 obsutil 已配置--force 参数,否则将以错误码退出--method obs + OBS 外表并行导入,避免本地磁盘瓶颈使用 --method obs 时,需准备 OBS 配置文件 config/obs_config.ini。完整配置模板与参数说明见 references/obs-config-template.md。
完整变更历史见 references/change-log.md。