Database migration cost planning: what the project actually bills
A migration is not a one-line move. You pay for both databases in parallel, for replication tooling, for cross-region transfer, and for the oversized target you provisioned to be safe. Here is a budget that holds.
Quick answer
Budget a database migration as four lines: parallel running (both source and target billing for the overlap, typically 4 to 12 weeks), replication tooling (AWS DMS on a dms.c5.large is about $0.154 per hour or $112 per month, plus its storage), data transfer ($0.02 per GB cross-region, $0.09 per GB out to the internet, free within an AZ), and target over-provisioning during validation. A 2 TB cross-region migration with an 8-week overlap on a db.r6g.xlarge pair costs roughly $756 in parallel compute, $224 in DMS, and $41 in transfer, about $1,021, before the engineering time that dominates the total.
Migrations get budgeted as engineering effort and then surprise everyone with an infrastructure bill. The surprise is structural: for the duration of the migration you own two databases, plus the machinery moving data between them, plus whatever safety margin you provisioned on the target. Here is how to price it before you start.
The four cost lines
| Line | Driver | Typical share |
|---|---|---|
| Parallel running | Overlap weeks x both instances | 50 to 70 percent |
| Replication tooling | Instance hours plus storage | 10 to 20 percent |
| Data transfer | Dataset size and direction | 5 to 25 percent |
| Target over-provisioning | Safety margin during validation | 10 to 20 percent |
Parallel running dominates
The overlap period is the expensive part and it is almost always longer than planned. A realistic sequence is: provision the target, run an initial load, start continuous replication, validate, run the application against the target in shadow mode, cut over, then keep the source running as a rollback option for two to four weeks. That is rarely under six weeks in total and frequently twelve.
| Pair | Combined monthly | 8-week overlap | 12-week overlap |
|---|---|---|---|
| db.m6g.large x2 | $226 | about $452 | about $678 |
| db.r6g.xlarge x2 | $756 | about $1,512 | about $2,268 |
| db.r6g.4xlarge x2 | $3,024 | about $6,048 | about $9,072 |
| Aurora cluster pair, 2 TB | varies by ACU or instance | storage counted twice | storage counted twice |
Storage is counted twice for the whole overlap as well. Two 2 TB gp3 volumes cost $460 per month rather than $230, so the eight-week overlap adds about $460 of storage on top of the compute figures above.
Replication tooling
AWS DMS bills the replication instance by the hour plus its storage. dms.t3.medium is about $0.049 per hour, dms.c5.large about $0.154, and dms.c5.xlarge about $0.308, in us-east-1. Storage on the replication instance is $0.115 per GB-month for gp3, and you need enough for the change cache during full load, which for a busy source can be substantial.
Sizing the replication instance matters more than the hourly rate suggests. An undersized instance makes the full load take days instead of hours and can fall behind on change data capture, which extends the overlap period, which costs far more than the larger replication instance would have. Paying $0.308 per hour instead of $0.049 for two weeks costs an extra $87 and can easily save two weeks of parallel running worth $378 or more.
Data transfer
| Path | Rate | 2 TB initial load |
|---|---|---|
| Within the same AZ | free | $0 |
| Cross-AZ, same region | $0.01/GB each way | about $41 |
| Cross-region | $0.02/GB | about $41 |
| Out to the internet or another provider | $0.09/GB first 10 TB | about $184 |
Remember the ongoing change stream, not just the initial load. A source generating 40 GB of changes per day over an eight-week cross-region migration transfers about 2.2 TB of change data, roughly $45 more. And if you are migrating between cloud providers, egress at $0.09 per GB on a 10 TB database is $920 for the initial load alone, which is worth checking against any available bulk transfer or direct connect option.
Target over-provisioning
Teams reliably provision the target larger than needed, because the migration is risky and nobody wants performance to be the variable that fails. That is reasonable during cutover and unreasonable three months later. Write the downsize into the migration plan as a dated task, with a specific target shape, because a temporary safety margin that nobody revisits is the most common lasting cost of a migration. A db.r6g.2xlarge left in place where db.r6g.xlarge would do is $378 per month indefinitely.
A complete example
| Line | Amount |
|---|---|
| Parallel compute, db.r6g.xlarge pair, 8 weeks | about $756 |
| Parallel storage, 2 TB duplicated, 8 weeks | about $460 |
| DMS dms.c5.large, 8 weeks, plus 100 GB storage | about $224 |
| Initial load transfer, cross-region | about $41 |
| Ongoing CDC transfer, 8 weeks | about $45 |
| Infrastructure total | about $1,526 |
| Engineering, 300 hours at about $96 | about $28,800 |
The infrastructure is about 5 percent of the project. That is the real lesson: optimize the migration for engineering time and risk, not for the parallel-running bill, and pay for a bigger replication instance or a longer overlap without hesitation if it reduces the chance of a failed cutover. Just do not let the temporary infrastructure become permanent.
Price the target and the parallel period from Terraform before the project starts, so the overlap cost is a planned line rather than a surprise. Compare target shapes against the resource catalog, and see cross-region replication cost for the transfer detail.
FAQ
What are the main cost lines in a database migration?
Parallel running of source and target during the overlap, which is typically 50 to 70 percent of infrastructure cost; replication tooling such as AWS DMS at 10 to 20 percent; data transfer at 5 to 25 percent depending on direction and dataset size; and target over-provisioning during validation at 10 to 20 percent. Engineering time dominates the total, usually by a factor of fifteen to twenty.
How long is the parallel running period?
Rarely under six weeks and frequently twelve. The sequence is provision target, initial load, continuous replication, validation, shadow-mode running, cutover, then keeping the source available as a rollback option for two to four weeks. A db.r6g.xlarge pair costs about $1,512 in compute over eight weeks, plus roughly $460 if a 2 TB volume is duplicated for that period.
How much does AWS DMS cost?
The replication instance bills by the hour: dms.t3.medium about $0.049, dms.c5.large about $0.154, and dms.c5.xlarge about $0.308 in us-east-1, plus gp3 storage at $0.115 per GB-month for the change cache. Over eight weeks a dms.c5.large with 100 GB is about $224. Undersizing it is a false economy, since a slow full load extends the far more expensive parallel period.
What does migration data transfer cost?
Within an AZ it is free. Cross-AZ is $0.01 per GB each way, cross-region $0.02 per GB, and out to the internet or another provider $0.09 per GB for the first 10 TB. A 2 TB cross-region initial load is about $41, plus ongoing change data: a source generating 40 GB of changes daily transfers roughly 2.2 TB over eight weeks, about $45 more.
What is the most common lasting cost of a migration?
The target that was deliberately over-provisioned for safety and never resized. A db.r6g.2xlarge left where a db.r6g.xlarge would do costs $378 per month indefinitely, which within a year exceeds the entire infrastructure cost of the migration. Write the downsize into the plan as a dated task with a specific target shape rather than an intention.
How does C3X help plan migration cost?
C3X prices the target database and the parallel-running period from Terraform before the project starts, so duplicated compute, duplicated storage, and replication instances appear as planned budget lines rather than mid-project surprises. It also prices the post-migration downsize, which turns the temporary safety margin into a scheduled change with a known saving attached.
What to do next
Budget the overlap before the project starts. C3X reads your Terraform and prices your resources against a live catalog. Start with the quickstart.
Share this post
Try C3X on your own Terraform
Free and open source. No API key required. One command to install, one command to estimate.