Oracle 資料庫執行 GRANT SYSDBA TO user 時報 ORA-01994: GRANT failed: password file missing or disabled。根因通常是 口令文件 (orapwSID) 大小寫不匹配 或 remote_login_passwordfile 參數配置錯誤。本文記錄診斷與修復步驟。
SYS@ORCL> GRANT SYSDBA TO SYS;
ERROR at line 1:
ORA-01994: GRANT failed: password file missing or disabled
SHOW PARAMETER remote_login_passwordfile;
-- 輸出:EXCLUSIVE (正確值應為 EXCLUSIVE 或 SHARED,NONE 會禁用)
LS -L $ORACLE_HOME/dbs
-- 輸出範例:
-rw-r----- 1 oracle oinstall 2560 Sep 21 16:26 orapwDBSID <-- 注意大寫 DBSID
ORACLE_SID 環境變數:
ECHO $ORACLE_SID
-- 輸出:dbsid (小寫)
Linux/Unix 區分大小寫。orapwd 工具按 ORACLE_SID 生成檔案名 orapw${ORACLE_SID},若 ORACLE_SID 為小寫 dbsid,檔案為 orapwdbsid;但實際目錄下卻是 orapwDBSID (大寫),導致 Oracle 找不到對應口令文件。
# 進入 dbs 目錄
CD $ORACLE_HOME/dbs
# 重命名為小寫匹配 ORACLE_SID
MV orapwDBSID orapwdbsid
# 驗證
SQL> SELECT * FROM V$PWFILE_USERS;
USERNAME SYSDBA SYSOPER SYSASM
SYS TRUE TRUE FALSE
ORAPWD FILE=$ORACLE_HOME/dbs/orapw${ORACLE_SID} ENTRIES=10 FORCE=Y IGNORECASE=Y
ENTRIES:最大 SYSDBA/SYSOPER 用戶數,預留擴容空間。FORCE=Y:覆蓋既有檔案。IGNORECASE=Y (12c+):密碼大小寫不敏感,相容舊應用。REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE -- 單實例專用,允許修改口令文件
-- RAC 環境需設為 SHARED
GRANT SYSDBA TO app_admin;
GRANT SYSOPER TO backup_user;
SELECT * FROM V$PWFILE_USERS;
| 錯誤碼 | 原因 | 處理 |
|---|---|---|
| ORA-01994 | 口令文件缺失/大小寫錯/參數 NONE | 檢查檔案存在性、大小寫、參數值 |
| ORA-01031 | 權限不足 (非 SYSDBA 連線嘗試 GRANT) | 以 SYSDBA 身分連線:sqlplus / as sysdba |
| ORA-01996 | GRANT/REVOKE 口令文件用戶失敗 (文件唯讀/磁碟滿) | 檢查磁碟空間、檔案權限 640 oracle:dba |
核心教訓: Oracle 環境變數
ORACLE_SID大小寫直接決定口令文件命名。建立資料庫、配置環境、編寫腳本時,**全流程強制統一大小寫 (推薦全大寫)**,杜絕「肉眼看不出差異」的低級故障。