PostgreSQL support · 24×7 enterprise PostgreSQL DBA engineering for PostgreSQL 14 to 18, Patroni, Citus and every managed Postgres cloud

PostgreSQL Support: 24×7 Enterprise PostgreSQL DBA Engineering

MinervaDB delivers enterprise PostgreSQL support for teams whose revenue depends on Postgres staying fast and correct. Principal engineers answer your incidents, keep autovacuum ahead of bloat and wraparound, tune queries from pg_stat_statements evidence, build Patroni failover that has been rehearsed, prove pgBackRest backups by restoring them, and run your upgrade to PostgreSQL 18, on bare metal, Kubernetes, Amazon RDS and Aurora, Google Cloud SQL and AlloyDB, and Azure Database for PostgreSQL.

15 minSeverity-1 response, 24×7×365
900+enterprises served
46cities with delivery presence
15+years of database engineering depth
200+years of combined leadership experience

Scope of enterprise PostgreSQL support

What our PostgreSQL DBA support team owns for you

Our PostgreSQL support practice covers the full Postgres lifecycle, from the heap and WAL to the cloud console. Each area below is run by engineers who reason from PostgreSQL internals and catalog evidence, not from a script that forwards your ticket.

24×7 incident response

Severity 1 answered in 15 minutes by a named engineer: outages, lock pile-ups, replication breaks, full disks, wraparound warnings and failed failovers.

Vacuum and bloat control

Autovacuum tuning per table, xmin-horizon hygiene, freeze planning and online bloat removal, so cleanup keeps pace with your write rate.

Query performance

pg_stat_statements, EXPLAIN (ANALYZE), pg_stat_io and index design, with before-and-after measurements for every change we make.

High availability

Streaming replication, Patroni with etcd, synchronous standbys, pg_rewind and HAProxy or PgBouncer routing, drilled on a schedule.

Backup and PITR

pgBackRest and Barman, WAL archiving, incremental backups and point-in-time restores, verified by drills with measured recovery time.

Upgrades and extensions

pg_upgrade and logical-replication upgrades to 18, plus PostGIS, pgvector, TimescaleDB, Citus and pg_partman in production.

01 · Versions and upgrades

PostgreSQL 14 leaves community support on 12 November 2026

The PostgreSQL Global Development Group supports each major version for five years. PostgreSQL 13 reached end of life in November 2025, 14 follows on 12 November 2026, and PostgreSQL 18 (18.6 current) is supported until November 2030. PostgreSQL 19 was at Beta 4 in late September 2026, with general availability expected in October. PostgreSQL support planning starts by placing every cluster on this table.

PostgreSQL support version lifecycle October 2026: PostgreSQL 13 end of life, PostgreSQL 14 end of life November 2026, PostgreSQL 15, 16, 17 and 18 supported, PostgreSQL 19 beta, with recommended action for each

Figure 1. PostgreSQL support planning: major versions as of October 2026 and the action we recommend for each. Source: postgresql.org versioning policy and release announcements.

Which version should we upgrade to from PostgreSQL 14?

PostgreSQL 18 for most estates. It adds asynchronous I/O for sequential scans, bitmap heap scans and VACUUM, skip scan on multicolumn B-tree indexes, uuidv7(), virtual generated columns and OAuth authentication, and pg_upgrade now keeps planner statistics so performance is stable straight after cutover. PostgreSQL 17 is a sound choice where an extension is not yet certified on 18.

pg_upgrade or logical replication?

pg_upgrade with --link is fastest, with downtime measured in minutes for most clusters. Logical replication gives near-zero downtime and a live rollback target, at the cost of handling sequences, DDL and large objects separately. We choose per cluster from the downtime budget and the schema.

Should we deploy PostgreSQL 19 when it ships?

Not for critical systems on day one. Features were still being reverted at Beta 4, including SQL/PGQ and online checksum changes. We test 19 against your workload once it reaches general availability and the first minor releases, then plan adoption.

