Appendices
Appendix B. PostgreSQL Installation and Command Reference
The PostgreSQL side of Chapter 14, as a reference card: install routes, server control, psql, configuration, backup and restore, maintenance, and monitoring commands — PostgreSQL 16 and later.
Installation
| Platform | Route |
|---|---|
| Windows | EDB installer (postgresql.org) — password for postgres, port, locale |
| Debian/Ubuntu | PostgreSQL Apt Repository: sudo apt install postgresql postgresql-contrib |
| RHEL/Fedora | sudo dnf install postgresql-server postgresql-contrib then postgresql-setup --initdb |
| macOS | brew install postgresql@16 |
| Docker | docker run -e POSTGRES_PASSWORD=... -p 5432:5432 postgres:16 |
Server control and connection
sudo systemctl start | stop | restart | status postgresql # systemd units
pg_ctl -D /var/lib/postgresql/16/main start | stop | reload # direct (as postgres user)
psql -h host -p 5432 -U user -d university # flags
psql "postgresql://user@host:5432/university" # connection URI
sudo -u postgres psql # local peer-auth first contact
Environment defaults: PGHOST, PGPORT, PGUSER, PGDATABASE, PGPASSWORD (or ~/.pgpass).
psql meta-commands
| Command | Effect |
|---|---|
\l \c db | List databases / connect |
\dt \d table \d+ table | Tables / describe / describe with size and indexes |
\di \dv | Indexes / views |
\du | Roles |
\sf function | A function's source |
\i file.sql \ir file.sql | Run a script (absolute / relative to current script) |
\copy table TO/FROM 'file' CSV | Client-side bulk data |
\timing \x \pset pager off | Toggle timing / expanded output / pager |
\encoding \conninfo | Client encoding / connection facts |
\? \h COMMAND | Help: meta-commands / SQL statement |
\q | Quit |
Roles, users, privileges
CREATE ROLE name [LOGIN] [PASSWORD '...'] [SUPERUSER | CREATEDB | CREATEROLE | REPLICATION];
ALTER ROLE name PASSWORD '...' | LOGIN | ...;
DROP ROLE name;
GRANT role TO role; -- group membership (inherited)
GRANT SELECT, INSERT ON table TO role;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO role;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO role;
GRANT EXECUTE ON FUNCTION name(args) TO role;
REVOKE ... FROM role | PUBLIC;
Configuration (postgresql.conf / pg_hba.conf)
| Setting | Typical value | Notes |
|---|---|---|
listen_addresses | localhost → '*' | Network reach (with pg_hba + firewall) |
port | 5432 | |
shared_buffers | ~25% RAM | Server-side page cache |
work_mem | 4–64MB | Per sort/hash; watch for abuse |
maintenance_work_mem | 256MB+ | VACUUM, CREATE INDEX |
max_connections | 100 | Prefer a pooler over raising |
wal_level | replica | Required for replication/PITR |
archive_mode / archive_command | on / cp %p /archive/%f | WAL archiving for PITR |
log_connections / log_statement | on / ddl | See also pgaudit |
deadlock_timeout | 1s default | Detector wake interval |
pg_hba.conf line shape: local db user peer / host db user CIDR scram-sha-256 / hostssl ... — reload with pg_ctl reload or SELECT pg_reload_conf();. ALTER SYSTEM SET name = value; writes without editing files.
Backup and restore
pg_dump -Fc university > u.dump # custom (compressed, selective)
pg_dump -Fd university -j 4 -f dumpdir/ # directory, parallel
pg_dump -f u.sql university # plain SQL
pg_dumpall --globals-only > globals.sql # roles/tablespaces
pg_restore -d university -j 4 u.dump [-t table]
psql -d university -f u.sql
pg_basebackup -D basebackup/ # physical base for PITR/replication
PITR: restore base, recovery.signal, restore_command, recovery_target_time, start.
Maintenance and monitoring
VACUUM [FULL] [ANALYZE] [table]; -- reclaim (FULL: exclusive, rare)
ANALYZE [table]; -- refresh statistics
REINDEX TABLE table;
SELECT * FROM pg_stat_activity; -- who is doing what (wait events included)
SELECT * FROM pg_stat_user_tables; -- seq/index scans, n_dead_tup
SELECT * FROM pg_stat_database; -- blks hit/read, deadlocks
SELECT query, calls, mean_exec_time FROM pg_stat_statements
ORDER BY mean_exec_time DESC LIMIT 10; -- top queries (extension: CREATE EXTENSION pg_stat_statements)
SELECT pg_size_pretty(pg_database_size('university'));
Replication: SELECT * FROM pg_stat_replication; (lag). Wraparound horizon: datfrozenxid ages in pg_database.
Common troubleshooting
| Symptom | Meaning / first check |
|---|---|
connection refused | Service down / port / firewall |
password authentication failed | pg_hba method vs password_encryption (scram) |
FATAL: role "x" does not exist | Connecting as OS user with no role — -U it |
database "x" does not exist | Wrong -d / not created |
too many connections | Raise pooling before max_connections |
could not connect to server: No route | Network / security group rung of Chapter 14's ladder |