首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 忘記 SYS/SYSTEM 密碼重置:OS 認證法與 ORAPWD 實戰

     編輯:Oracle 資料庫相關知識

前提條件

  • 作業系統帳戶屬於 ORA_DBA (Windows) 或 dba 群組 (Linux/Unix)
  • 可存取資料庫伺服器主機 (本地或 SSH/RDP)
  • Oracle 服務正在運行

方法一:OS 驗證連線重置 (最常用、最快)

Windows 環境

C:\> SET ORACLE_SID=your_sid
C:\> sqlplus /nolog
SQL> CONNECT / AS SYSDBA
Connected.
SQL> ALTER USER sys IDENTIFIED BY new_password;
User altered.
SQL> ALTER USER system IDENTIFIED BY new_password;
User altered.

Linux/Unix 環境

$ export ORACLE_SID=your_sid
$ export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
$ sqlplus /nolog
SQL> CONNECT / AS SYSDBA
Connected.
SQL> ALTER USER sys IDENTIFIED BY new_password;
SQL> ALTER USER system IDENTIFIED BY new_password;

原理:CONNECT / AS SYSDBA 使用作業系統驗證,略過資料庫密碼檢查。需 OS 帳戶在 dba 群組。

方法二:密碼檔重建 (適用 OS 驗證失效、Data Guard 環境)

1. 備份舊密碼檔

# Linux
cp $ORACLE_HOME/dbs/orapw$ORACLE_SID $ORACLE_HOME/dbs/orapw$ORACLE_SID.bak

# Windows
copy %ORACLE_HOME%\database\PWD%ORACLE_SID%.ora %ORACLE_HOME%\database\PWD%ORACLE_SID%.ora.bak

2. 使用 ORAPWD 重建

# 12c+ 格式 (支援大小寫、長密碼)
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=new_password entries=10 format=12.2

# 11g 格式
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=new_password entries=10
  • entries:最大 SYSDBA/OPER 使用者數
  • format=12.2:12c 強雜湊演算法 (SHA-2/512),強制大小寫敏感
  • force=y:覆蓋既有檔案

3. 重啟資料庫生效

SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP

方法三:修改 sqlnet.ora 允許 OS 驗證 (若方法一失效)

# $ORACLE_HOME/network/admin/sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES = (NTS)  # Windows
# 或
SQLNET.AUTHENTICATION_SERVICES = (ALL)  # Linux/Unix

修改後重新嘗試方法一。

常見問題排查

錯誤原因解決
ORA-01031: insufficient privilegesOS 帳戶不在 dba/ORA_DBA 群組將帳戶加入群組、重新登入 OS
ORA-01017: invalid username/password密碼檔損壞或版本不符重建密碼檔 (方法二)
ORA-12560: TNS protocol adapter errorORACLE_SID 未設定或錯誤正確設定 ORACLE_SID
Windows: "sqlplus 不是內部命令"PATH 未包含 %ORACLE_HOME%\bin設定 PATH 或用完整路徑

12c/18c/19c 多租戶 (CDB/PDB) 注意事項

-- 連線 CDB$ROOT
SQL> CONNECT / AS SYSDBA
SQL> ALTER USER sys IDENTIFIED BY new_pwd CONTAINER=ALL;  -- 所有容器
SQL> ALTER USER system IDENTIFIED BY new_pwd CONTAINER=ALL;

-- 或針對特定 PDB
SQL> ALTER SESSION SET CONTAINER=pdb1;
SQL> ALTER USER sys IDENTIFIED BY new_pwd;

安全建議

  1. 密碼複雜度:啟用 PASSWORD_VERIFY_FUNCTION、設定 PASSWORD_LIFE_TIME
  2. 審計:啟用 AUDIT_SYS_OPERATIONS=TRUE、統一審計
  3. 密碼檔備份:定期備份 orapw 至異地
  4. 最小權限:日常運維使用具備特定權限的帳戶,非必要不直接用 SYS

補充:解鎖被鎖定帳戶

SQL> ALTER USER sys ACCOUNT UNLOCK;
SQL> ALTER USER system ACCOUNT UNLOCK;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved