PostgreSQL Logical Replication Conflicts: Stalls, Causes, and Fixes
A single unique violation on a logical replication subscriber can stall the stream and fill the publisher's disk with retained WAL. Here is how conflicts happen and how to recover.
Notes for the problems that show up after launch: bad plans, awkward migrations, index debt, vacuum pressure, replica lag, and the small decisions that make PostgreSQL easier to operate.
A single unique violation on a logical replication subscriber can stall the stream and fill the publisher's disk with retained WAL. Here is how conflicts happen and how to recover.
ColumnStore gives MariaDB a columnar, distributed analytics engine alongside InnoDB. Here is when columnar genuinely wins, how the architecture works, and the honest limits nobody puts in the sales deck.
MariaDB and MySQL share ancestry but their optimizers have diverged for over a decade. Here is what actually differs: optimizer_switch defaults, persistent histograms, engine-independent statistics, and a migration playbook.
One runaway query or one forgotten BEGIN can take a production PostgreSQL database down. Three timeout settings are the difference between an incident and a non-event.
A BRIN index can be a thousand times smaller than the btree it replaces, or it can sit there doing nothing while costing write overhead. Physical correlation makes the difference.
Aria is the crash-safe successor to MyISAM that MariaDB uses under the hood for internal temp tables and its own system tables. Here is how it works, how it differs from InnoDB, and why operators should care.
Galera's synchronous replication means the whole cluster writes as fast as its slowest node. Here is how flow control works, how to read wsrep_flow_control_paused, and how to find the laggard.
PostgreSQL compresses big values silently, and since version 14 you get to pick the codec. Here is how to find toasted columns, weigh pglz against lz4, and switch without surprises.
Long-running and idle transactions quietly block DDL, hold locks, and stall purge until the whole instance suffers. Here is how I detect them with innodb_trx and decide what to kill.
MySQL made big-table DDL survivable with online DDL, gh-ost, and pt-osc. PostgreSQL DDL is often instant but brutally lock-sensitive. Here is how to translate your schema-change habits.
Gap locks make InnoDB transactions collide over rows that do not exist. These are the patterns I use to shrink the lock footprint under REPEATABLE READ, and when READ COMMITTED is the honest answer.
Long-running transactions hurt both engines, but differently: InnoDB accumulates undo history and purge lag, PostgreSQL accumulates dead tuples and marches toward xid wraparound. Know what to watch.