Oracle Profile 与资源限制

Oracle Profile 与资源限制

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Profile(配置文件) 用于限制数据库用户使用的资源[1]:

限制类型示例
会话资源CPU、连接时间、空闲时间
密码策略失败次数、过期时间、复杂度
并发限制每用户会话数

2. Profile 创建

2.1 创建语法

CREATE PROFILE app_profile LIMIT
  -- 资源限制
  SESSIONS_PER_USER 5              -- 每用户最多 5 个并发会话
  CPU_PER_SESSION UNLIMITED        -- 单会话 CPU 不限制(百分之一秒)
  CPU_PER_CALL 1000                -- 单次调用最多 1000 厘秒
  CONNECT_TIME 60                  -- 单会话最长 60 分钟
  IDLE_TIME 15                     -- 空闲超时 15 分钟
  LOGICAL_READS_PER_SESSION UNLIMITED  -- 单会话逻辑读不限
  LOGICAL_READS_PER_CALL 10000     -- 单次调用最多 10000 逻辑读
  PRIVATE_SGA 10M                  -- 共享服务器模式下 UGA 上限
  
  -- 密码限制
  FAILED_LOGIN_ATTEMPTS 5          -- 失败 5 次锁定
  PASSWORD_LIFE_TIME 90            -- 密码 90 天过期
  PASSWORD_REUSE_TIME 365          -- 365 天内不能复用
  PASSWORD_REUSE_MAX 5             -- 修改 5 次后才能复用
  PASSWORD_LOCK_TIME 1             -- 锁定 1 天
  PASSWORD_GRACE_TIME 7            -- 过期后 7 天宽限
  PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function;

2.2 修改 Profile

ALTER PROFILE app_profile LIMIT
  SESSIONS_PER_USER 10
  PASSWORD_LIFE_TIME 180;

2.3 删除 Profile

DROP PROFILE app_profile;
-- 若有用户使用,需 CASCADE
DROP PROFILE app_profile CASCADE;

3. 资源限制详解

3.1 SESSIONS_PER_USER

-- 限制每用户最多 5 个会话
SESSIONS_PER_USER 5
-- 第 6 个会话报 ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit

3.2 CPU 限制

-- CPU_PER_SESSION:单会话总 CPU 时间(百分之一秒)
CPU_PER_SESSION 10000  -- 100 秒

-- CPU_PER_CALL:单次调用 CPU
CPU_PER_CALL 1000      -- 10 秒

3.3 时间限制

-- CONNECT_TIME:会话最长连接时间(分钟)
CONNECT_TIME 60  -- 60 分钟后自动断开

-- IDLE_TIME:空闲超时(分钟)
IDLE_TIME 15  -- 15 分钟无活动自动断开

3.4 逻辑读限制

-- LOGICAL_READS_PER_SESSION:单会话逻辑读次数
LOGICAL_READS_PER_SESSION 100000

-- LOGICAL_READS_PER_CALL:单次调用逻辑读
LOGICAL_READS_PER_CALL 10000

3.5 内存限制

-- PRIVATE_SGA:共享服务器模式下 UGA 大小
PRIVATE_SGA 10M

3.6 启用资源限制

-- 必须启用才生效
ALTER SYSTEM SET resource_limit=TRUE SCOPE=BOTH;

-- 查看状态
SHOW PARAMETER resource_limit;

4. 密码策略

4.1 密码长度与复杂度

-- 使用 Oracle 预定义函数
PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function;

-- 或自定义函数
PASSWORD_VERIFY_FUNCTION my_verify_function;

4.2 预定义 VERIFY 函数

-- Oracle 12c+ 默认提供
SELECT function_name, complexity 
FROM dba_verify_functions;

-- ora12c_strong_verify_function
-- - 至少 9 字符
-- - 至少 1 个大写、1 个小写
-- - 至少 1 个数字
-- - 至少 1 个特殊字符
-- - 与用户名不同
-- - 与旧密码至少 3 个字符不同

-- ora12c_verify_function
-- - 至少 8 字符
-- - 至少 1 个大写、1 个小写、1 个数字
-- - 与用户名不同

4.3 自定义密码函数

CREATE OR REPLACE FUNCTION my_verify_function(
  username VARCHAR2,
  password VARCHAR2,
  old_password VARCHAR2
) RETURN BOOLEAN IS
BEGIN
  -- 长度至少 12 字符
  IF LENGTH(password) < 12 THEN
    RETURN FALSE;
  END IF;
  
  -- 必须包含特殊字符
  IF NOT REGEXP_LIKE(password, '[!@#$%^&*]') THEN
    RETURN FALSE;
  END IF;
  
  -- 不能与用户名相同
  IF password = ****** THEN
    RETURN FALSE;
  END IF;
  
  RETURN TRUE;
END;
/

-- 使用
ALTER PROFILE app_profile LIMIT
  PASSWORD_VERIFY_FUNCTION my_verify_function;

4.4 密码过期与复用

-- 密码 90 天过期
PASSWORD_LIFE_TIME 90

-- 过期后 7 天宽限(可登录但提示修改)
PASSWORD_GRACE_TIME 7

-- 365 天内不能复用旧密码
PASSWORD_REUSE_TIME 365

-- 必须修改 5 次才能复用
PASSWORD_REUSE_MAX 5

-- 两者只能设置一个,另一个设为 UNLIMITED
-- PASSWORD_REUSE_TIME UNLIMITED
-- PASSWORD_REUSE_MAX 5

