| name | postgresql |
| description | PostgreSQL 数据库管理 |
| version | 1.0.0 |
| author | terminal-skills |
| tags | ["database","postgresql","postgres","sql"] |
PostgreSQL 数据库管理
概述
PostgreSQL 数据库管理、扩展使用、查询优化等技能。
连接管理
psql -U postgres
psql -U username -d database
psql -h hostname -p 5432 -U username -d database
psql -U username -d database -f script.sql
psql -U username -d database -c "SELECT version();"
psql 常用命令
\l
\c dbname
\dt
\d tablename
\du
\dn
\df
\di
\q
\?
\timing
\x
用户与权限
CREATE USER username WITH PASSWORD 'password';
CREATE ROLE username WITH LOGIN PASSWORD 'password';
CREATE USER admin WITH SUPERUSER PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE dbname TO username;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO username;
GRANT USAGE ON SCHEMA schema_name TO username;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonly_user;
\du username
SELECT * FROM information_schema.role_table_grants WHERE grantee = 'username';
ALTER USER username WITH PASSWORD 'newpassword';
数据库操作
CREATE DATABASE dbname;
CREATE DATABASE dbname OWNER username ENCODING 'UTF8';
DROP DATABASE dbname;
SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname))
FROM pg_database ORDER BY pg_database_size(pg_database.datname) DESC;
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;
备份与恢复
pg_dump
pg_dump -U username dbname > backup.sql
pg_dump -U username -Fc dbname > backup.dump
pg_dumpall -U postgres > all_backup.sql
pg_dump -U username --schema-only dbname > schema.sql
pg_dump -U username --data-only dbname > data.sql
pg_dump -U username -t tablename dbname > table.sql
pg_dump -U username -Fd -j 4 dbname -f backup_dir/
恢复
psql -U username -d dbname < backup.sql
pg_restore -U username -d dbname backup.dump
pg_restore -U username -d dbname -j 4 backup_dir/
createdb -U postgres newdb
pg_restore -U postgres -d newdb backup.dump
性能监控
SELECT * FROM pg_stat_activity;
SELECT pid, usename, application_name, state, query
FROM pg_stat_activity WHERE state != 'idle';
SELECT pg_terminate_backend(pid);
SELECT * FROM pg_locks WHERE NOT granted;
SELECT blocked_locks.pid AS blocked_pid,
blocking_locks.pid AS blocking_pid,
blocked_activity.usename AS blocked_user,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_statement
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;
SELECT relname, seq_scan, idx_scan, n_tup_ins, n_tup_upd, n_tup_del
FROM pg_stat_user_tables;
SELECT indexrelname, idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes;
查询优化
EXPLAIN SELECT * FROM table WHERE condition;
EXPLAIN ANALYZE SELECT * FROM table WHERE condition;
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT * FROM table;
ANALYZE tablename;
ANALYZE;
REINDEX TABLE tablename;
REINDEX DATABASE dbname;
VACUUM tablename;
VACUUM FULL tablename;
VACUUM ANALYZE tablename;
常见场景
场景 1:主从复制状态
SELECT * FROM pg_stat_replication;
SELECT * FROM pg_stat_wal_receiver;
SELECT EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp()))::INT AS lag_seconds;
场景 2:慢查询分析
CREATE EXTENSION pg_stat_statements;
SELECT query, calls, total_time, mean_time, rows
FROM pg_stat_statements
ORDER BY total_time DESC LIMIT 10;
SELECT pg_stat_statements_reset();
场景 3:表维护
SELECT schemaname, relname, n_dead_tup, n_live_tup,
round(n_dead_tup * 100.0 / nullif(n_live_tup + n_dead_tup, 0), 2) AS dead_ratio
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC;
VACUUM FULL tablename;
故障排查
| 问题 | 排查方法 |
|---|
| 连接数过多 | pg_stat_activity, 检查 max_connections |
| 查询慢 | EXPLAIN ANALYZE, 检查索引 |
| 锁等待 | pg_locks, pg_stat_activity |
| 磁盘满 | 检查 WAL、清理旧数据 |
| 复制延迟 | pg_stat_replication |