导读:本期聚焦于高建功创作的《Oracle数据库PROFILE是什么?如何用它限制用户资源?》,敬请观看详情。PROFILE是Oracle数据库中用于限制用户资源消耗的重要机制,它可以对CPU时间、逻辑读、会话数、连接时间、空闲时间以及密码策略等多个维度设置上限。当某个用户的行为超出预设阈值时,系统会自动终止会话或终止相关语句,从而避免个别用户占用过多资源影响整体性能。本文将详细介绍PROFILE的创建与分配方法,讲解resource_limit参数的作用,剖析各类资源限制参数的含义,并结合密码策略配置给出完整示例,同时说明使用过程中的注意事项,帮助你更好地管理数据库资源。

Oracle数据库是一个多用户系统,不同用户对资源的需求差异很大。如果没有合理的管控手段,一个失控的查询或者恶意的大量连接就可能拖垮整个实例。PROFILE正是Oracle提供的一套资源限制机制,它可以把一组资源上限和密码规则绑定到一个数据库用户上,一旦用户的行为超出限制,数据库就会自动干预。本文将从创建、启用、参数含义到密码策略,系统地讲解PROFILE的使用方法。

Oracle数据库PROFILE是什么?如何用它限制用户资源?

PROFILE的基本概念与创建方法

PROFILE本质上是一个命名的资源限制集合。数据库管理员先创建一个PROFILE,指定各类资源的上限值,然后通过ALTER USER语句把它分配给一个或多个用户。一个用户只能关联一个PROFILE,如果不显式指定,则默认使用DEFAULT PROFILE。DEFAULT PROFILE中的限制参数初始值几乎都是UNLIMITED,也就是说默认情况下任何用户都不受资源约束。

创建PROFILE的语法非常直观,下面是一个典型的例子,限制了会话级别的CPU时间和并发连接数:

CREATE PROFILE limited_profile LIMIT
    SESSIONS_PER_USER 5
    CPU_PER_SESSION 10000
    CPU_PER_CALL 3000
    LOGICAL_READS_PER_SESSION 100000
    LOGICAL_READS_PER_CALL 10000
    CONNECT_TIME 60
    IDLE_TIME 30
    COMPOSITE_LIMIT DEFAULT;

创建好之后,将它分配给用户:

ALTER USER scott PROFILE limited_profile;

需要注意的是,PROFILE中的参数分为资源限制和密码限制两大类,两者可以同时定义在同一个PROFILE中。如果只想修改某个参数而不影响其他参数,可以使用ALTER PROFILE语句,例如ALTER PROFILE limited_profile LIMIT IDLE_TIME 10;,这样只调整空闲超时时间,其余限制保持不变。

启用资源限制:resource_limit参数

这是一个非常常见的坑:很多人创建了PROFILE、分配给了用户,却发现资源限制完全不生效。原因在于,资源类的限制参数默认并没有被启用。Oracle通过初始化参数RESOURCE_LIMIT来控制资源限制是否生效,该参数默认值为FALSE。

启用它有两种方式。一种是动态修改,立即生效,不需要重启实例:

ALTER SYSTEM SET RESOURCE_LIMIT = TRUE;

另一种是修改参数文件(pfile或spfile),这样实例重启后仍然保持开启状态。要特别注意的是,密码类的限制参数(如密码有效期、失败登录次数等)不受RESOURCE_LIMIT参数控制,它们始终生效。这个区别很重要,很多初学者会误以为所有PROFILE参数都依赖这个开关。可以通过查询V$PARAMETER视图确认当前参数状态:

SELECT name, value FROM v$parameter WHERE name = 'resource_limit';

核心资源限制参数详解

PROFILE的资源参数主要分为会话级和调用级两个层次。会话级限制针对整个会话的生命周期,一旦累计超出,会话会被强制断开;调用级限制针对单条SQL语句,超限时当前语句报错,但会话本身仍然存活。理解这个层次差异,才能合理设置阈值。

CPU相关参数

CPU_PER_SESSION限制单个会话总共可消耗的CPU时间,单位是百分之一秒;CPU_PER_CALL则限制单次调用(一条SQL语句的解析、执行与提取阶段)可消耗的CPU时间。对于OLTP系统,通常会给调用级设置一个较小的值,防止一条糟糕的SQL长时间占用CPU,而会话级可以设置得宽松一些。

