解決 ORA-28000: the account is locked 帳號鎖定完整處理流程
Oracle 預設密碼驗證檔 (DEFAULT Profile) 設定 FAILED_LOGIN_ATTEMPTS = 10,連續 10 次登入失敗即鎖定帳號,報錯 ORA-28000: the account is locked。本文提供標準解鎖流程、根因分析與預防配置。
一、標準解鎖三步驟 (需 DBA 權限)
SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE, EXPIRY_DATE
FROM DBA_USERS
WHERE USERNAME = 'SCOTT';
ACCOUNT_STATUS:OPEN 正常、LOCKED 鎖定、EXPIRED 密碼過期、LOCKED(TIMED) 臨時鎖定 (PASSWORD_LOCK_TIME 到期自動解鎖)。
LOCK_DATE:鎖定發生時間,配合應用日誌排查來源。
三、根因分析:為什麼會被鎖定?
| 原因類別 | 典型場景 | 排查方向 |
| 應用配置錯誤 | 連線池密碼過舊、配置檔明文密碼錯誤 | 檢查所有應用節點配置、CI/CD 部署變更記錄 |
| 暴力破解/掃描 | 公網暴露 1521 埠、弱口令被嘗試 | 防火牆限制存取 IP、啟用 Oracle Connection Manager、強制複雜密碼 |
| 批次作業/腳本 | 排程腳本硬編碼舊密碼、重試邏輯無上限 | 改用 Wallet/外部認證、加入指數退避重試 |
| 開發人員手誤 | 工具 (PL/SQL, DBeaver) 存儲舊密碼反覆嘗試 | 清理工具存儲密碼、統一使用密碼管理器 |
四、預防配置:調整 Profile 參數
SET SERVEROUTPUT ON
BEGIN
FOR u IN (SELECT USERNAME FROM DBA_USERS WHERE ACCOUNT_STATUS LIKE 'LOCKED%') LOOP
BEGIN
EXECUTE IMMEDIATE 'ALTER USER ' || u.USERNAME || ' ACCOUNT UNLOCK';
DBMS_OUTPUT.PUT_LINE('UNLOCKED: ' || u.USERNAME);
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('FAILED: ' || u.USERNAME || ' - ' || SQLERRM);
END;
END LOOP;
END;
/
-- 謹慎執行:確認鎖定非安全事件後再批量解鎖
六、審計追蹤:鎖定前的失敗登入記錄
- 上一篇文章: Oracle 忘記密碼找回完整指南:SYSDBA 免密登入、建用戶、改密碼、解鎖一條龍
- 下一篇文章: ORA-21561: OID generation failed 根因定位:/etc/hosts 主機名配置缺失導致 DBCA 建庫失敗
Copyright ©
程式碼之家 All Rights Reserved