
Beyond S3: An Introduction to Open Source Object Storage on European Clouds
July 20, 2026
How Serverless Orchestration Powers Modern Cloud Applications
August 21, 2026Moving a production database off Amazon RDS is rarely about the database engine itself. PostgreSQL operates the same way whether it runs in Virginia or Gravelines. The real work sits around it: replication topology, backup guarantees, connection handling, and the dozens of small assumptions your application makes about the managed layer. You have to adapt when you move medium-to-large workloads from RDS to managed PostgreSQL offerings from European providers like OVHcloud, Scaleway, and Hetzner.
Why Companies Leave RDS
Cost is usually the primary reason teams look elsewhere. RDS pricing scales awkwardly once you add Multi-AZ, provisioned IOPS, and cross-region backups. A comparable managed Postgres instance from a European provider often lands at a fraction of the monthly bill, particularly for storage and egress bandwidth.
Data sovereignty is another major driver. Running on OVHcloud or Scaleway removes many compliance questions for companies serving European users. You know exactly which legal framework applies, and you have physical guarantees that data stays within that jurisdiction.
You do trade away some convenience. RDS offers automated minor-version upgrades, Performance Insights, and tight integration with the rest of AWS. You will likely need to rebuild or replace these features. Knowing exactly what you give up allows you to plan the migration properly.
Replacing Specific Amazon RDS Features
Take inventory of what your RDS setup actually relies on before you touch any data. Teams are frequently surprised by how much they depend on RDS-specific behavior.
Managed Postgres services from OVHcloud and Scaleway give you automated backups, high availability with a standby replica, and read replicas. Hetzner operates differently. They do not offer a managed Postgres product in the same sense. You run Postgres yourself on their servers, often using a tool like Patroni for failover. This approach costs less and offers more flexibility, but the operational work falls entirely on your team.
A few specific RDS features require immediate attention:
- You must replace Performance Insights with your own monitoring stack, commonly Prometheus with postgres_exporter, since no direct equivalent exists.
- IAM database authentication does not carry over. Plan to manage Postgres roles and passwords directly or integrate with your own secrets manager.
- Parameter groups become standard postgresql.conf tuning, which providers may or may not expose through their control panel.
- Automated storage autoscaling is rarely available. You must provision the disk space you need and resize it deliberately.
Migrating Data with Minimal Downtime
A simple pg_dump and pg_restore during a maintenance window works well for small databases. Once your database grows past a few tens of gigabytes, or if you cannot tolerate more than a few minutes of downtime, logical replication is the necessary approach.
You provision the target instance at your European provider and create the schema. Then you set up a publication on the RDS source and a subscription on the target. RDS supports logical replication if you set rds.logical_replication to 1 in the parameter group and reboot. Postgres streams the existing rows and keeps the target current with ongoing changes.
Follow this sequence for the transfer:
- Prepare the target by matching the Postgres major version and loading the schema without foreign keys and indexes to speed up the initial copy.
- Create a publication on the source using CREATE PUBLICATION mig FOR ALL TABLES;
- Create a subscription on the target pointing at the RDS endpoint.
- Let the initial sync complete, then monitor replication lag until it holds near zero.
- Stop writes to the source during a short cutover window, confirm the target has caught up, repoint your application, and promote the target.
Logical replication has distinct limitations. It ignores schema changes, forces you to reset sequences manually on the target, and requires a replica identity set for large tables without a primary key. Test the entire sequence against a copy before executing it in production.
Setting Up Reliable Backups
AWS makes backups feel automatic, which often causes teams to stop thinking about them entirely. Check the specifics of your new managed service rather than assuming feature parity.
OVHcloud and Scaleway run automated daily backups with a specific retention window, and both allow you to restore to a new instance. Point-in-time recovery granularity and total retention length vary between services. Read the exact retention numbers and decide whether you need to build supplementary backups.
If you manage the database yourself, pgBackRest is the standard tool to adopt. It handles full, differential, and incremental backups, runs parallel compression, and supports point-in-time recovery against object storage. Point it at a provider’s S3-compatible bucket to get off-instance backups with a predictable restore path. That last part is what matters: a backup you have not restored is just a guess.
Handling High Availability and Failovers
AWS treats high availability as a simple checkbox. On European services, you need to understand the underlying mechanism.
Managed services typically implement high availability using a synchronous or asynchronous standby that gets promoted on failure. The provider handles detection and DNS or endpoint switching. Confirm whether failover happens automatically and check the expected recovery time, as this differs widely between providers.
If you run Postgres directly on compute instances, combining Patroni with etcd or Consul is the established pattern. Patroni manages leader election and automatic failover. You place HAProxy or the provider’s load balancer in front so the application always reaches the current primary node. This setup involves more moving parts than a managed service, but it remains completely under your control and costs considerably less at scale.
Managing Connection Pooling at Scale
Amazon RDS Proxy quietly handles connection pooling for many teams. Postgres manages concurrent connections poorly past a certain threshold because each connection requires a separate backend process. A few thousand application connections will exhaust available memory quickly.
Place PgBouncer in front of your database in transaction pooling mode. It multiplexes many client connections onto a small pool of real Postgres connections. Some European providers offer this as a built-in feature. If yours does not, run PgBouncer yourself on a small instance next to the database. This single component frequently makes the difference between a migration that performs well and one that crashes under real traffic.
Benchmarking Database Performance Before Cutover
Do not assume the new instance will perform like the old one. Test it thoroughly.
Use pgbench to establish a synthetic baseline, but weight your testing toward your actual query patterns. Capture slow queries from the RDS side using pg_stat_statements before migrating, then replay comparable load against the target. Watch carefully for differences in disk latency. Storage performance varies significantly more between providers than raw CPU capacity. If the European instance uses local NVMe, you will likely see better latency than RDS gp3 volumes. If it uses networked storage, test under sustained write load to see exactly how the hardware responds.
Set up postgres_exporter and Grafana before the cutover. You want your dashboards to show normal behavior while the old system is still running so you have an accurate comparison.
A Safe Sequence for Database Migration
Following a strict order reduces your risk during the transition:
- Inventory your RDS dependencies and select the target provider based on high availability and backup specifics rather than just price.
- Stand up the target instance, tune the configuration, and configure PgBouncer and monitoring.
- Configure and test pgBackRest against object storage if you are managing backups manually.
- Run logical replication to synchronize data continuously.
- Benchmark the new database against production-like load while replication is running.
- Execute the cutover during a short maintenance window, but keep RDS running as a fallback for a few days.
- Decommission RDS only after the new system has handled real traffic through a full cycle and you have completed a successful backup restore test.
The data transfer itself is usually the easiest part of the process. Failures almost always stem from surrounding assumptions, like a connection pooler you forgot to set up or a sequence you failed to reset. Address those external components early, and running Postgres on European infrastructure becomes a steady, predictable operation that costs noticeably less than the alternative you leave behind.
