現象:安裝完成無法登入
ERROR:
ORA-28000: the account is locked
-- 或
ORA-01017: invalid username/password; logon denied
根因分析:11g 之後的安全性變更
| 版本 | SCOTT 預設狀態 | SYSTEM 密碼 | SYS 密碼 |
| 10g 及以前 | 解鎖,密碼 TIGER | 預設 MANAGER | 預設 CHANGE_ON_INSTALL |
| 11g+ | 鎖定,密碼過期 | 安裝時自訂 | 安裝時自訂 |
| 12c+ (CDB/PDB) | PDB 內鎖定 | CDB$ROOT 與 PDB 各自設定 | CDB$ROOT 設定 |
標準解決流程
步驟 1:確認可用的管理帳號
- 安裝時設定的 SYS/SYSTEM 密碼
- OS 認證:
sqlplus / as sysdba(需 OS dba 群組)
步驟 2:以管理員身分連線
$ sqlplus system/your_install_password
-- 或
$ sqlplus / as sysdba
步驟 3:解鎖 SCOTT 並重設密碼
SQL> ALTER USER scott ACCOUNT UNLOCK;
User altered.
SQL> ALTER USER scott IDENTIFIED BY tiger_new;
User altered.
SQL> GRANT CREATE SESSION TO scott; -- 確保連線權限
Grant succeeded.
步驟 4:驗證登入
SQL> CONNECT scott/tiger_new
Connected.
12c/18c/19c 多租戶 (CDB/PDB) 特殊處理
容器資料庫架構
CDB$ROOT (容器根)
├── PDB$SEED (模板)
├── PDB1 (應用 PDB)
└── PDB2 (應用 PDB)
常見錯誤:連到 CDB$ROOT 卻找不到 PDB 的使用者
-- 錯誤:在 CDB$ROOT 查詢 PDB 使用者
SQL> SELECT username FROM dba_users WHERE username = 'SCOTT';
-- 無結果
-- 正確:切換到 PDB
SQL> ALTER SESSION SET CONTAINER = PDB1;
-- 或連線時指定
$ sqlplus system/password@//host:1521/PDB1
PDB 中解鎖 SCOTT
-- 以 CDB 管理員連線
$ sqlplus sys/password@//host:1521/PDB1 AS SYSDBA
-- 或進入 CDB 後切換
SQL> ALTER SESSION SET CONTAINER = PDB1;
SQL> ALTER USER scott ACCOUNT UNLOCK IDENTIFIED BY tiger_new;
SQL> GRANT CREATE SESSION TO scott;
其他常見連線失敗原因對照表
| 錯誤代碼 | 原因 | 解決方案 |
| ORA-12154 | TNS 別名解析失敗 | 檢查 tnsnames.ora、使用 EZConnect //host:port/service |
| ORA-12541 | 監聽器未啟動 | lsnrctl start、檢查防火牆 port 1521 |
| ORA-12514 | 服務未註冊 | 等待 PMON 自動註冊、或 ALTER SYSTEM REGISTER |
| ORA-01017 | 帳號/密碼錯誤 | 確認大小寫、特殊字元、鎖定狀態 |
| ORA-28001 | 密碼過期 | ALTER USER ... IDENTIFIED BY newpass |
| ORA-28002 | 密碼即將過期 (寬限期) | 儘快變更密碼 |
| ORA-02391 | 超過同時連線限制 | 調整 Profile SESSIONS_PER_USER 或殺掉閒置 Session |
| ORA-12528 | 監聽器所有處理程序忙碌 | 調整 PROCESSES 參數、檢查連線洩漏 |
自動化檢查腳本
-- check_accounts.sql
SET LINESIZE 200 PAGESIZE 1000
COL username FOR A30
COL account_status FOR A20
COL profile FOR A20
COL default_tablespace FOR A20
SELECT username, account_status, lock_date, expiry_date, profile, default_tablespace
FROM dba_users
WHERE username IN ('SYS','SYSTEM','SYSMAN','DBSNMP','SCOTT','HR','OE','PM','SH','IX','BI')
ORDER BY username;
-- 12c+ 多租戶:檢查所有 PDB
SET SERVEROUTPUT ON
BEGIN
FOR p IN (SELECT name, con_id FROM v$pdbs WHERE open_mode = 'READ WRITE') LOOP
DBMS_OUTPUT.PUT_LINE('=== PDB: ' || p.name || ' ===');
EXECUTE IMMEDIATE
'SELECT username, account_status FROM dba_users
WHERE username IN (''SCOTT'',''HR'')'
INTO ...; -- 實務用 DBMS_SQL 或反射
END LOOP;
END;
/
最佳實務:安裝後標準化初始化
- 立即修改 SYS/SYSTEM 密碼為強密碼
- 建立專屬管理帳號,不直接使用 SYS/SYSTEM
- 鎖定/移除不需的範例帳號(SCOTT, HR, OE 等)
- 建立應用程式專用帳號,最小權限原則
- 設定 Profile 密碼策略(複雜度、壽命、鎖定)
- 啟用審計:
AUDIT CREATE SESSION, ALTER USER BY ACCESS
- 記錄安裝密碼存入密碼管理系統
密碼管理工具建議
- Oracle Enterprise Manager / Database Express
- 第三方:HashiCorp Vault, CyberArk, Thycotic
- 腳本化:Ansible Oracle 模組, Python cx_Oracle