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 for large tables) | Redshift writes Parquet to S3; Snowflake loads from an external stage | unload_s3_bucket, unload_iam_role_arn in TOML; Snowflake external stage aligned with the bucket |
regular (default) | Worker pulls result sets over ODBC | 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 strategy for large Redshift tables. 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.
When to use UNLOAD¶
Use UNLOAD when:
- Tables are large enough that ODBC throughput becomes a bottleneck.
- 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.
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 | VARCHAR | Yes | Stored as a text representation |
| GEOMETRY, GEOGRAPHY | GEOGRAPHY | Yes | |
| HLLSKETCH | VARCHAR | No | |
| SUPER | VARIANT | Yes |
Platform-specific suggestions¶
- 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.