Major upgrade 14 to 18 with pg_upgrade: inventory, dry run, link mode, statistics

# PostgreSQL support runbook: major upgrade 14 -> 18 with pg_upgrade.
# Run as the postgres OS user. Paths come from variables so nothing is hardcoded.
OLD_BIN=/usr/lib/postgresql/14/bin   OLD_DATA=/var/lib/postgresql/14/main
NEW_BIN=/usr/lib/postgresql/18/bin   NEW_DATA=/var/lib/postgresql/18/main

# 1. Roles still stored as MD5 hashes: md5 auth is deprecated in PostgreSQL 18,
#    so re-set these passwords under scram-sha-256 before or after the move.
psql -X -d postgres -c "SELECT rolname FROM pg_authid WHERE rolpassword LIKE 'md5%';"

# 2. Extension inventory per database: every one must be installed for 18 first.
psql -X -d app -c "SELECT extname, extversion FROM pg_extension ORDER BY 1;"

# 3. PostgreSQL 18 initdb enables data checksums by default. pg_upgrade needs both
#    clusters to match: check the old one with  SHOW data_checksums;
"$NEW_BIN/initdb" -D "$NEW_DATA" --encoding=UTF8 --locale=C.UTF-8 --no-data-checksums

# 4. Dry run. Changes nothing, reports every incompatibility it finds.
"$NEW_BIN/pg_upgrade" -b "$OLD_BIN" -B "$NEW_BIN" -d "$OLD_DATA" -D "$NEW_DATA" \
    --jobs=8 --check

# 5. In the window, after a verified backup. --link avoids copying data files;
#    once the new cluster starts, rollback means the backup or the old standby.
"$NEW_BIN/pg_upgrade" -b "$OLD_BIN" -B "$NEW_BIN" -d "$OLD_DATA" -D "$NEW_DATA" \
    --jobs=8 --link

# 6. 18 carries planner statistics across the upgrade; extended statistics are
#    not carried, so only fill what is missing instead of a full re-analyze.
"$NEW_BIN/vacuumdb" --all --analyze-in-stages --missing-stats-only --jobs=8

02 · MVCC, vacuum and wraparound

The PostgreSQL support problem most outages start from

PostgreSQL keeps old row versions in the heap until VACUUM proves no snapshot can still see them. That design gives readers and writers freedom from each other, and it means one forgotten session, abandoned replication slot or unfinished prepared transaction can stall cleanup across the entire cluster.

PostgreSQL support internals: long-running transactions, idle in transaction sessions, replication slots, hot_standby_feedback and prepared transactions hold back the oldest xmin, which causes bloat, transaction ID wraparound risk and retained WAL

Figure 2. A core PostgreSQL support concern: what pins the xmin horizon, and what follows when it is pinned.

Wraparound age, horizon holders and dead tuples, with a gated remediation

-- PostgreSQL support check 1: how close is each database to XID wraparound?
SELECT datname,
       age(datfrozenxid)                                     AS xid_age,
       ROUND(100.0 * age(datfrozenxid) / 2147483647, 1)      AS pct_of_wraparound
FROM pg_database
ORDER BY xid_age DESC;

-- PostgreSQL support check 2: who is holding the xmin horizon back (sessions, slots, 2PC)?
SELECT 'session' AS holder, pid::text AS id, state, age(backend_xmin) AS xmin_age,
       now() - xact_start AS held_for
FROM pg_stat_activity
WHERE backend_xmin IS NOT NULL
UNION ALL
SELECT 'slot', slot_name::text, CASE WHEN active THEN 'active' ELSE 'inactive' END,
       GREATEST(age(xmin), age(catalog_xmin)), NULL
FROM pg_replication_slots
UNION ALL
SELECT 'prepared', gid, 'prepared', age(transaction), now() - prepared
FROM pg_prepared_xacts
ORDER BY xmin_age DESC NULLS LAST
LIMIT 10;

