Profile和SQL Profile是不同的,前者是用CREATE PROFILE创建,后者和SQL Tuning有关。
profile的定义为:
which is a set of limits on database resources. If you assign the profile to a user, then that user cannot exceed these limits.
profile用CREATE PROFILE
创建,然后用CREATE USER
或 ALTER USER
赋予用户。
profile分为口令相关和资源相关2类。
看下语法:
资源相关的限制包括:
口令相关的限制包括:
由于多租户的关系,profile又分为common和local两种。
以下的示例均在PDB中执行:
SQL> select username, profile from dba_users where username = 'SSB';USERNAME PROFILE
___________ __________
SSB DEFAULTSELECTresource_name,resource_type,limit
FROMdba_profiles
WHEREprofile = 'DEFAULT'
ORDER BYresource_type,resource_name;RESOURCE_NAME RESOURCE_TYPE LIMIT
____________________________ ________________ ________________________________
COMPOSITE_LIMIT KERNEL UNLIMITED
CONNECT_TIME KERNEL UNLIMITED
CPU_PER_CALL KERNEL UNLIMITED
CPU_PER_SESSION KERNEL UNLIMITED
IDLE_TIME KERNEL UNLIMITED
LOGICAL_READS_PER_CALL KERNEL UNLIMITED
LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
PRIVATE_SGA KERNEL UNLIMITED
SESSIONS_PER_USER KERNEL UNLIMITED
FAILED_LOGIN_ATTEMPTS PASSWORD 3
INACTIVE_ACCOUNT_TIME PASSWORD UNLIMITED
PASSWORD_GRACE_TIME PASSWORD 7
PASSWORD_LIFE_TIME PASSWORD 60
PASSWORD_LOCK_TIME PASSWORD 1
PASSWORD_REUSE_MAX PASSWORD 5
PASSWORD_REUSE_TIME PASSWORD 365
PASSWORD_ROLLOVER_TIME PASSWORD 0
PASSWORD_VERIFY_FUNCTION PASSWORD ORA12C_STRONG_VERIFY_FUNCTION18 rows selected.
口令相关的限制
FAILED_LOGIN_ATTEMPTS
Specify the number of consecutive failed attempts to log in to the user account before the account is locked.
这个很好理解,你输错3次口令,第4次时,会报错如下:
$ sqlplus ssb/Wrong_password@orclpdb1SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jul 17 01:47:05 2023
Version 19.19.0.0.0Copyright (c) 1982, 2022, Oracle. All rights reserved.ERROR:
ORA-28000: The account is locked.Enter user-name:
此时必须通过sys用户解锁用户:
SQL> alter user ssb account unlock;User altered.
PASSWORD_LIFE_TIME
同一密码可用于身份验证的天数。即口令的有效期。
PASSWORD_REUSE_TIME 和 PASSWORD_REUSE_MAX
这两个参数必须一起设置。而且必须同时满足,例如30天内口令修改10次。
INACTIVE_ACCOUNT_TIME
指定允许连续无登录用户帐户的天数,超过后帐户将被锁定。
PASSWORD_GRACE_TIME
指定宽限期开始后的天数,在此期间发出警告并允许登录。
PASSWORD_LOCK_TIME
指定连续尝试登录失败指定次数后帐户将被锁定的天数。
PASSWORD_ROLLOVER_TIME
Gradual Database Password Rollover是21c的功能,现已移植到19c。
简单来说,此功能允许新老口令并存一段时间,之后就只允许新口令登录了。
此功能的介绍也可以参见这里。
关于此功能的例子,可参见这里,非常全面且好理解。
核心在这里:
SQL> alter user testuser1 identified by &NewPassword;
alter user testuser1 identified by &NewPassword
*
ERROR at line 1:
ORA-28221: REPLACE not specifiedSQL> !oerr ORA 28221
28221, 00000, "REPLACE not specified"
// *Cause: User is changing password but password verification function is
// turned on and the original password is not specified and the
// user does not have the alter user system privilege.
// *Action: Supply the original password.SQL> alter user testuser1 identified by &NewPassword replace &OldPassword;User altered.-- 新老口令都可以连接数据库
SQL> connect testuser1/&NewPassword##@orclpdb1
Connected.SQL> connect testuser1/&OldPassword##@orclpdb1
Connected.
PASSWORD_VERIFY_FUNCTION
如果设为null,则无口令验证。
资源相关的限制
SESSIONS_PER_USER
指定要限制用户的并发会话数。
我对此参数印象如此深刻,因为Tom Kyte在其书《Expert Oracle Database Architecture》中 Solving Problems Simply一节提到过,说明了Oracle数据库的简洁性。
示例:
-- run as SYS user
create profile profile1 limit SESSIONS_PER_USER 1;
alter user ssb profile profile1;
-- run as SSB user
SQL> connect ssb@orclpdb1
Connected.
-- issue another new connection
SQL> connect ssb@orclpdb1
ERROR:
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit
恢复:
alter user ssb profile default;
CPU_PER_SESSION
指定会话的 CPU 时间限制,单位为百分之一秒。
这个例子比较极端,不过可以说明问题:
alter profile profile1 limit CPU_PER_SESSION 1;
alter user ssb profile profile1;-- login as ssb
connect ssb@orclpdb1;DECLAREj FLOAT;
BEGINFOR i IN 1..10000 LOOPSELECTsqrt(1000)INTO jFROMdual;END LOOP;
END;
/ERROR at line 1:
ORA-02392: exceeded session limit on CPU usage, you are being logged off
ORA-06512: at line 7
CPU_PER_CALL
指定调用(解析、执行或获取)的 CPU 时间限制,以百分之一秒表示。
这个和上一个类似,就不举例了。
CONNECT_TIME
指定会话的总运行时间限制(以分钟为单位)。
这个也比较容易演示,因为connect time就是elapsed time:
alter profile profile1 limit CONNECT_TIME 1;SQL> exec DBMS_SESSION.SLEEP(60);PL/SQL procedure successfully completed.SQL> exec DBMS_SESSION.SLEEP(60);
BEGIN DBMS_SESSION.SLEEP(60); END;*
ERROR at line 1:
ORA-02399: exceeded maximum connect time, you are being logged off
IDLE_TIME
指定会话期间允许的连续不活动时间段(以分钟为单位)。 长时间运行的查询和其他操作不受此限制。
当您设置 X 分钟的空闲超时时,请注意,会话将需要额外几分钟才能终止。
在客户端应用程序端,错误消息仅在下次空闲客户端尝试发出新命令时显示。
这个也很好演示:
SQL> select 1 from dual;
select 1 from dual
*
ERROR at line 1:
ORA-02396: exceeded maximum idle time, please connect again
LOGICAL_READS_PER_SESSION
指定处理 SQL 语句(解析、执行或获取)的调用所允许读取的数据块数量。
LOGICAL_READS_PER_CALL
指定处理 SQL 语句(解析、执行或获取)的调用所允许读取的数据块数量。
PRIVATE_SGA
指定会话可以在系统全局区域 (SGA) 的共享池中分配的专用空间量。 有关该子句的信息,请参阅 size_clause。
注意:此限制仅在您使用共享服务器架构时适用。 SGA 中会话的私有空间包括私有 SQL 和 PL/SQL 区域,但不包括共享 SQL 和 PL/SQL 区域。
COMPOSITE_LIMIT
指定会话的总资源成本,以服务单位表示。 Oracle 数据库将总服务单位计算为 CPU_PER_SESSION、CONNECT_TIME、LOGICAL_READS_PER_SESSION 和 PRIVATE_SGA 的加权和。
参考
- Oracle CREATE PROFILE
- How to Create Profiles and Password Management in Oracle DBA
- A Simple Guide to Lockdown Profiles
- Limited Profiles and Private References