Oracle Database as the source, Amazon Aurora PostgreSQL as the target, on AWS. Measured on 28 October 2026 with Repstance 5.2.0285.
Repstance reads an Oracle database at 228,000 rows per second and mines the Oracle redo logs at 32,000 row changes per second. An average 100 GB database is read in 37 minutes, and 100 GB of redo logs are processed in 45 minutes. While Oracle runs 4,250 transactions per second, the changes reach Aurora PostgreSQL 11 seconds late on average and 19 seconds late at most. Replication uses 5% of the CPU of the Oracle server, under 1 of its 16 cores. After the redo test the row counts of all 11 tables were equal in Oracle and Aurora PostgreSQL. One m5.2xlarge host ran the capture and the apply.
Reading speed is the time the capture needs to read the tables from Oracle, independent of the target.
| Data | Rows | Size | Read from Oracle | Rows per second |
|---|---|---|---|---|
| SwingBench schema, 11 tables | 223,455,941 | about 36 GB with indexes † | 978 s | 228,000 |
| Narrow rows (about 100 bytes) ‡ | 50,000,000 | 4.72 GB | 114 s | 439,000 |
| Wide rows (about 2.7 KB) ‡ | 2,600,000 | 7.17 GB | 59 s | 44,000 (437 GB per hour) |
† The size of the schema at the time of the load was not recorded. It is scaled from the size measured afterwards (42 GB with indexes for 254.8 million rows). ‡ Measured on 27 October with Repstance 5.2.0283; the SwingBench schema on 28 October with 5.2.0285.
The average database is 75% SwingBench-like rows (about 160 bytes per row including indexes) and 25% wide rows (2.7 KB per row), counted by data size. It is read from Oracle in about 37 minutes:
| Part | Size | Read speed | Time |
|---|---|---|---|
| Typical rows | 75 GB | 134 GB per hour (the SwingBench schema above) | 33.7 min |
| Wide rows | 25 GB | 437 GB per hour (the wide table above) | 3.4 min |
| Average database | 100 GB | 162 GB per hour | 37 min |
This figure is an estimate from two measured speeds; no single load of such a mix was run. If the 75 / 25 split is counted by rows instead of data size, the mix is mostly wide rows by size and the time falls to about 19 minutes.
| Data | Time until Aurora PostgreSQL holds all rows | Rows per second | Rows per hour |
|---|---|---|---|
| SwingBench schema, 223,455,941 rows | 1,988 s | 112,000 | 405 million (65 GB per hour) |
| Narrow rows, 50,000,000 ‡ | 455 s | 110,000 | 396 million |
| Wide rows, 2,600,000 ‡ | 145 s | 18,000 | 178 GB per hour |
* No parallel threads. All initial load figures were measured with a single capture that reads one table at a time, and one connection that writes to Aurora PostgreSQL. The load into Aurora PostgreSQL takes longer than the read from Oracle, so it is the slower side. The rows marked ‡ ran against a db.r5.xlarge target; the SwingBench schema against db.r5.2xlarge.
SwingBench generated 49.234 GB of Oracle redo while the capture was stopped. The capture then read all of it, and after that the apply wrote the changes to Aurora PostgreSQL. The two steps ran one after the other so that each speed is measured alone.
| Capture alone (reading the redo from Oracle) | Result |
|---|---|
| Redo | 49.234 GB generated by 128 SwingBench users |
| Row changes | 43,158,750: 24,182,298 inserts and 18,976,452 updates, in 7,715,850 transactions |
| Time | 1,330 s |
| Redo mined | 133 GB per hour (100 GB in 45 minutes) |
| Row changes captured | 32,000 per second, 117 million per hour |
| Memory of the Repstance process | 14.2 GB at the peak |
| Apply alone (writing the changes to Aurora PostgreSQL) | Result |
|---|---|
| Time | 780 s: 542 s applying and 247 s waiting for the trail |
| Speed while applying | 80,000 row changes per second, 287 million per hour |
| Aurora PostgreSQL during the apply | CPU 13% on average and 22% at the peak, one connection, commit latency 10 ms on average |
| Row counts after the run | Equal in Oracle and Aurora PostgreSQL for all 11 tables |
The apply is 2.5 times faster than the capture, so when both run together the changes arrive in Aurora PostgreSQL at the speed of the capture. The final run did not run them together.
SwingBench ran against Oracle in four steps of 3 minutes with 32, 64, 96 and 128 users. A heartbeat row on Oracle was updated every second, and a poller on the target noted when each value arrived (lag = arrival time minus update time, resolution 0.5 s). The CPU of both databases comes from Amazon CloudWatch.
| Users | Oracle transactions per second | Lag, average | Lag, 95th percentile | Lag, maximum | Oracle CPU | Aurora CPU |
|---|---|---|---|---|---|---|
| 32 | 4,320 | 7.9 s | 10.6 s | 13.3 s | 50.0% | 4.9% |
| 64 | 4,250 | 10.8 s | 14.9 s | 18.8 s | 55.3% | 5.2% |
| 96 | 4,060 | 17.8 s | 26.0 s | 30.3 s | 56.1% | 5.0% |
| 128 | 4,470 | 32.1 s | 47.8 s | 59.6 s | 55.7% | 4.6% |
| 64, capture stopped (baseline) | 4,120 | 50.2% | ||||
| Idle target | 1.65% |
The Data Comparison figures on the home page come from an earlier test (Repstance 5.2.0189, Aurora PostgreSQL 16.6, db.r5.2xlarge): 328 million rows per hour, which is 91,000 rows per second, and 42 GB per hour. They were not measured again with 5.2.0285. The time for an average 100 GB database, 1.5 to 2.5 hours, is an estimate from those figures: 86 minutes if the cost is per row, 143 minutes if it is per byte. It assumes tables with a single-column key. In an attempt on 27 October a table with a composite key was compared much more slowly (100,000 rows in 25 seconds), and tables without a key cannot be compared.
All tests ran in AWS us-east-1 on 28 October 2026 unless a row says otherwise. Repstance read the Oracle redo logs and applied the changes to Aurora PostgreSQL in the same region.
| Component | Configuration |
|---|---|
| Source | Amazon RDS for Oracle 19c Enterprise Edition, db.m5.4xlarge (16 vCPU, 64 GiB), 200 GiB gp3 at 12,000 IOPS and 500 MiB/s, ARCHIVELOG with supplemental logging |
| Target | Amazon Aurora PostgreSQL 16.8, db.r5.2xlarge (8 vCPU, 64 GiB), one writer instance |
| Repstance host | Amazon EC2 m5.2xlarge (8 vCPU, 32 GiB), Amazon Linux 2023, 200 GiB gp3 raised to 10,000 IOPS and 600 MiB/s, zone us-east-1a. Repstance 5.2.0285. The SwingBench load generator ran on the same host. |
| Repstance settings | Capture: direct redo log mining, 256 MB trail files, asynchronous redo mode on (asyncredo=1: the capture first copies the archived logs to the local disk; use 5.2.0285 or later with this setting). Apply: batch mode 2, 64 MB read buffer, one connection. Initial load: one capture, one table at a time. All other settings at their defaults. |
The test needs two RDS databases and one EC2 host and takes about 3.5 hours. At on-demand prices that is roughly 12 US dollars (estimate). The scripts and settings below are the ones that produced the figures above.
exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours', 12);
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD', 'PRIMARY KEY');The settings file /etc/bench/env:
PROFILE=reference
ORA_HOST={Oracle endpoint}
ORA_PORT=1521
ORA_SERVICE=ORCL
TGT_TYPE=postgresql
TGT_HOST={Aurora PostgreSQL cluster endpoint}
TGT_PORT=5432
MIN_MEM_GB=30
ARCH_RETENTION_H=12
ASYNCREDO=1
T2_REDO_GB=48.5
T3_STEP_MIN=3# passwords stay in the environment and are never written to a file
export DB_PW='{Oracle password}' TGT_PW='{Aurora PostgreSQL password}'
sudo --preserve-env=DB_PW,TGT_PW env TESTS=smoke /opt/bench/scripts/run_all.sh
sudo --preserve-env=DB_PW,TGT_PW env TESTS=il,split,t3 KEEP_PIPELINE=yes /opt/bench/scripts/run_all.shExpect different numbers if your instance sizes, region, Repstance build or data differ from the table in the testing details. Benchmark kit download: repstance-benchmark-kit-Oracle-PG.tar.gz (checksum: repstance-benchmark-kit-Oracle-PG.tar.gz.sha256).