-- PostgreSQL support check 3: where dead tuples accumulate, and whether autovacuum is keeping up.
SELECT relname, n_live_tup, n_dead_tup,
       ROUND(100.0 * n_dead_tup / NULLIF(n_live_tup + n_dead_tup, 0), 1) AS dead_pct,
       last_autovacuum, autovacuum_count
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC
LIMIT 15;

-- Remediation gate: confirm the pid and its owner with the application team,
-- cancel the query first, terminate only if cancel does not release the snapshot.
-- SELECT pg_cancel_backend(<pid>);
-- SELECT pg_terminate_backend(<pid>);

Transaction IDs are 32 bits wide, so every table must be frozen before its oldest unfrozen XID ages past roughly two billion. Autovacuum forces anti-wraparound vacuums from autovacuum_freeze_max_age (200 million by default), and if those cannot finish because the horizon is pinned, the server eventually refuses to assign new transaction IDs to protect your data.

Good PostgreSQL DBA support treats this as a monitored budget: XID age per database, horizon age, dead-tuple ratio per hot table and autovacuum run frequency, with alerts long before the defaults would intervene.

Is VACUUM FULL the fix for bloat?

Rarely in production. VACUUM FULL takes an ACCESS EXCLUSIVE lock and rewrites the table, blocking reads and writes for the duration. We use pg_repack or the REPACK command introduced in PostgreSQL 19 once it is generally available, after fixing the cause so the bloat does not return.

Does PostgreSQL 18 change autovacuum?

Yes. autovacuum_max_workers can now be raised with a reload up to autovacuum_worker_slots, and autovacuum_vacuum_max_threshold caps the dead-tuple threshold on very large tables, so they are vacuumed before the scale factor would trigger.

03 · Performance engineering

Query tuning and configuration from catalog evidence

Every performance engagement in our PostgreSQL support practice starts with pg_stat_statements: which normalised statements own the time, how much they read from disk, and how much they spill to temporary files. EXPLAIN (ANALYZE) then proves the cause on a single execution, and pg_stat_io shows whether the I/O comes from clients, VACUUM or checkpoints.

PostgreSQL support diagnostics: top statements, plan proof and I/O attribution

-- PostgreSQL DBA support diagnostics: which statements own the database time?
-- Requires pg_stat_statements in shared_preload_libraries plus CREATE EXTENSION.
SELECT LEFT(query, 80)                                  AS statement,
       calls,
       ROUND(total_exec_time / 1000)                    AS total_s,
       ROUND(mean_exec_time::numeric, 2)                AS mean_ms,
       shared_blks_read                                 AS blocks_from_disk,
       temp_blks_written                                AS temp_spill_blocks,
       pg_size_pretty(wal_bytes)                        AS wal_generated
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 15;

-- Prove the cause on one execution. In PostgreSQL 18, ANALYZE reports buffers
-- automatically; SETTINGS lists every planner setting that differs from default.
EXPLAIN (ANALYZE, SETTINGS, WAL)
SELECT customer_id, sum(amount)
FROM orders
WHERE created_at >= now() - interval '1 day'
GROUP BY customer_id;

-- I/O by backend type and context (PostgreSQL 16+): is VACUUM or the client reading?
SELECT backend_type, object, context, reads, writes, extends, evictions
FROM pg_stat_io
WHERE reads > 0 OR writes > 0
ORDER BY reads DESC;

PostgreSQL 18 baseline: default, reason and reload or restart per line

