PostgreSQL 用户资源管理
PostgreSQL 提供了多种机制来管理和限制用户对数据库资源的使用,以下是全面的资源管理方法:
1 连接限制
1.1 限制最大连接数
-- 在 postgresql.conf 中设置
max_connections = 100 -- 全局最大连接数
-- 为特定用户设置连接限制
ALTER ROLE username CONNECTION LIMIT 10;
1.2 空闲连接超时
-- 设置空闲连接自动断开时间(秒)
ALTER SYSTEM SET idle_in_transaction_session_timeout = '300s';
2 查询资源限制
2.1 基本查询限制
-- 设置语句超时(毫秒)
ALTER ROLE username SET statement_timeout = '60s';
-- 设置锁等待超时
ALTER ROLE username SET lock_timeout = '5s';
2.2 高级资源控制 (pg_stat_statements)
-- 启用扩展
CREATE EXTENSION pg_stat_statements;
-- 查看资源消耗最多的查询
SELECT query, calls, total_time, rows
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
3 内存控制
3.1 工作内存限制
-- 设置每个操作的内存限制
ALTER ROLE username SET work_mem = '16MB';
-- 设置维护操作的内存限制
ALTER ROLE username SET maintenance_work_mem = '256MB';
3.2 共享缓冲区
-- 在 postgresql.conf 中设置
shared_buffers = 4GB -- 通常设为系统内存的25%
4 磁盘空间配额
4.1 表空间配额
-- 创建专用表空间
CREATE TABLESPACE user_space OWNER username LOCATION '/path/to/data';
-- 设置配额
ALTER USER username SET default_tablespace = 'user_space';
4.2 数据库大小监控
-- 查看用户拥有的数据库对象大小
SELECT pg_size_pretty(pg_total_relation_size(relid)) as size,
relname as table
FROM pg_catalog.pg_statio_user_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(relid) DESC;
5 使用资源组 (PostgreSQL 12+)
-- 创建资源组
CREATE RESOURCE GROUP user_group
WITH (cpu_rate_limit=30, memory_limit=30);
-- 将用户分配到资源组
ALTER ROLE username SET resource_group = 'user_group';
6 基于扩展的精细控制
6.1 pg_qualstats 监控谓词使用
CREATE EXTENSION pg_qualstats;
-- 查看最常使用的谓词
SELECT * FROM pg_qualstats ORDER BY execution_count DESC;
6.2 pg_hint_plan 控制执行计划
-- 强制使用特定索引
/*+ IndexScan(table_name index_name) */
SELECT * FROM table_name WHERE condition;
7 审计与监控
7.1 启用审计日志
-- 在 postgresql.conf 中设置
log_statement = 'all' -- 记录所有语句
log_duration = on
log_line_prefix = '%m [%p] %u@%d '
7.2 使用 pgBadger 分析日志
pgbadger /var/log/postgresql/postgresql-*.log -o report.html
8 最佳实践建议
-
分层管理:
- 为不同业务创建不同用户
- 按业务重要性分配资源
-
定期审查:
-- 查看用户资源设置 SELECT rolname, rolconnlimit, rolconfig FROM pg_roles WHERE rolconfig IS NOT NULL;
-
自动化监控:
- 设置警报阈值
- 使用 Prometheus + Grafana 监控
-
资源隔离:
- 重要业务使用专用实例
- 使用连接池管理连接
-
文档记录:
- 记录资源分配策略
- 维护变更日志
谨记:心存敬畏,行有所止。