PostgreSQL sources are read with logical replication: Fabric creates a replication slot, decodes the write-ahead log, and streams every insert, update, and delete. It is log-based CDC — no polling, no triggers, and no added load on your queries.
Supported deployments
The same connector serves self-hosted PostgreSQL, Amazon RDS, Amazon Aurora, Google Cloud SQL, Azure Database for PostgreSQL, Supabase, Neon, Timescale Cloud, and AlloyDB for PostgreSQL. Two managed differences are called out below: RDS and Aurora use the rds_replication group role rather than rolreplication, and Cloud SQL and Azure take a direct REPLICATION grant. Supabase and Neon must be reached on their direct endpoint — a connection-pooler endpoint does not carry logical replication.
Prerequisites
Server settings
wal_level=logical— required. Logical decoding is refused otherwise. This is a restart-level setting.max_replication_slots— must have a free slot (existing logical slots plus one).max_wal_senders— at least 1.
A replication login
The login needs the REPLICATION attribute and read access to the tables being replicated:
CREATE ROLE fabric_cdc LOGIN PASSWORD '...' REPLICATION;
GRANT CONNECT ON DATABASE mydb TO fabric_cdc;
GRANT USAGE ON SCHEMA public TO fabric_cdc;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO fabric_cdc;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO fabric_cdc;On Amazon RDS and Aurora the master user never has rolreplication; membership in the rds_replication group role works instead, and Fabric accepts it. On Azure Database for PostgreSQL and Cloud SQL, grant REPLICATION directly on the role.
Publication and heartbeat
With the default pgoutput plugin, Fabric reads the publication dbz_publication, and creates it FOR ALL TABLES if it does not exist. PostgreSQL allows that only for a superuser, so for any other login create the publication yourself first.
Fabric also keeps a heartbeat row so an idle source's slot still advances. If the login cannot create tables, pre-create it and let the login write to it:
CREATE TABLE IF NOT EXISTS public.heartbeat (
id INTEGER PRIMARY KEY,
last_update TIMESTAMPTZ NOT NULL
);
GRANT SELECT, INSERT, UPDATE ON public.heartbeat TO fabric_cdc;The least-privilege guide has the full setup for a login with no superuser or CREATE rights, including a publication limited to the tables you sync.
Network
The Fabric runner must reach host:port over TCP, and pg_hba.conf must allow that login to connect — including a replication entry. The login also needs CONNECT on the postgres maintenance database, which the Test connection button uses to list databases.
Connection fields
| Field | Required | Default | Notes |
|---|---|---|---|
| Connector name | Yes | — | Unique across sources. |
| Host | Yes | — | TCP host of the server. |
| Port | Yes | 5432 | |
| Username | Yes | — | Must hold the replication privilege. |
| Password | Yes on create | — | Leave blank on edit to keep the stored password. |
| Database | Yes | — | Test connection lists the databases the login can reach; or enter it manually. Read-only after creation. |
| Replication slot | Yes | Derived from the database name | 1–63 lowercase letters, digits, or underscores. Must be unique across Postgres sources. |
| Plugin | Yes | pgoutput | pgoutput (built in) or wal2json (must be installed on the instance). |
The shared snapshot and commit fields apply on top of these — see the source overview.
How it replicates
- The initial snapshot is chunked by a single-column primary key (or a single-column
NOT NULLunique column). A table with no safe key falls back to one unchunked pass. With parallel snapshot workers above 1, disjoint sets of tables are scanned over separate connections. - The WAL position is captured before the first snapshot row, so a crash mid-snapshot resumes under the same mark instead of skipping changes.
- The replication slot is the durable resume position. It is kept when a runner stops; only Reset Pipeline drops it.
Gotchas
Watch out
- The slot name is validated in three places: the form, the API, and at slot creation. Anything other than 1–63 lowercase letters, digits, or underscores fails.
- Choosing
wal2jsonwhen the extension is not installed is refused at save.pgoutputneeds no extension. - No free replication slot is refused by name — raise
max_replication_slotsor drop an unused slot. - A role without the replication privilege is refused; on RDS/Aurora add
rds_replicationmembership.