| name | postgresql |
| description | PostgreSQL administration and setup including installation, configuration, backup/recovery, replication, and high-availability. Learn production PostgreSQL operations. |
| sasmp_version | 1.3.0 |
| bonded_agent | 02-postgresql-dba |
| bond_type | PRIMARY_BOND |
PostgreSQL Administration
Installation & Setup
sudo apt-get install postgresql postgresql-contrib
brew install postgresql@15
docker run --name postgres -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres:15
sudo systemctl start postgresql
sudo systemctl enable postgresql
Connection Basics
psql -U postgres
psql -U postgres -d mydb -h localhost -p 5432
\l
\dt
\d table_name
\q
User & Role Management
CREATE ROLE developer WITH LOGIN PASSWORD 'secure_password';
CREATE ROLE admin WITH SUPERUSER LOGIN PASSWORD 'admin_password';
GRANT CONNECT ON DATABASE mydb TO developer;
GRANT USAGE ON SCHEMA public TO developer;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO developer;
GRANT SELECT ON employees TO developer;
ALTER DATABASE mydb OWNER TO developer;
REVOKE INSERT, UPDATE ON employees FROM developer;
DROP ROLE developer;
Configuration & Tuning
sudo nano /etc/postgresql/15/main/postgresql.conf
shared_buffers = 256MB
effective_cache_size = 1GB
work_mem = 64MB
max_connections = 200
superuser_reserved_connections = 3
wal_level = replica
max_wal_senders = 3
wal_keep_segments = 64
random_page_cost = 1.1
log_min_duration_statement = 1000
Backup & Recovery
pg_dump -U postgres -d mydb -f mydb_backup.sql
pg_dump -U postgres -d mydb -Fc -f mydb_backup.dump
pg_dump -U postgres -d mydb -t employees -f employees_backup.sql
pg_dumpall -U postgres -f all_databases.sql
psql -U postgres -d mydb -f mydb_backup.sql
pg_restore -U postgres -d mydb mydb_backup.dump
Maintenance Operations
VACUUM;
VACUUM ANALYZE;
ANALYZE;
REINDEX DATABASE mydb;
SELECT pg_database.datname,
pg_size_pretty(pg_database_size(pg_database.datname))
FROM pg_database;
SELECT schemaname, tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename))
FROM pg_tables
WHERE schemaname != 'pg_catalog'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
Monitoring
SELECT * FROM pg_stat_activity WHERE state != 'idle';
SELECT * FROM pg_stat_database WHERE datname = 'mydb';
SELECT * FROM pg_stat_user_tables;
SELECT * FROM pg_stat_user_indexes;
SELECT
sum(heap_blks_read) as heap_read,
sum(heap_blks_hit) as heap_hit,
sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio
FROM pg_statio_user_tables;
Performance Tuning
SELECT query, mean_exec_time, calls
FROM pg_stat_statements
ORDER BY mean_exec_time DESC LIMIT 10;
SELECT schemaname, tablename, indexname
FROM pg_stat_user_indexes
WHERE idx_scan = 0;
SELECT * FROM pg_stat_user_tables
WHERE seq_scan > idx_scan
AND n_live_tup > 1000;
EXPLAIN ANALYZE
SELECT * FROM employees WHERE salary > 50000;
Replication Setup
wal_level = replica
max_wal_senders = 3
wal_keep_segments = 64
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'rep_password';
pg_basebackup -h primary_host -D /var/lib/postgresql/15/main -U replicator -v -P -W
standby_mode = 'on'
primary_conninfo = 'host=primary_host port=5432 user=replicator password=password'
High Availability with pgBouncer
sudo apt-get install pgbouncer
[databases]
mydb = host=primary_host port=5432 dbname=mydb
[pgbouncer]
listen_port = 6432
max_client_conn = 1000
default_pool_size = 25
reserve_pool_size = 5
Next Steps
Learn advanced security features including row-level security and SSL/TLS configuration in the postgresql-security skill.