逻辑读参数

LOGICAL_READS_PER_SESSIONLOGICAL_READS_PER_CALL分别限制会话累计和单次调用可读取的数据块数量,包含内存读和磁盘读。这是拦截全表扫描类大查询的利器,因为一个无索引的大扫描往往会带来数百万次的逻辑读。

连接与空闲参数

SESSIONS_PER_USER限制同一用户名下的并发会话数,超出时新连接会被拒绝,这在共享账号场景下很实用。CONNECT_TIME限制会话的总连接时长(分钟),IDLE_TIME限制会话的连续空闲时间(分钟)。空闲超时的会话并不会立刻被踢掉,而是要等它下一次发出操作时才被清理,实际使用中要理解这个惰性断开机制。

组合限制参数

COMPOSITE_LIMIT是一个加权总分限制,它把CPU时间、逻辑读、连接时长和私有SGA空间四项按权重折算成一个服务单元总数。可以通过ALTER RESOURCE COST语句调整各项权重,实现更灵活的综合控制。一个PROFILE中如果同时设置了单项限制和组合限制,则以先触发的那个为准。

利用PROFILE强化密码策略

除了资源限制,PROFILE还承担着密码策略管理的职责。这部分参数始终生效,无需开启RESOURCE_LIMIT,在企业安全合规审计中经常被用到。常用的参数包括:

  • FAILED_LOGIN_ATTEMPTS:允许的最大登录失败次数,超过则账号被锁定。
  • PASSWORD_LIFE_TIME:密码有效期天数,到期后进入宽限期。
  • PASSWORD_REUSE_TIMEPASSWORD_REUSE_MAX:控制旧密码的重用,前者规定多少天内不能重用,后者规定必须更换多少次后才能重用。
  • PASSWORD_LOCK_TIME:账号锁定后的自动解锁时间。
  • PASSWORD_GRACE_TIME:密码过期后的宽限期,期间会收到修改提示。
  • PASSWORD_VERIFY_FUNCTION:密码复杂度校验函数。

下面是一个包含密码策略的完整PROFILE定义,调用了系统自带的复杂度校验函数:

CREATE PROFILE secure_profile LIMIT
    FAILED_LOGIN_ATTEMPTS 5
    PASSWORD_LIFE_TIME 90
    PASSWORD_REUSE_TIME 365
    PASSWORD_REUSE_MAX 10
    PASSWORD_LOCK_TIME 1
    PASSWORD_GRACE_TIME 7
    PASSWORD_VERIFY_FUNCTION ORA12C_VERIFY_FUNCTION;

PASSWORD_VERIFY_FUNCTION可以指定为NULL表示不做复杂度校验,也可以使用数据库内置的校验函数,还可以编写自定义的PL/SQL函数实现企业内部的密码规范。函数必须隶属于SYS用户,并且签名要符合Oracle的规定。

使用PROFILE的注意事项

第一,修改PROFILE后立即对新会话生效,对已存在的会话,大部分资源限制也会动态生效,但理解生效时机可以避免排障时的困惑。第二,删除PROFILE前必须先将它从所有用户上解除,否则会报错,可以先执行ALTER USER xxx PROFILE DEFAULT;再执行DROP PROFILE。第三,查询DBA_PROFILES视图可以查看所有PROFILE的定义,配合DBA_USERS可以确认用户与PROFILE的关联关系。

SELECT p.profile, p.resource_name, p.limit
FROM dba_profiles p
JOIN dba_users u ON u.profile = p.profile
WHERE u.username = 'SCOTT';

最后要强调,资源限制是把双刃剑。阈值设置过紧会导致正常的批处理作业或报表查询被误杀,设置过松又起不到保护作用。建议先通过AWR报告或V$SESSTAT统计真实业务的资源消耗水平,再据此设定合理的阈值,并在上线后持续观察告警日志中的ORA-02392(超出CPU限制)、ORA-02396(超出空闲时间)等错误,逐步调优。通过PROFILE与数据库审计、资源管理器(Resource Manager)的配合,可以构建出一套完善的数据库资源管控体系。

Oracle PROFILE资源限制会话管理修改时间:2026-09-01 17:00:49

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。