PostgreSQL 用户资源管理

PostgreSQL 用户资源管理

PostgreSQL 提供了多种机制来管理和限制用户对数据库资源的使用,以下是全面的资源管理方法:

1 连接限制

1.1 限制最大连接数

sql 复制代码
-- 在 postgresql.conf 中设置
max_connections = 100  -- 全局最大连接数

-- 为特定用户设置连接限制
ALTER ROLE username CONNECTION LIMIT 10;

1.2 空闲连接超时

sql 复制代码
-- 设置空闲连接自动断开时间(秒)
ALTER SYSTEM SET idle_in_transaction_session_timeout = '300s';

2 查询资源限制

2.1 基本查询限制

sql 复制代码
-- 设置语句超时(毫秒)
ALTER ROLE username SET statement_timeout = '60s';

-- 设置锁等待超时
ALTER ROLE username SET lock_timeout = '5s';

2.2 高级资源控制 (pg_stat_statements)

sql 复制代码
-- 启用扩展
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 工作内存限制

sql 复制代码
-- 设置每个操作的内存限制
ALTER ROLE username SET work_mem = '16MB';

-- 设置维护操作的内存限制
ALTER ROLE username SET maintenance_work_mem = '256MB';

3.2 共享缓冲区

sql 复制代码
-- 在 postgresql.conf 中设置
shared_buffers = 4GB  -- 通常设为系统内存的25%

4 磁盘空间配额

4.1 表空间配额

sql 复制代码
-- 创建专用表空间
CREATE TABLESPACE user_space OWNER username LOCATION '/path/to/data';

-- 设置配额
ALTER USER username SET default_tablespace = 'user_space';

4.2 数据库大小监控

sql 复制代码
-- 查看用户拥有的数据库对象大小
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+)

sql 复制代码
-- 创建资源组
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 监控谓词使用

sql 复制代码
CREATE EXTENSION pg_qualstats;

-- 查看最常使用的谓词
SELECT * FROM pg_qualstats ORDER BY execution_count DESC;

6.2 pg_hint_plan 控制执行计划

sql 复制代码
-- 强制使用特定索引
/*+ IndexScan(table_name index_name) */
SELECT * FROM table_name WHERE condition;

7 审计与监控

7.1 启用审计日志

sql 复制代码
-- 在 postgresql.conf 中设置
log_statement = 'all'  -- 记录所有语句
log_duration = on
log_line_prefix = '%m [%p] %u@%d '

7.2 使用 pgBadger 分析日志

bash 复制代码
pgbadger /var/log/postgresql/postgresql-*.log -o report.html

8 最佳实践建议

  1. 分层管理

    • 为不同业务创建不同用户
    • 按业务重要性分配资源
  2. 定期审查

    sql 复制代码
    -- 查看用户资源设置
    SELECT rolname, rolconnlimit, rolconfig 
    FROM pg_roles 
    WHERE rolconfig IS NOT NULL;
  3. 自动化监控

    • 设置警报阈值
    • 使用 Prometheus + Grafana 监控
  4. 资源隔离

    • 重要业务使用专用实例
    • 使用连接池管理连接
  5. 文档记录

    • 记录资源分配策略
    • 维护变更日志
相关推荐
@LetsTGBot搜索引擎机器人2 分钟前
2025 Telegram 最新免费社工库机器人(LetsTG可[特殊字符])搭建指南(含 Python 脚本)
数据库·搜索引擎·机器人·开源·全文检索·facebook·twitter
计算机毕设VX:Fegn089528 分钟前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
冉冰学姐1 小时前
SSM校园排球联赛管理系统y513u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架应用·开题报告、
Tony Bai1 小时前
【分布式系统】03 复制(上):“权威中心”的秩序 —— 主从架构、一致性与权衡
大数据·数据库·分布式·架构
necessary6531 小时前
使用Clion查看linux环境中的PG源码
linux·运维·服务器
wb043072012 小时前
SQL工坊不只是一个ORM框架
数据库·sql
至善迎风2 小时前
Redis完全指南:从诞生到实战
数据库·redis·缓存
江湖有缘3 小时前
Jump个人仪表盘Docker化部署教程:从0到 搭建专属导航页
运维·docker·容器
FL16238631293 小时前
win11+WSL+Ubuntu-xrdp+远程桌面闪退+黑屏闪退解决
linux·运维·ubuntu
AOwhisky4 小时前
Linux逻辑卷管理:从“固定隔间”到“弹性存储池”的智慧
linux·运维·服务器