# postgresql.conf -- PostgreSQL support baseline, PostgreSQL 18, dedicated 64 GB / 16 vCPU host, NVMe (illustrative)
# Format: parameter = proposed     # default -> why ; reload or restart
shared_buffers                   = 16GB      # 128MB -> ~25% of RAM, the OS cache does the rest ; restart
effective_cache_size             = 48GB      # 4GB -> planner hint only, allocates nothing ; reload
work_mem                         = 32MB      # 4MB -> per sort/hash node, multiply by concurrency ; reload
maintenance_work_mem             = 2GB       # 64MB -> faster VACUUM and CREATE INDEX ; reload
io_method                        = worker    # worker -> keep; io_uring only on tested Linux kernels ; restart
io_workers                       = 8         # 3 -> more async I/O workers for scans and VACUUM ; reload
effective_io_concurrency         = 64        # 16 -> NVMe sustains deep queues ; reload
random_page_cost                 = 1.1       # 4.0 -> SSD random reads cost close to sequential ; reload
max_wal_size                     = 16GB      # 1GB -> fewer forced checkpoints under write bursts ; reload
checkpoint_timeout               = 15min     # 5min -> smoother I/O, longer crash recovery ; reload
wal_compression                  = lz4       # off -> smaller full-page images in WAL ; reload
autovacuum_max_workers           = 6         # 3 -> reload-able in 18, capped by autovacuum_worker_slots ; reload
autovacuum_vacuum_scale_factor   = 0.05      # 0.2 -> vacuum large tables before bloat compounds ; reload
autovacuum_vacuum_cost_limit     = 2000      # -1 (uses 200) -> let workers keep up on fast storage ; reload
idle_in_transaction_session_timeout = '5min' # 0 -> stop forgotten sessions pinning the xmin horizon ; reload
max_slot_wal_keep_size           = 100GB     # -1 -> cap WAL a broken slot can retain ; reload
track_io_timing                  = on        # off -> I/O time in EXPLAIN and pg_stat_statements ; reload
shared_preload_libraries         = 'pg_stat_statements'  # evidence for every diagnosis ; restart
What does asynchronous I/O change in PostgreSQL 18?

Backends can issue several reads at once instead of waiting on each one. io_method defaults to worker, using a pool of I/O worker processes; io_uring is available on Linux. It accelerates sequential scans, bitmap heap scans and VACUUM. The gain depends on storage latency, so we measure it on your hardware before and after.

Why is temp_blks_written in the first query?

It shows sorts and hashes spilling to disk because work_mem is too small for that plan. We raise work_mem per role or per query where the spill is proven, rather than globally, since the setting applies per plan node and per session.

Do you change settings on production while tuning?

Only reload-able parameters, one at a time, with the metric recorded before and after and the previous value ready to restore. Restart-only parameters such as shared_buffers and io_method go through a maintenance window on a standby first.

04 · Replication and high availability

Patroni failover that has been rehearsed, not assumed

Our PostgreSQL DBA support designs high availability around one rule: only the node holding the leader key in a quorum store may accept writes. Patroni with a three-node etcd cluster enforces that rule, synchronous replication defines the RPO, and HAProxy or PgBouncer follow the leader through the Patroni REST API.

PostgreSQL support high availability with Patroni: applications through PgBouncer and HAProxy routed by the Patroni REST API to the primary, a synchronous standby and an asynchronous standby, with a three-node etcd quorum and a pgBackRest WAL archive

Figure 3. The Patroni cluster our PostgreSQL support team typically builds: etcd decides the leader, HAProxy routes to it, pgBackRest keeps the WAL archive for recovery.

Patroni node configuration with the reasoning behind each setting

# /etc/patroni/patroni.yml -- PostgreSQL DBA support reference, one node of a 3-node PostgreSQL 18 cluster (sketch)
# Passwords are not stored here: Patroni reads PATRONI_SUPERUSER_PASSWORD and
# PATRONI_REPLICATION_PASSWORD from the service environment / secret store.
scope: pg-prod
name: pg-node-1
restapi:
  listen: 0.0.0.0:8008
  connect_address: 10.0.1.11:8008      # HAProxy health-checks /primary and /replica here
etcd3:
  hosts: etcd-1:2379,etcd-2:2379,etcd-3:2379
