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_SESSION和LOGICAL_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_TIME和PASSWORD_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