Relational Database Systems Concepts, Design, SQL, PostgreSQL, MySQL, and Applications

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

PlatformRoute
WindowsEDB installer (postgresql.org) — password for postgres, port, locale
Debian/UbuntuPostgreSQL Apt Repository: sudo apt install postgresql postgresql-contrib
RHEL/Fedorasudo dnf install postgresql-server postgresql-contrib then postgresql-setup --initdb
macOSbrew install postgresql@16
Dockerdocker 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

CommandEffect
\l \c dbList databases / connect
\dt \d table \d+ tableTables / describe / describe with size and indexes
\di \dvIndexes / views
\duRoles
\sf functionA function's source
\i file.sql \ir file.sqlRun a script (absolute / relative to current script)
\copy table TO/FROM 'file' CSVClient-side bulk data
\timing \x \pset pager offToggle timing / expanded output / pager
\encoding \conninfoClient encoding / connection facts
\? \h COMMANDHelp: meta-commands / SQL statement
\qQuit

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)

SettingTypical valueNotes
listen_addresseslocalhost → '*'Network reach (with pg_hba + firewall)
port5432
shared_buffers~25% RAMServer-side page cache
work_mem4–64MBPer sort/hash; watch for abuse
maintenance_work_mem256MB+VACUUM, CREATE INDEX
max_connections100Prefer a pooler over raising
wal_levelreplicaRequired for replication/PITR
archive_mode / archive_commandon / cp %p /archive/%fWAL archiving for PITR
log_connections / log_statementon / ddlSee also pgaudit
deadlock_timeout1s defaultDetector 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

SymptomMeaning / first check
connection refusedService down / port / firewall
password authentication failedpg_hba method vs password_encryption (scram)
FATAL: role "x" does not existConnecting as OS user with no role — -U it
database "x" does not existWrong -d / not created
too many connectionsRaise pooling before max_connections
could not connect to server: No routeNetwork / security group rung of Chapter 14's ladder