bootstrap:
  dcs:
    ttl: 30                            # leader key expiry: failover starts after this
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576   # bytes; a staler replica is never promoted
    synchronous_mode: true             # commits wait for one sync standby: RPO 0
    synchronous_mode_strict: false     # if no standby is left, keep accepting writes
    postgresql:
      use_pg_rewind: true              # old primary rejoins without a full rebuild
      use_slots: true
      parameters:
        wal_level: replica
        wal_log_hints: "on"            # required by pg_rewind without data checksums
        max_wal_senders: 10
        max_replication_slots: 10
postgresql:
  listen: 0.0.0.0:5432
  connect_address: 10.0.1.11:5432
  data_dir: /var/lib/postgresql/18/main
  bin_dir: /usr/lib/postgresql/18/bin
  authentication:
    superuser:   { username: postgres }
    replication: { username: replicator }

# Planned switchover (patronictl asks for confirmation before acting):
#   patronictl -c /etc/patroni/patroni.yml list
#   patronictl -c /etc/patroni/patroni.yml switchover --leader pg-node-1 --candidate pg-node-2

PostgreSQL DBA support check: replication lag per standby and WAL retained by each slot

-- PostgreSQL support: replication lag per standby, run on the primary.
SELECT application_name,
       state,
       sync_state,                                               -- sync, quorum, async
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)) AS replay_gap,
       write_lag, flush_lag, replay_lag
FROM pg_stat_replication
ORDER BY replay_lag DESC NULLS LAST;

-- Slots: WAL each one retains, and how close it is to max_slot_wal_keep_size.
SELECT slot_name, slot_type, active, wal_status,                 -- reserved, extended, unreserved, lost
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained_wal,
       pg_size_pretty(safe_wal_size)                              AS headroom
FROM pg_replication_slots
ORDER BY pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) DESC;
Synchronous replication: what does it cost?

Each commit waits for the synchronous standby to confirm the WAL flush, so commit latency gains one network round trip. With the standby in the same region on low-latency links this is usually acceptable for an RPO of zero; across regions we use asynchronous replication and state the RPO honestly.

How often does PostgreSQL DBA support test failover?

At least quarterly and after every topology change, measuring time to new leader, client errors seen and whether the old primary rejoins cleanly through pg_rewind.

05 · Connection management

Why PostgreSQL support always includes the pooler

Each PostgreSQL connection is a separate backend process with its own memory, and snapshot and lock management costs grow with the number of sessions. A transaction-mode pooler lets thousands of application clients share a few dozen backends, which is often the single largest stability gain in a Postgres estate.

PgBouncer in transaction mode with SCRAM and auth_query

; /etc/pgbouncer/pgbouncer.ini -- PostgreSQL support baseline for PgBouncer 1.26
; 1.26.0 (September 2026) fixes three CVEs: upgrade older poolers first.
[databases]
app = host=127.0.0.1 port=5432 dbname=app

[pgbouncer]
listen_addr          = 0.0.0.0
listen_port          = 6432
pool_mode            = transaction   ; one server connection per transaction, not per client
max_client_conn      = 5000          ; clients are cheap here, backends are not
default_pool_size    = 40            ; ~2-4x vCPU per database/user pair; measure, then adjust
reserve_pool_size    = 5
max_prepared_statements = 200        ; protocol-level prepared statements in transaction mode
auth_type            = scram-sha-256
auth_user            = pgbouncer_auth ; looks up hashes via auth_query, no userlist secrets
auth_query           = SELECT usename, passwd FROM pgbouncer.get_auth($1)
client_tls_sslmode   = require
server_tls_sslmode   = verify-full
server_reset_query   =               ; empty in transaction mode
What breaks in transaction pooling mode?

Session state does not survive between transactions: SET without LOCAL, advisory locks held across transactions, LISTEN, temporary tables and WITH HOLD cursors. Protocol-level prepared statements work from PgBouncer 1.21 with max_prepared_statements set. We audit the application for the rest before switching.

