SELECT name, setting FROM pg_settings
WHERE name IN ('shared_buffers','work_mem','maintenance_work_mem','effective_cache_size');
2. 数据库缓存命中率(核心性能指标)
SELECT
datname,
sum(blks_hit) AS cache_hit,
sum(blks_read) AS disk_read,
ROUND(100.0 * sum(blks_hit) / (sum(blks_hit)+sum(blks_read)+1),2) AS hit_ratio
FROM pg_stat_database
GROUP BY datname;
SELECT
spcname AS tablespace_name,
pg_get_tablespace_location(oid) AS disk_path,
pg_size_pretty(pg_tablespace_size(oid)) AS total_size
FROM pg_tablespace;
2. 查看数据库整体占用
SELECT
datname,
pg_size_pretty(pg_database_size(datname)) AS db_size
FROM pg_database;
3. 表、索引占用空间
-- 当前schema所有表大小
SELECT
relname AS table_name,
pg_size_pretty(pg_relation_size(relid)) AS table_size,
pg_size_pretty(pg_total_relation_size(relid)) AS total_with_index
FROM pg_stat_user_tables
ORDER BY pg_total_relation_size(relid) DESC;
4. 大对象 LOB 查看(pg_largeobject)
SELECT
oid AS lob_id,
pg_size_pretty(pg_large_object_size(oid)) AS lob_size
FROM pg_largeobject_metadata;
-- 指定表建到独立表空间
CREATE TABLE customer (id int) TABLESPACE ts_business;
-- 修改表所属表空间
ALTER TABLE customer SET TABLESPACE ts_business;
-- 删除空表空间
DROP TABLESPACE IF EXISTS ts_business;
四、用户、角色、权限管理(全 SQL 闭环)
1. 查询所有用户角色
SELECT usename, usesysid, usecreatedb, usesuper, passwd, valuntil
FROM pg_user;
2. 创建用户、设置密码、分配默认表空间
CREATE USER app_user WITH PASSWORD 'App@2026';
-- 设置默认表空间
ALTER USER app_user SET default_tablespace = ts_business;
-- 授予schema读写权限
GRANT USAGE, CREATE ON SCHEMA public TO app_user;
GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA public TO app_user;
3. 修改密码、锁定、删除用户
ALTER USER app_user WITH PASSWORD 'New@Pass123';
DROP USER IF EXISTS app_user CASCADE;
SELECT
pid, usename, datname, state, wait_event_type,
query_start, now() - query_start AS run_time, query
FROM pg_stat_activity
ORDER BY run_time DESC;
2. 查找阻塞会话、锁等待链
SELECT
pid,
blocking_pid,
usename,
state,
wait_event,
now() - query_start AS wait_time,
query
FROM pg_stat_activity
WHERE state = 'waiting';
3. 终止卡死 / 阻塞会话
-- 单个会话
SELECT pg_terminate_backend(1234);
-- 批量杀掉指定库空闲会话
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'testdb' AND state = 'idle';
4. 对象锁明细
SELECT relation::regclass, pid, mode, granted FROM pg_locks;