Migrating Data from Amazon Redshift¶
This page covers Amazon Redshift-specific setup for Data migration. For workflow and Worker field definitions, see Data migration configuration reference.
Prerequisites¶
- ODBC driver on Worker hosts. Required for both regular and UNLOAD extraction.
- S3 bucket and IAM role when using UNLOAD extraction: configure
unload_s3_bucket,unload_s3_prefix, andunload_iam_role_arnin Worker TOML so Redshift can write Parquet directly to S3. See Using UNLOAD extraction.
Connectivity and extraction strategies¶
Redshift supports two extraction strategies:
| Strategy | When to use | Worker requirements |
|---|---|---|
unload (recommended when prerequisites are met) | Redshift writes Parquet to S3; Snowflake loads from an external stage. Use for all tables once S3 and the external stage are set up. | unload_s3_bucket, unload_iam_role_arn in TOML; Snowflake external stage aligned with the bucket |
regular | Worker pulls result sets over ODBC. Use when volume is genuinely small, or when UNLOAD prerequisites aren’t available yet. | Standard [connections.source.redshift] TOML only |
Standard authentication¶
IAM authentication (provisioned cluster)¶
Iceberg targets¶
Redshift as a source doesn’t prevent Apache Iceberg™ tables on Snowflake as targets. Set target.tableType to "iceberg" and supply target.icebergConfig. See Data migration configuration reference.
Using UNLOAD extraction¶
UNLOAD is the recommended extraction strategy for Redshift when S3 and a Snowflake external stage are available. Instead of streaming result sets through the Worker over ODBC, Redshift writes Parquet files directly to S3. The Worker then stages those files into Snowflake from the external stage, skipping re-upload. Use UNLOAD for all tables from the source once setup is complete.
When to use UNLOAD¶
Use UNLOAD (for all tables) when:
- Redshift has an IAM role with write access to an S3 bucket.
- You can create a Snowflake external stage pointing at the same S3 bucket.
Use regular only when data volume is genuinely small, or when those prerequisites aren’t in place yet.
Prompt (when prerequisites are met):
Prompt (when S3 and the external stage aren’t ready yet, or volume is genuinely small):
Setup¶
1. Grant Redshift permission to write to S3.
Your Redshift cluster’s IAM role must have s3:PutObject and s3:ListBucket permissions on the target bucket.
2. Create a Snowflake external stage pointing at the same S3 path:
3. Add UNLOAD settings to Worker TOML:
4. Reference the stage in your workflow YAML:
Data type mappings¶
| Redshift type | Snowflake target type | Supported for migration | Notes |
|---|---|---|---|
| SMALLINT, INTEGER, BIGINT | NUMBER | Yes | |
| DECIMAL / NUMERIC | NUMBER | Yes | |
| REAL | FLOAT | Yes | |
| DOUBLE PRECISION | FLOAT | Yes | |
| BOOLEAN | BOOLEAN | Yes | |
| DATE | DATE | Yes | |
| TIMESTAMP | TIMESTAMP_NTZ | Yes | |
| CHAR, VARCHAR | VARCHAR | Yes | |
| VARBYTE / BINARY VARYING | BINARY | Yes | |
| TIMESTAMPTZ | TIMESTAMP_TZ | Yes | |
| TIME | TIME | Yes | |
| TIMETZ | TIME | Yes | |
| INTERVALY2M, INTERVALD2S | INTERVAL | Yes | Native INTERVAL by default. See INTERVAL data type handling. |
| GEOMETRY, GEOGRAPHY | GEOGRAPHY | Yes | |
| HLLSKETCH | VARCHAR | No | |
| SUPER | VARIANT | Yes |
Platform-specific considerations¶
- Server-side export (UNLOAD): Prefer UNLOAD for all tables once S3, the Redshift IAM role, and the Snowflake external stage are in place. Reserve
regularfor genuinely small volume or when those prerequisites aren’t set up yet. See Using UNLOAD extraction. - Use UNLOAD + larger
partitionSizetargets when UNLOAD produces large Parquet files from wide tables.partitionSize: "auto"works well in most cases. - When using IAM authentication, confirm the Redshift IAM role has both S3 write access and the correct trust relationship for your cluster.
- For tables migrated via UNLOAD, keep the source cluster accessible during validation. Cloud Data Validation runs SQL against live Redshift even when the original migration used UNLOAD.
- Anti-locking: No automatic hint is added on Redshift. Set
queryModifiersonly when you need custom source SQL hints. See Anti-locking and query modifiers.