楼主: AX79xJBzDmKU
611 0

Oracle数据库密码过期解决方案 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-6-23
最后登录
2018-6-23

楼主
AX79xJBzDmKU 发表于 2025-11-24 18:07:42 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
在Oracle数据库的日常运维中,“因密码过期导致用户无法登录”是极为常见的问题。默认配置下,Oracle会通过概要文件(Profile)设置密码有效期,通常为180天。一旦超过期限,相关账户将被限制访问,严重时甚至引发批量用户失效,影响业务连续性。
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及以上版本:主要使用
    spare4
    字段,格式为
    S: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'; -- 取消复杂度要求

三、生产环境操作建议(避坑指南)

  • 操作前备份:在修改
    DEFAULT
    概要文件或批量处理用户前,建议导出相关数据作为恢复依据:
    CREATE TABLE dba_profiles_bak AS SELECT * FROM dba_profiles;
    CREATE TABLE dba_users_bak AS SELECT * FROM dba_users;
  • 权限控制:所有操作必须以
    SYSDBA
    身份执行,否则会出现权限不足错误:
    ORA-01031: 权限不足
  • 版本兼容性:
    • Oracle 12c及以上版本必须使用
      spare4
      字段参与哈希拼接,仅用
      password
      将导致密码无效
    • 11g及以下版本无
      spare4
      字段,直接使用
      password
      即可
  • 批量操作前测试:建议先选取一个非核心用户(如
    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身份登录 重新使用
sqlplus / as 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
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Oracle 解决方案 CLE ACL 数据库

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
扫码
拉您进交流群
GMT+8, 2026-2-7 16:41