在Oracle数据库的日常运维中,“因密码过期导致用户无法登录”是极为常见的问题。默认配置下,Oracle会通过概要文件(Profile)设置密码有效期,通常为180天。一旦超过期限,相关账户将被限制访问,严重时甚至引发批量用户失效,影响业务连续性。
适用于数据库服务器本机操作,无需输入数据库密码,依赖操作系统用户权限完成身份验证。
适用于远程连接场景,需提供SYS用户的密码进行身份验证。
若登录过程中出现错误提示:
若不希望影响全部用户,可创建独立的概要文件并仅应用于指定账户:
用于识别是否存在“锁定+过期”的复合型问题:
无需手动构造SQL,直接运行以下查询生成处理语句:
DEFAULT
一、基础准备:以正确权限连接数据库(关键步骤)
所有后续操作均需使用具备SYSDBA权限的账户执行,普通用户无权修改系统级配置或用户状态。推荐以下两种登录方式: 方式1:本地操作系统认证(推荐)适用于数据库服务器本机操作,无需输入数据库密码,依赖操作系统用户权限完成身份验证。
[oracle@localhost ~]$ sqlplus / as sysdba
# 成功登录提示
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
方式2:远程/密码认证方式适用于远程连接场景,需提供SYS用户的密码进行身份验证。
[oracle@localhost ~]$ sqlplus sys/你的SYS密码@数据库IP:端口/服务名 as sysdba
注意事项:若登录过程中出现错误提示:
ORA-12154: TNS: 无法解析指定的连接标识符
请首先检查服务名是否配置正确,确认监听与实例名称匹配:
tnsping
二、处理流程详解:从诊断到解决
1. 查看当前密码策略配置
首先查询数据库中设定的密码有效期限,避免盲目调整:-- 设置查询结果显示宽度(避免字段截断)
SQL> set lines 999
SQL> set pages 100
-- 查询DEFAULT概要文件的密码有效期
SQL> SELECT profile, resource_name, limit
FROM dba_profiles
WHERE profile='DEFAULT'
AND resource_name IN ('PASSWORD_LIFE_TIME', 'PASSWORD_GRACE_TIME');
结果解析:
PASSWORD_LIFE_TIME:表示密码生命周期(如示例中的180天),若值为“UNLIMITED”,则代表永不过期
UNLIMITED
GRACE_TIME:指密码过期后的宽限期,在此期间仍可登录,但系统会提示修改密码PASSWORD_GRACE_TIME
PASSWORD_LIFE_TIME
如果查询结果为空,说明当前使用的概要文件未显式设置该参数,可能继承自系统默认配置(一般为180天):
DEFAULT
2. 修改全局策略:取消密码过期限制
为防止未来频繁出现此类问题,建议修改默认概要文件,使密码永久有效。此更改对所有使用该Profile的用户生效:-- 取消密码有效期+宽限期限制
SQL> ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME UNLIMITED -- 密码永不过期
PASSWORD_GRACE_TIME UNLIMITED; -- 取消宽限期(可选,避免弹窗提醒)
执行完成后,系统将返回成功提示:
Profile altered.
该设置立即生效,新创建用户自动继承,已有用户也无需额外操作。
扩展方案:为特定用户定制策略(可选)若不希望影响全部用户,可创建独立的概要文件并仅应用于指定账户:
-- 1. 创建自定义概要文件(无密码过期限制)
CREATE PROFILE no_expire_profile LIMIT PASSWORD_LIFE_TIME UNLIMITED;
-- 2. 给目标用户分配该概要文件
ALTER USER SCOTT PROFILE no_expire_profile;
3. 检查已过期或异常的用户账号
策略修改不会自动恢复已经过期的账户状态,必须手动处理。 (1) 查询密码已过期的用户列表(精准定位)SQL> SELECT username, account_status, expiry_date
FROM dba_users
WHERE account_status LIKE 'EXPIRED%';
结果解读:
- 状态显示为
表示密码已过期,用户无法登录EXPIRED - 状态为
表示处于宽限期内,可登录但强制要求修改密码EXPIRED(GRACE)
SCOTT
的状态为
EXPIRED
,应优先处理。
(2) 全面查看所有用户的登录状态(综合排查)用于识别是否存在“锁定+过期”的复合型问题:
SQL> SELECT username, account_status, expiry_date, profile
FROM dba_users
ORDER BY account_status;
输出内容包括:
- 账户当前状态(是否锁定或过期)
- 密码最后修改时间及过期时间
- 所使用的概要文件名称,可用于确认是否应用了
配置DEFAULT
4. 解锁被锁定的用户账户
当用户因多次输错密码导致账户被锁定(状态为LOCKED
),需先解锁才能继续操作:
-- 解锁单个用户(示例:SCOTT)
SQL> ALTER USER SCOTT ACCOUNT UNLOCK;
执行后显示如下提示即表示成功:
User altered.
支持批量解锁,可通过拼接SQL语句实现自动化处理:
-- 批量生成解锁SQL(复制结果执行)
SELECT 'ALTER USER ' || username || ' ACCOUNT UNLOCK;'
FROM dba_users
WHERE account_status LIKE 'LOCKED%';
5. 保留原密码重置过期账户(核心应用场景)
实际工作中,多数用户希望保持原有密码不变,仅解除过期限制。由于Oracle将密码哈希存储于数据字典表中,可通过提取原始哈希实现“无感知”恢复。 (1) 获取用户密码哈希值-- 示例:查询SCOTT用户的密码哈希
SQL> SELECT name, spare4, password
FROM sys.user$
WHERE name = 'SCOTT';
版本差异说明:
- Oracle 12c及以上版本:主要使用
字段,格式为spare4S:XXX - Oracle 11g及以下版本:密码哈希存于
字段password
sys.user$
为确保兼容性,重置时需结合两个字段生成完整哈希串。
(2) 自动生成保留原密码的批量重置脚本无需手动构造SQL,直接运行以下查询生成处理语句:
SQL> SELECT
'ALTER USER ' || su.name || ' IDENTIFIED BY VALUES '''
|| su.spare4 || NVL(';' || su.password, '') || ''';' AS 重置脚本
FROM sys.user$ su
JOIN dba_users du
ON su.name = du.username
AND du.account_status LIKE 'EXPIRED%';
输出示例:
系统将为每个过期用户生成对应的ALTER USER命令,例如:
ALTER USER SCOTT IDENTIFIED BY VALUES 'S:XXX;XXX';
(3) 执行生成的重置语句
复制上一步输出的所有命令并批量执行:
-- 示例:执行SCOTT用户的重置SQL
SQL> ALTER USER SCOTT IDENTIFIED BY VALUES 'S:XXX;XXX';
执行成功后提示:
User altered.
此时用户即可使用原有密码正常登录,其过期状态已被清除。
6. 手动设置新密码(按需选择)
若需主动为用户更换密码,可执行:-- 示例:修改CESHI用户密码为123456(需符合密码策略)
SQL> ALTER USER CESHI IDENTIFIED BY 123456;
注意:
新密码必须符合当前概要文件的安全规则(如长度不少于8位、包含字母、数字和特殊字符等),否则会报错:
ORA-28003: 口令验证失败
如需降低复杂度(仅限测试环境,生产环境不推荐),可调整默认概要文件策略:
ALTER PROFILE DEFAULT LIMIT
PASSWORD_MIN_LENGTH 6 -- 最小长度6位
PASSWORD_COMPLEXITY 'NONE'; -- 取消复杂度要求
三、生产环境操作建议(避坑指南)
- 操作前备份:在修改
概要文件或批量处理用户前,建议导出相关数据作为恢复依据:DEFAULTCREATE TABLE dba_profiles_bak AS SELECT * FROM dba_profiles; CREATE TABLE dba_users_bak AS SELECT * FROM dba_users; - 权限控制:所有操作必须以
身份执行,否则会出现权限不足错误:SYSDBAORA-01031: 权限不足 - 版本兼容性:
- Oracle 12c及以上版本必须使用
字段参与哈希拼接,仅用spare4
将导致密码无效password - 11g及以下版本无
字段,直接使用spare4
即可password
- Oracle 12c及以上版本必须使用
- 批量操作前测试:建议先选取一个非核心用户(如
)验证整个流程,确认无误后再推广至其他账户SCOTT - 定期巡检:建议每月执行一次过期用户扫描,提前发现潜在风险:
-- 定时任务查询脚本 SELECT username, account_status, expiry_date FROM dba_users WHERE account_status LIKE 'EXPIRED%' OR (expiry_date IS NOT NULL AND expiry_date < SYSDATE + 30); -- 提前30天预警
四、常见错误代码与应对措施
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
| ORA-01031: 权限不足 | 未以SYSDBA身份登录 | 重新使用
方式登录
|
| ORA-28003: 口令验证失败 | 新密码不符合验证规则 | 检查密码复杂度策略,或临时放宽限制 |
密码不符合当前配置文件的策略要求,可采取以下两种方式解决:
1. 根据现有策略要求调整密码,确保符合复杂度、长度等规定;
2. 调整或放宽数据库密码策略(具体操作可参考后续步骤6)。
ORA-01918: 用户不存在
此错误通常由用户名拼写错误引起。需要注意的是,Oracle数据库中的用户名是区分大小写的,系统默认情况下以大写形式存储。
建议执行以下操作进行核实:
SELECT username FROM dba_users;
通过查询确认目标用户名的正确性。
ORA-01940: 无法删除正处于连接状态的用户
当尝试解锁或修改某一用户时,若该用户当前仍与数据库保持连接,则会触发此错误。
解决方法为:首先终止该用户的活动会话。
可通过以下命令终止会话:
ALTER SYSTEM KILL SESSION 'sid,serial#';
其中,所需的 sid 和 serial# 参数可通过如下查询获取:
v$session

雷达卡


京公网安备 11010802022788号