How do you size max_connections and the pool?

From measured concurrency, not from the number of application instances. Active backends beyond a few multiples of the vCPU count add contention without adding throughput, so we size pools from pg_stat_activity samples under peak load and keep max_connections close to the pooler output plus admin headroom.

PgBouncer, Pgpool-II or a cloud proxy?

PgBouncer for lightweight pooling, Pgpool-II where query routing or load balancing in the pooler is required, and RDS Proxy or the provider's pooler on managed services when it fits the authentication model. We keep pooler versions current, since they sit in the path of every query.

06 · Backup and point-in-time recovery

PostgreSQL support for recovery: a measured number, proven by drills

A backup only counts after it has been restored. Our PostgreSQL support combines physical backups with continuous WAL archiving and runs scheduled point-in-time restores on separate hosts, so RPO and RTO come from the last drill rather than from a contract.

pgBackRest point-in-time restore drill with guards, verification and validation

# PostgreSQL support restore drill with pgBackRest: point-in-time restore to a
# separate host, never over production. Every guard below must pass first.
set -euo pipefail
STANZA=prod
TARGET=/srv/restore-drill/pgdata
PITR_TIME="2026-10-05 09:30:00+00"           # the moment to recover to

# Guard 1: refuse production paths and running clusters.
case "$TARGET" in /var/lib/postgresql/*) echo "refusing: production path"; exit 1;; esac
if pg_ctl status -D "$TARGET" >/dev/null 2>&1; then echo "refusing: cluster running"; exit 1; fi

# Verification before: the repository holds a backup older than PITR_TIME.
pgbackrest --stanza="$STANZA" info

# Guard 2: explicit typed confirmation, because --delta overwrites $TARGET.
read -r -p "Type RESTORE-DRILL to overwrite $TARGET: " ok
[ "$ok" = "RESTORE-DRILL" ] || { echo "aborted"; exit 1; }

# --archive-mode=off stops the restored copy pushing WAL into the production repo.
pgbackrest --stanza="$STANZA" --pg1-path="$TARGET" --delta \
  --type=time --target="$PITR_TIME" --target-action=promote \
  --archive-mode=off restore

pg_ctl -D "$TARGET" -o "-p 5499" -w start

# Validation after: newest business row must sit just before PITR_TIME.
psql -X -p 5499 -d app -c "SELECT max(created_at) AS newest_row, count(*) FROM orders;"
psql -X -p 5499 -d app -c "SELECT pg_is_in_recovery();"   # expect f after promote
MethodBest forPITRNotes
pgBackRestlarge self-managed clustersyes, WAL archiveparallel, compressed, encrypted, block incremental
Barmancentral backup server estatesyes, WAL streamingcatalogue of many clusters
pg_basebackupsimple estates, standby buildswith your own WAL archiveincremental mode since PostgreSQL 17
Cloud snapshotsRDS, Aurora, Cloud SQL, AlloyDB, Azureprovider windowtest cross-region restore time
pg_dumplogical exports, single databasesnonot a disaster-recovery strategy
What do you check after a restore?

That the newest business row sits just before the recovery target, that row counts and checksums match for critical tables, that the application smoke tests pass, and how long the whole run took, which becomes the measured RTO.

07 · Security and compliance

PostgreSQL controls that hold up in an audit

Enterprise PostgreSQL support includes the controls auditors ask about and the evidence that proves them: SCRAM authentication, TLS on every hop, least-privilege roles, row-level security where tenancy demands it, and pgaudit trails routed to your SIEM.

SCRAM, group roles, pg_hba rules and an audit of powerful roles

-- Enterprise PostgreSQL support hardening baseline (PostgreSQL 15+).
-- 1. SCRAM only. Default since PostgreSQL 14; re-set passwords to rehash old MD5.
ALTER SYSTEM SET password_encryption = 'scram-sha-256';
SELECT pg_reload_conf();
-- psql:  \password app_rw      (prompts, never echoes the secret)

-- 2. Group roles own privileges; login roles only inherit them.
CREATE ROLE app_read NOLOGIN;
GRANT CONNECT ON DATABASE app TO app_read;
GRANT USAGE ON SCHEMA sales TO app_read;
GRANT SELECT ON ALL TABLES IN SCHEMA sales TO app_read;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA sales
  GRANT SELECT ON TABLES TO app_read;
CREATE ROLE svc_reporting LOGIN IN ROLE app_read CONNECTION LIMIT 20;

-- 3. pg_hba.conf: TLS plus SCRAM for named networks, explicit reject last.
--   hostssl  app  svc_reporting  10.20.0.0/16  scram-sha-256
--   host     all  all            0.0.0.0/0     reject

-- 4. Audit: roles that bypass everything, and pgaudit coverage.
SELECT rolname, rolsuper, rolbypassrls, rolcreaterole
FROM pg_roles
WHERE rolsuper OR rolbypassrls OR rolcreaterole;
-- postgresql.conf: shared_preload_libraries = 'pg_stat_statements,pgaudit'
--                  pgaudit.log = 'ddl, role'
Is MD5 still safe for PostgreSQL passwords?

No. md5 authentication is deprecated in PostgreSQL 18 and scheduled for removal. scram-sha-256 has been the default password_encryption since PostgreSQL 14; existing MD5 hashes stay until each password is set again, so we migrate role by role and then remove md5 lines from pg_hba.conf.

Do you support single sign-on?

Yes. PostgreSQL 18 adds OAuth 2.0 authentication through a validator module, alongside LDAP, Kerberos/GSSAPI and certificate authentication. We choose by your identity provider and how connection pooling handles credentials.

Can you help with compliance evidence?

We map database controls to SOC 2, PCI DSS, HIPAA, GDPR and India's DPDP Act, and produce configuration evidence, access reviews and audit samples. See our PostgreSQL audit and data privacy service.

08 · Extensions and managed Postgres

PostgreSQL support across extensions and every major cloud

Managed PostgreSQL removes host administration, not engineering. Each service differs from community PostgreSQL in superuser access, parameters, extension lists and upgrade policy, and our PostgreSQL support covers those differences explicitly.

ServiceWhat differs from self-managed PostgreSQLWhat we engineer
Amazon RDS for PostgreSQLrds_superuser instead of superuser, parameter groups, Extended Support charges after standard support endsparameter baselines, Multi-AZ failover tests, version calendar, RDS Proxy
Amazon Aurora PostgreSQLshared distributed storage, Aurora-specific versions, I/O pricing modelreader scaling, Global Database DR, I/O cost review
Google Cloud SQL for PostgreSQLdatabase flags, maintenance windows, regional HAflag tuning, replicas, cross-region DR, Query Insights analysis
Google AlloyDBdisaggregated storage, columnar engine, Google-managed buildsworkload fit, columnar engine sizing, migration and exit plans
Azure Database for PostgreSQL Flexible Serverserver parameters, zone-redundant HA, allow-listed extensionsHA configuration, replica design, tuning, backup drills

pgvector

HNSW and IVFFlat index builds, memory sizing and recall-versus-latency testing for retrieval workloads.

PostGIS

Spatial index design, geometry versus geography choices and extension upgrades during major-version moves.

TimescaleDB and pg_partman

Partitioning, retention and compression policies so time-series tables stay vacuum-friendly.

Citus

Distribution keys, co-location and rebalancing for horizontally scaled PostgreSQL.

09 · 24×7 PostgreSQL support operations

What happens when you open a Severity 1

Our 24×7 PostgreSQL DBA support is run by principal engineers who already hold your runbooks, monitoring access and topology map. Response targets are commitments for an engineer to be actively working the problem, and every incident runs the same evidence sequence.

PostgreSQL support Severity 1 playbook: check availability and connections, wait events, blocking chains and WAL and storage safety, with Severity 1 to 4 response targets of 15 minutes, 12 hours, 24 hours and 48 hours

Figure 4. The first checks on a PostgreSQL Severity 1 and our response targets: S1 15 minutes, S2 12 hours, S3 24 hours, S4 48 hours.

Wait events, blocking chains and archiver health in one pass

-- PostgreSQL support, Severity 1 step 2: what is the instance waiting on?
SELECT wait_event_type, wait_event, state, count(*) AS sessions
FROM pg_stat_activity
WHERE backend_type = 'client backend' AND state <> 'idle'
GROUP BY 1, 2, 3
ORDER BY sessions DESC;

-- Step 3: blocking chains. The root blocker is a pid that blocks others
-- but is not blocked itself; its xact_start shows how long it has held locks.
SELECT a.pid,
       pg_blocking_pids(a.pid)      AS blocked_by,
       a.wait_event_type, a.wait_event,
       now() - a.xact_start         AS xact_age,
       LEFT(a.query, 70)            AS query
FROM pg_stat_activity a
WHERE cardinality(pg_blocking_pids(a.pid)) > 0
ORDER BY xact_age DESC;

-- Step 4: WAL archiving health (failures here fill pg_wal and stop the primary).
SELECT archived_count, failed_count, last_failed_wal, last_failed_time
FROM pg_stat_archiver;

Onboarding

Access, topology, baselines from pg_stat_statements and pg_stat_io, backup and failover review, and a ranked risk register in the first weeks.

Monthly reviews

Growth, XID age, bloat, slow-statement trends, replication, backups, security drift and the version calendar.

Knowledge transfer

Runbooks, RCAs and alert rules stay with your team, so support builds capability instead of dependency.

FAQ

PostgreSQL support questions CTOs and DBA leads ask first

Short answers to the questions we hear before an organisation chooses an enterprise PostgreSQL support partner.

What is included in MinervaDB PostgreSQL support?

24×7 incident response, vacuum and bloat management, query and configuration tuning, replication and Patroni high availability, pgBackRest backups with restore drills, upgrades, extension support, security hardening and monthly proactive reviews, for self-managed and managed PostgreSQL. The same PostgreSQL support team handles your account end to end.

How fast do you respond to a PostgreSQL outage?

Severity 1 incidents get a named engineer working the problem within 15 minutes, 24×7×365. Severity 2 is 12 hours, Severity 3 is 24 hours and Severity 4 is 48 hours.

How is PostgreSQL support different from remote DBA?

Support centres on incidents and expert escalation; remote DBA adds routine operations such as patching, user administration and capacity work. Many clients combine both through our PostgreSQL remote DBA service.

Do you support PostgreSQL on Kubernetes?

Yes, including CloudNativePG, Crunchy PGO, Zalando's Postgres Operator and StackGres, with attention to storage classes, pod disruption budgets and backup integration. See PostgreSQL on Kubernetes.

Can you take over during a live incident?

Yes. Emergency engagements start with read-only access and evidence capture, then mitigation; formal onboarding follows once service is stable.

Are you tied to any PostgreSQL vendor or cloud?

No. MinervaDB is vendor-neutral and sells no licences or hosting, so recommendations, including when another engine fits better than PostgreSQL, rest only on your workload.

Guidance on this page is general and pinned to the PostgreSQL versions named. Test every configuration change, upgrade, failover and restore step in a non-production environment first, verify backups by restoring them, and maintain a robust disaster-recovery posture. Related services: PostgreSQL consulting · PostgreSQL remote DBA · Amazon RDS support · AlloyDB consulting · 24×7 emergency DBA coverage · PostgreSQL 18 documentation · PostgreSQL versioning policy

Need PostgreSQL support you can call at 3 a.m.?

Talk to a PostgreSQL principal engineer about your clusters, your SLAs and your upgrade before 14 reaches end of life. contact@minervadb.com · +1 (844) 588-7287.