Tools Basics
10 examples for building a DBA toolkit with pinned versions on PostgreSQL 18.4 clusters - backup, log analysis, bloat control, and advisory tools your team can reproduce on laptop, staging, and production bastion.
Search across all documentation pages
10 examples for building a DBA toolkit with pinned versions on PostgreSQL 18.4 clusters - backup, log analysis, bloat control, and advisory tools your team can reproduce on laptop, staging, and production bastion.
# tools/versions.env (commit this file)
PG_VERSION=18.4
PGBACKREST_VERSION=2.55.0
PGBADGER_VERSION=12.4
PG_REPACK_VERSION=1.5.2
PSQL_CLIENT=18.4Scope: This section covers operational tools, not application drivers. See psql Basics for interactive client workflows.
| Role | Tool | Purpose |
|---|---|---|
| Backup / PITR | pgBackRest | Physical base backup + WAL archive |
| Slow query discovery | pgbadger | Parse log_min_duration_statement CSV logs |
| Bloat control | pg_repack | Online heap/index repack without long ACCESS EXCLUSIVE |
| Plan review | psql + EXPLAIN (ANALYZE, BUFFERS) | Human-verified query plans |
| Advisory (optional) | pganalyze / OtterTune | Index and knob suggestions - verify manually |
psql "$DATABASE_URL" -c "SHOW server_version;"
psql --version
pgbackrest version
pgbadger --version-- In psql
SELECT version();
SHOW server_version_num; -- 180004 for 18.4pg_dump/pg_restore compatibilitypsql queries#!/usr/bin/env bash
set -euo pipefail
source tools/versions.env
# Example: pgBackRest from package or source pin
sudo apt-get install -y "pgbackrest=${PGBACKREST_VERSION}*"
# pgbadger (Perl)
sudo apt-get install -y pgbadger
# pg_repack extension + CLI (cluster must CREATE EXTENSION)
sudo apt-get install -y "postgresql-${PG_VERSION%%.*}-repack"docs/runbooks/tooling.mdapt install without pin on prod hosts| Tool | Dev laptop | Staging bastion | Prod bastion | CI |
|-------------|------------|-----------------|--------------|-----|
| psql | yes | yes | read-only | migrate job |
| pgBackRest | no | yes (restore drill) | on-call only | backup verify |
| pgbadger | yes (sample logs) | yes | yes (read logs) | no |
| pg_repack | local only | yes (change window) | on-call + ticket | no |pgbackrest check against restore sandbox, not prod-- postgresql.conf (staging/prod)
ALTER SYSTEM SET log_destination = 'csvlog';
ALTER SYSTEM SET logging_collector = on;
ALTER SYSTEM SET log_min_duration_statement = '500ms';
ALTER SYSTEM SET log_line_prefix = '%m [%p] %u@%d ';
SELECT pg_reload_conf();# Nightly report on bastion
pgbadger /var/log/postgresql/postgresql-*.csv \
-o /var/reports/pgbadger/$(date +%F) \
--incrementalRelated: pgbadger
# Self-hosted: pgBackRest stanza
pgbackrest --stanza=main info
pgbackrest --stanza=main check# RDS: use aws rds describe-db-snapshots (not pgBackRest)
aws rds describe-db-snapshots --db-instance-identifier myapp-prodpg1 Patroni role in HA topologiesRelated: pgBackRest, PITR Basics
-- pg_repack requires extension on each database
CREATE EXTENSION IF NOT EXISTS pg_repack;CREATE EXTENSION is a governance event - track in extension allowlist ADRtools/
├── versions.env
├── bin/
│ ├── pg-health.sh
│ ├── run-pgbadger.sh
│ └── verify-backup.sh
└── README.md#!/usr/bin/env bash
# tools/bin/pg-health.sh
set -euo pipefail
psql "$DATABASE_URL" -v ON_ERROR_STOP=1 -c "
SELECT datname, numbackends, xact_commit, blks_hit::float / NULLIF(blks_hit + blks_read, 0) AS cache_hit
FROM pg_stat_database
WHERE datname = current_database();"set -euo pipefail and ON_ERROR_STOP=1- [ ] versions.env matches production server_version
- [ ] pgbackrest check exit 0 on all stanzas
- [ ] pgbadger report generated last 7 days
- [ ] pg_repack extension present only where approved
- [ ] No duplicate backup cron (pg_basebackup AND pgBackRest)
- [ ] Bastion packages match versions.env| Situation | Skip new tool | Use instead |
|---|---|---|
| Managed Neon/Supabase hobby | pgBackRest | Provider PITR UI |
| Single small dev DB | pganalyze subscription | EXPLAIN in CI |
| Table under 100 MB bloat | pg_repack | VACUUM (FULL) in maintenance window |
No. Developers need psql, migration runner, and EXPLAIN habits. Backup tools stay on bastion and CI restore jobs.
No. pg_stat_statements gives live aggregates; pgbadger analyzes historical log files. Use both.
After every Postgres minor upgrade and quarterly security patch cycle. Update tools/versions.env in the same PR as runbook changes.
Stack versions: This page was written for PostgreSQL 18.4, pgBackRest 2.55+, pgBadger 12+, pg_repack 1.5+, and psql client 18.4.
Reviewed by Chris St. John·Last updated Jul 16, 2026