需求场景:
对于用户密码这个敏感的字眼,在维护工作中绝对不陌生,定时更新复杂度密码三个月有效期等一次次被提及,事实在工作中,很少有企业能保持高频率的更新密码的。
今天大嘴就遇到这么个情况,oracle下的数据库用户,用户密码过期,导致库连接不上,无法获取数据,所以今天就总结学习一下oracle如何配置用户密码永不过期。
♥oracle配置用户密码永不过期:
首先我们需要了解下用户的资源配置profile文件,oracle中的profile是用来对用户所能使用的数据库资源进行限制的;
所以我们需要通过对profile的配置,从而配置oracle用户密码的永不过期;
①、查看用户关联的profile文件:
cSQL> select username,profile from dba_users;
USERNAME PROFILE
------------- ------------------------------
DBSNMP MONITORING_PROFILE
SYSMAN DEFAULT
MGMT_VIEW DEFAULT
SYS DEFAULT
、、、、、、
可以看到大部分用户的profile文件是DEFAULT;
②、查看用户默认profile文件DEFAULT指定的密码有效时间:
SQL> select * from dba_profiles s where s.profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';
PROFILE RESOURCE_NAME RESOURCE LIMIT
------- ---------------------- ----------- ------------
DEFAULT PASSWORD_LIFE_TIME PASSWORD 180
注意:DEFAULT和PASSWORD_LIFE_TIME必须大写,可以看到密码有效期是180天;
③、将密码有效期由180天修改为无限期:
SQL> alter profile DEFAULT limit PASSWORD_LIFE_TIME UNLIMITED;
Profile altered.
SQL> select * from dba_profiles s where s.profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';
PROFILE RESOURCE_NAME RESOURCE LIMIT
------- -------------------- ----------- ------------
DEFAULT PASSWORD_LIFE_TIME PASSWORD UNLIMITED
如此,有效期已经为UNLIMITED永不过期啦;(配置即生效,无需重启数据库)
当然这里配置的所以关联了DEFAULT的用户,如果只想单独配置某个用户密码永不过期呢?这就需要给此用户单独配置个密码永不过期的profile文件。
扩展一:给单一用户设置密码永不过期
①、查看TEST这个用户的密码有效期、状态、和用户关联的profile文件,一般默认为DEFAULT;
SQL>select username, user_id, account_status, expiry_date, profile from dba_users where username = 'TEST';
②、同样,我们也可以查看下用户关联的profile文件指定的密码有效期时间:
SQL>select * from dba_profiles s where s.profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';
③、要想给单独的用户配置,需要单独给这个用户创建一个用户profile文件并着个文件指定的密码是永不过期的:
SQL>create profile passwd_unlimit limit PASSWORD_LIFE_TIME unlimited;
④、把上面密码永不过期的profile文件关联到TEST用户:
SQL>alter user TEST profile passwd_unlimit;
⑤、如此,TEST这个用户的密码指定为永不过期,我们可以通过dba_users查看一下TEST的profile是否配置成功:
SQL>select username, user_id, account_status, expiry_date, profilefrom dba_users where username ='TEST';
⑥、我们也可以查看一下passwd_unlimit这个profile文件的附属资源配置:
SQL>SELECT * FROM dba_profiles s WHERE s.profile = 'PASSWD_UNLIMIT';
(从结果阔以得出其中profile文件资源配置PASSWORD_LIFE_TIME设置确实为UNLIMITED)
扩展二、oracle12c基于pdb的用户密码永不过期配置
上面的方法事实上适应11g和12c,但是如果oracle12使用是基于pdb的可插播数据库配置,在查看上多了点花样,需要我们先切换到pdb终端中,我们来一起看下吧:
看之前,先了解下pdb的概念,在Oracle 12C中引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库;
oracle 11g中我们使用的实例创建创建数据库,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。
SQL> select name from V$database;
NAME
---------
EXAMPLE
而当进入ORACLE 12C后,通过cdb和pdb的新特性,实例与数据库可以是一对多的关系。
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCL MOUNTED
5 PDB_TEST READ WRITE NO
当然这里我们不深究它具体怎么创建库和用户的关联,从上面可以看到pdbs中有三个pdb,其中PDB$SEED、ORCL为默认模板库,我们不用处理,PDB_TEST显然就是我们要使用的库;
①、切换到目标pdb:
SQL> alter session set container=PDB_TEST;
Session altered.
②、使用select命令查看pdb中所有用户库的account_status是否都是open状态,以及到期expipy_date和创建created的时间:
SQL> select username,expiry_date,account_status,created from dba_users where created > (select created from v$database);
USERNAME EXPIRY_DATE ACCOUNT_STATUS CREATED
----------------- --------------- ------------------ -----------------------------
EWS_001 OPEN 08-AUG-17
PDB_002 OPEN 08-AUG-17
PDB_003 OPEN 08-AUG-17
如果库的用户有效期时间为空,则表示永不过期,否则会显示到期时间;
③、当然我们也可以查看用户的profile文件以及profile文件指定的密码有效期设置:
SQL> select username,PROFILE from dba_users;
USERNAME PROFILE
------------------- ----------
SYS DEFAULT
、、、、、、
SQL> select * from dba_profiles s where s.profile = 'DEFAULT' and resource_name = 'PASSWORD_LIFE_TIME';
PROFILE RESOURCE_NAME RESOURCE LIMIT
---------- ------------------ ------------ ------------
DEFAULT PASSWORD_LIFE_TIME PASSWORD UNLIMITED
--- --- ---
COM INH IMP
--- --- ---
NO NO NO
④、设置password_life_time为永不过期,方法是一样的,配置完后可以通过②的语句查看下;
SQL>alter profile default limit password_life_time unlimited;
Profile altered.
扩展三:上面两个故障针对oracle12c的pdbs配置,同样的问题在oracle 11g中思路是一样的:
(好的今天就分享到这里,如果你有高见或好的分享,记得留言哦!)