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. 最佳实践
- 创建专用 Profile:不同业务不同 Profile
- 启用 resource_limit:保证限制生效
- 密码复杂度:使用 ora12c_strong_verify_function
- 定期修改密码:90-180 天
- 失败锁定:5 次失败锁 1 天
- 资源限制:避免资源耗尽
- 不活动账户锁定(19c+):INACTIVE_ACCOUNT_TIME
- 审计 Profile 变更:
AUDIT ALTER PROFILE - 多租户分级管理:Common/Local
- 定期审查 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