DMS at a glance – what you need to know
| Full Load | Full Load + CDC | |
|---|---|---|
| Use case | DBs < 100 GB, downtime acceptable | Production, zero-downtime requirement |
| Downtime | Hours (load duration) | Minutes (5-30 min cutover) |
| Replication lag | Not applicable | < 5 seconds |
| Source-side requirement | Read access | Supplemental logging / binlog / WAL |
| Typical instance cost | ~$0.018/h per vCPU + transfer | ~$0.018/h per vCPU + transfer (longer) |
DMS moves the data. Converting the schema (data types, procedures) is the job of AWS SCT – the two tools work together. Details below.
This article is aimed at organisations planning a production database migration to AWS – whether that’s escaping expensive licences (Oracle, SQL Server) or moving from on-premise to the cloud. If you’re looking for the specific Oracle → PostgreSQL scenario, see our complete Oracle to PostgreSQL migration guide. For the general AWS migration process (not just databases), see the AWS cloud migration guide.
Planning a database migration to AWS?
Book a free 30-min call
What AWS DMS is and when to use it
AWS Database Migration Service moves data between databases – from a one-off copy to continuous, real-time replication. The key advantage: the source database stays fully operational for the entire migration. Applications keep running, users keep working, and DMS copies data and tracks changes in the background.
DMS supports two migration types:
- Homogeneous – same engine on both sides (Oracle → Oracle on RDS, PostgreSQL → Aurora PostgreSQL, MySQL → RDS MySQL). The schema transfers essentially unchanged and DMS handles the data.
- Heterogeneous – different engines (Oracle → PostgreSQL, SQL Server → Aurora MySQL). This needs schema conversion via SCT first, and only then does DMS migrate the data.
When DMS is the right tool
- You’re migrating a production database and can’t afford a multi-hour outage
- You’re moving from on-premise (or another cloud) to RDS / Aurora
- You’re leaving commercial licences (Oracle, SQL Server) for open source (PostgreSQL, MySQL)
- You need ongoing replication between databases (e.g. to feed a separate reporting instance)
When you don’t need DMS
- The database is small (< 10 GB) and you can afford downtime – native
pg_dump/mysqldumpis often simpler - The migration is homogeneous and you can use native snapshots (e.g. RDS snapshot → restore)
- You only need schema conversion without moving data – that’s SCT’s job, not DMS
DMS and SCT – who does what
This is the most common source of confusion, so let’s be clear. DMS and SCT are two separate tools that solve two different problems:
| Task | Tool | What it does |
|---|---|---|
| Schema conversion (DDL, data types, procedures) | AWS SCT | Translates the source structure into the target |
| Data movement (rows, continuous replication) | AWS DMS | Copies data and replicates changes |
In a homogeneous migration (Oracle → Oracle) the schema is compatible, so SCT is often unnecessary – DMS alone is enough. In a heterogeneous migration (Oracle → PostgreSQL) the order is always the same: SCT converts and deploys the schema on the target first, then DMS fills it with data. Running DMS against an empty, incompatible database without prior schema conversion will simply fail.
Full Load vs CDC – two migration modes
DMS offers three replication task modes. The choice determines how much downtime you take.
Full Load
A one-off copy of all data from source to target. Simple, but it requires that nothing changes in the source during the load (or that you accept losing changes made in that window). Suitable for:
- Databases < 100 GB
- Dev/staging environments
- Migrations with a planned maintenance window (weekend, overnight)
Full Load + CDC
Full load first, then DMS switches to continuous change replication (Change Data Capture). Everything that changed in the source during and after the full load is replicated on an ongoing basis. This is the mode that delivers minimal downtime at cutover. It requires change logging enabled on the source side (see below).
CDC only
Replication of changes alone, without an initial load – used when historical data was moved by another method (e.g. a snapshot) and DMS only needs to catch up on changes from a defined point.
What CDC requires on the source side
| Source engine | CDC requirement |
|---|---|
| Oracle | Supplemental logging + access via LogMiner or Binary Reader |
| SQL Server | MS-CDC or transaction log access |
| MySQL / MariaDB | Binary logging (binlog) in ROW format |
| PostgreSQL | Logical replication (wal_level = logical) + replication slot |
DMS migration step by step
Step 1: Assessment and (for heterogeneous migrations) schema conversion
For a heterogeneous migration we run AWS SCT against the source database. SCT generates an assessment report (what converts automatically, what needs manual work) and deploys the converted schema on the target. For a homogeneous migration we skip this step – the schema is already compatible.
Output: An empty target database with a ready schema, prepared to receive data.
Time: 2-5 days (heterogeneous), negligible (homogeneous)
Step 2: Provision the replication instance
The DMS replication instance is the server that does the actual work of moving data. Sizing:
- Rule of thumb: ~1 vCPU per 50 GB of loaded data, or per 100 tables under CDC
- Production minimum: dms.r5.xlarge
- Networking: VPN or Direct Connect to an on-premise source; VPC peering for a source in another VPC
- Multi-AZ: for critical migrations (replication instance in HA mode)
Time: 1 day (setup + connectivity verification)
Step 3: Define the endpoints
We create two endpoints: source and target. Each holds connection details (host, port, credentials) and is tested from the replication instance. Credentials live in AWS Secrets Manager, not in the task configuration. At this stage we also verify permissions: the source account needs rights to read change logs (for CDC), the target account needs write rights.
Time: 0.5 day
Step 4: Configure the replication task and table mappings
We define the task: mode (Full Load / Full Load + CDC / CDC), table scope, and transformation rules. Typical transformations in a heterogeneous migration:
- Change object-name case (Oracle uppercase → PostgreSQL lowercase)
- Schema / table selection (table mapping – selection and filtering)
session_replication_role = replicaon PostgreSQL during the load, so triggers don’t get in the way
We also enable the Data Validation task, which automatically compares source vs target data.
Time: 1-2 days
Step 5: Run the migration and monitor
We start the task and monitor through CloudWatch:
- Full load: per-table progress, throughput, errors
- CDC: the key metrics
CDCLatencySourceandCDCLatencyTarget(replication lag – target < 5s) - Task logs in CloudWatch Logs (type errors, foreign-key constraints, LOBs)
A full load of 100 GB typically takes 4-8 hours (depending on network and instance size). Once it completes, DMS automatically switches to CDC mode and keeps the target in sync with the source.
Time: hours (load) + days/weeks of parallel CDC until cutover
Step 6: Validation and cutover
Minimal-downtime strategy (Full Load + CDC):
- DMS replicates changes on an ongoing basis (CDC lag < 5s)
- Stop writes on the source database (maintenance window)
- Wait for DMS to drain the final changes (lag = 0)
- Verify data (Data Validation + smoke tests)
- Switch the application connection string to the target database
- Open traffic
Typical downtime: 5-30 minutes. Rollback plan: keep the source in read-only mode for 48-72h; reverse DMS replication optional as a safety net.
AWS DMS costs
DMS is cheap relative to the value it delivers – the main cost is the replication instance’s running time, not the service itself.
| Item | Cost | Notes |
|---|---|---|
| Replication instance | ~$0.018/h per vCPU (r5 class) | dms.r5.xlarge = 4 vCPU ≈ $0.072/h |
| Instance storage | Usually included (log swap) | Larger for long-running CDC |
| Data transfer | Standard AWS rates | Within the same region usually free |
| Data Validation | No additional charge | Instance time only |
For a typical migration lasting 3-4 weeks (including the parallel CDC period), the DMS service itself usually costs a few hundred to ~$500. It’s a negligible line item against the total cost of the migration project – detailed ranges are in our AWS migration cost guide.
DMS and Database Savings Plans
Worth knowing: DMS replication instance costs are covered by Database Savings Plans – the same commitment model that lowers your RDS and Aurora instance bill. In exchange for committing to a steady spend (measured in $/h) for 1 or 3 years, you get a discount against the on-demand rate.
For a one-off migration lasting 1-3 months this usually doesn’t make sense – a one-year commitment doesn’t pay off for a few weeks of work. But for continuous CDC maintained long term, the DMS instance runs non-stop, and that’s when a Database Savings Plan can take a substantial part of the cost off the budget.
The most common such scenario is feeding a data warehouse. DMS is used not only for a one-off migration but as a permanent mechanism to replicate changes from a transactional (OLTP) database into a warehouse – Amazon Redshift, S3, or another analytics platform. Here the replication instance runs indefinitely, because the CDC stream never ends. That’s the textbook case for a Database Savings Plan: steady, predictable spend held for years, ideal to cover with a commitment.
We’ll cover Database Savings Plans in more depth in a dedicated article. For migration purposes, remember the rule: one-off project → on-demand; long-running CDC (e.g. feeding a data warehouse) → consider a Savings Plan.
Common DMS migration pitfalls
1. LOBs (Large Objects) and how they’re handled
Problem: BLOB/CLOB/BYTEA columns need special configuration. The default DMS mode (Limited LOB) truncates data above a set size, leading to silent data loss.
Solution: For tables with large LOBs we use Full LOB or Inline LOB mode with an appropriately chosen LobMaxSize. We always verify checksums on LOB tables after migration.
2. Tables without a primary key
Problem: CDC relies on row identification. Tables without a primary key or unique index cause problems replicating changes (UPDATE/DELETE have no way to target a specific row).
Solution: Identify such tables during assessment. Add a primary key before migration, or make a deliberate decision to migrate those tables in Full Load mode only.
3. CDC lag grows over time
Problem: With a high transaction volume on the source, CDC lag can build up, which prevents a clean cutover.
Solution: Increase the replication instance size, split the task into several parallel ones (per table group), tune ParallelLoadThreads. We monitor CDCLatencyTarget from day one, not on cutover day.
4. Foreign keys and load order
Problem: Foreign-key constraints block loading data in the wrong order (child before parent).
Solution: Disable constraints for the full load (session_replication_role = replica on PostgreSQL), re-enable them afterwards, and validate integrity.
5. Data types without an equivalent
Problem: In a heterogeneous migration, some source types have no direct equivalent in the target (this is SCT’s job, but DMS surfaces the problem at load time).
Solution: Resolved at the schema conversion stage (SCT). DMS with transformations can additionally cast types on the fly, but it’s better to fix this in the schema than in the replication task.
How AWS MAP funds a DMS migration
A database migration delivered with DMS almost always fits the AWS Migration Acceleration Program (MAP) – especially when the goal is escaping commercial licences (Oracle, SQL Server) for Aurora or RDS.
| Phase | What it covers | Typical funding |
|---|---|---|
| Assess | Database audit, SCT assessment, business case | 50-100% of assessment cost |
| Mobilize | Landing zone, migration PoC, DMS setup | 50-80% of partner cost |
| Migrate & Modernize | The actual data migration and cutover | 70-80% of partner cost |
For Oracle and SQL Server database migrations, AWS runs dedicated tracks with an increased budget – we cover the details in our Oracle to PostgreSQL migration guide. Qualification requires an active source environment, a target that’s a native AWS service, and a certified MAP partner to submit the application. We handle that end to end.
Frequently asked questions
What is AWS DMS?
AWS Database Migration Service (DMS) is a fully managed service for migrating databases to AWS. It moves data between databases (one-off or through continuous CDC replication), supporting both homogeneous migrations (same engine) and heterogeneous ones (different engines, e.g. Oracle → PostgreSQL). The source database stays operational throughout the migration.
What is the difference between AWS DMS and AWS SCT?
SCT (Schema Conversion Tool) converts the database structure – data types, tables, stored procedures. DMS moves the data – rows and continuous changes. In a heterogeneous migration, SCT converts and deploys the schema first, then DMS fills it with data. In a homogeneous migration, SCT is often unnecessary and DMS alone is enough.
Does a DMS migration require downtime?
In Full Load + CDC mode, downtime is typically 5-30 minutes – the time to drain the final changes and switch the connection string. DMS replicates changes in real time with lag under 5 seconds. Full Load only mode requires a longer maintenance window (hours), so it suits non-production or smaller databases.
How much does AWS DMS cost?
The main cost is the replication instance’s running time – about $0.018/h per vCPU (dms.r5.xlarge = 4 vCPU ≈ $0.072/h). For a typical migration lasting 3-4 weeks, the DMS service itself usually costs a few hundred dollars. It’s a negligible line item against the total cost of the migration project. For long-running CDC (e.g. feeding a data warehouse), a Database Savings Plan can cut the instance cost further.
Which databases does AWS DMS support?
DMS supports, as both source and target, Oracle, SQL Server, MySQL, MariaDB, PostgreSQL, Aurora (PostgreSQL and MySQL), and MongoDB, plus targets such as Amazon S3, Redshift, and Kinesis. The full matrix depends on the source-target combination; heterogeneous migrations require prior schema conversion via SCT.
What is CDC in AWS DMS?
CDC (Change Data Capture) is the mode in which DMS – after the initial full load – continuously replicates changes from the source database to the target by reading the source’s transaction logs. CDC is what delivers minimal downtime at production cutover. It requires change logging enabled on the source side (supplemental logging in Oracle, binlog in MySQL, logical replication in PostgreSQL).
Next steps – free database migration assessment
Every DMS migration starts with an assessment of the source environment. We analyse your databases (engine, size, transaction volume, tables without primary keys, LOB presence, integration points) and come back with:
- Mode recommendation – Full Load vs CDC, depending on your downtime requirements
- Replication instance and architecture sizing – size, networking, Multi-AZ
- Realistic timeline and cost estimate – including MAP funding projections
- Cutover plan – how to switch with minimal business impact
We’ve delivered database migrations for firms in finance, insurance, and the public sector – including regulated environments with data-residency constraints and production systems that can’t take an outage. Whether you’re leaving expensive licences behind or moving from on-premise to the cloud, the first step is understanding what you’re working with.
Planning a database migration to AWS?
Book a free 30-minute call. We'll assess your migration complexity, recommend a DMS mode, and check whether your project qualifies for AWS MAP funding (typically 70-80% of costs covered).