4.5 失败锁定

-- 失败 5 次锁定
FAILED_LOGIN_ATTEMPTS 5

-- 锁定 1 天
PASSWORD_LOCK_TIME 1

5. 分配 Profile

5.1 创建用户时指定

CREATE USER scott IDENTIFIED BY ******
  DEFAULT TABLESPACE users
  PROFILE app_profile;

5.2 修改用户 Profile

ALTER USER scott PROFILE app_profile;

5.3 默认 Profile

-- 所有用户的默认 Profile
SELECT profile, resource_name, limit 
FROM dba_profiles 
WHERE profile='DEFAULT';

-- 修改 DEFAULT
ALTER PROFILE DEFAULT LIMIT
  FAILED_LOGIN_ATTEMPTS 3
  PASSWORD_LIFE_TIME 180;

6. 查看 Profile

6.1 Profile 定义

SELECT 
  profile,
  resource_name,
  resource_type,
  limit
FROM dba_profiles
WHERE profile='APP_PROFILE'
ORDER BY resource_type, resource_name;

6.2 用户的 Profile

SELECT 
  username, 
  profile, 
  account_status
FROM dba_users
WHERE username='SCOTT';

6.3 资源使用

-- 当前会话资源使用
SELECT 
  name, 
  value
FROM v$sesstat
WHERE sid = USERENV('SID')
  AND statistic# IN (
    SELECT statistic# FROM v$statname 
    WHERE name IN (
      'session cpu memory',
      'CPU used by this session',
      'session logical reads',
      'session pga memory'
    )
  );

7. 19c 密码策略新特性

7.1 密码复杂度组合

-- 19c 支持多个验证函数
ALTER PROFILE app_profile LIMIT
  PASSWORD_VERIFY_FUNCTION 
    ora12c_strong_verify_function,
    ora12c_strong_verify_function_schema;

7.2 密码过期登录失败

-- 19c 引入 FAILED_LOGIN_ATTEMPTS 与 PASSWORD_LIFE_TIME 联动
-- 过期后宽限期内登录失败次数
ALTER PROFILE app_profile LIMIT
  PASSWORD_LIFE_TIME 90
  PASSWORD_GRACE_TIME 7
  FAILED_LOGIN_ATTEMPTS 5;

7.3 INACTIVE_ACCOUNT_TIME

-- 不活动账户自动锁定(19c+)
ALTER PROFILE app_profile LIMIT
  INACTIVE_ACCOUNT_TIME 30;
-- 30 天不登录则锁定

8. 多租户 Profile

8.1 Common Profile

-- CDB 根创建 Common Profile
CREATE PROFILE c##app_profile LIMIT
  FAILED_LOGIN_ATTEMPTS 5
  CONTAINER=ALL;

8.2 Local Profile

-- PDB 中创建
ALTER SESSION SET CONTAINER = salespdb;
CREATE PROFILE sales_profile LIMIT
  SESSIONS_PER_USER 10;

9. 常见坑与排错

9.1 资源限制不生效

现象:Profile 已设置但未限制。

修复

-- 1. 启用资源限制
ALTER SYSTEM SET resource_limit=TRUE SCOPE=BOTH;

-- 2. 检查参数
SHOW PARAMETER resource_limit;

9.2 用户被频繁锁定

现象:用户多次登录失败被锁。

修复

-- 1. 解锁
ALTER USER scott ACCOUNT UNLOCK;

-- 2. 调整 FAILED_LOGIN_ATTEMPTS
ALTER PROFILE default LIMIT FAILED_LOGIN_ATTEMPTS 10;

9.3 密码过于严格

现象:用户难以设置密码。

修复

-- 调整 PASSWORD_VERIFY_FUNCTION
ALTER PROFILE app_profile LIMIT
  PASSWORD_VERIFY_FUNCTION NULL;  -- 关闭验证
-- 或使用更宽松的函数

9.4 IDLE_TIME 失效

现象:用户空闲超时未生效。

修复

-- 1. 启用 resource_limit
ALTER SYSTEM SET resource_limit=TRUE SCOPE=BOTH;

-- 2. PMON 自动检测(每 3 秒)
-- 3. 检查 Profile
SELECT limit FROM dba_profiles 
WHERE profile='APP_PROFILE' AND resource_name='IDLE_TIME';

9.5 共享服务器下 PRIVATE_SGA 无效

原因:仅共享服务器模式下生效。

修复

  • 使用共享服务器
  • 或限制 PGA(全局参数)

10. 最佳实践

  1. 创建专用 Profile:不同业务不同 Profile
  2. 启用 resource_limit:保证限制生效
  3. 密码复杂度:使用 ora12c_strong_verify_function
  4. 定期修改密码:90-180 天
  5. 失败锁定:5 次失败锁 1 天
  6. 资源限制:避免资源耗尽
  7. 不活动账户锁定(19c+):INACTIVE_ACCOUNT_TIME
  8. 审计 Profile 变更AUDIT ALTER PROFILE
  9. 多租户分级管理:Common/Local
  10. 定期审查 Profile:业务变化时调整

11. 参考资料

[1] Oracle Database Security Guide 19c, “Managing Profiles” https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/managing-administrative-privileges.html

[2] Oracle Database Administrator’s Guide 19c, “Managing Profiles” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/administering-user-accounts-security.html