生產庫SYS/SYSTEM密碼遺失,無口令文件備份,需緊急恢復特權訪問。
dba組(Linux/Unix)或ORA_DBA組(Windows)SQLNET.ORA中SQLNET.AUTHENTICATION_SERVICES=(NTS)(Windows默認)或(NONE)(Linux默認OS認證)# 1. 確認OS用戶組
$ id oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba)
# 2. 修改 sqlnet.ora(如未配置)
# $ORACLE_HOME/network/admin/sqlnet.ora
SQLNET.AUTHENTICATION_SERVICES = (NTS) -- Windows
# 或註釋該行使用OS認證(Linux默認)
# 3. 重啟監聽/實例(如參數修改)
$ lsnrctl stop; lsnrctl start
SQL> SHUTDOWN IMMEDIATE; STARTUP;
# 4. OS認證登錄
$ sqlplus / AS SYSDBA
-- 或
$ sqlplus /nolog
SQL> CONNECT / AS SYSDBA
# 5. 重置密碼
SQL> ALTER USER SYS IDENTIFIED BY "New_Sys_P@ss!";
SQL> ALTER USER SYSTEM IDENTIFIED BY "New_System_P@ss!";
SYSDBA授權用戶列表-- 1. 備份現有特權用戶(若實例仍可連接)
SELECT username FROM V$PWFILE_USERS;
-- 輸出保存:SYS, DBA_ADMIN, BACKUP_ADMIN
-- 2. 關閉數據庫
SHUTDOWN IMMEDIATE;
-- 3. 刪除舊口令文件
$ rm $ORACLE_HOME/dbs/orapwPROD
# Windows: del %ORACLE_HOME%\database\PWDPROD.ora
-- 4. 重建口令文件(ENTRIES預留充足)
$ orapwd FILE=$ORACLE_HOME/dbs/orapwPROD PASSWORD="New_Sys_P@ss!" ENTRIES=50 FORCE=Y
-- 5. 啟動實例至MOUNT
STARTUP MOUNT;
-- 6. 以新密碼SYSDBA登錄
SQL> CONNECT SYS/"New_Sys_P@ss!" AS SYSDBA
-- 7. 打開數據庫
ALTER DATABASE OPEN;
-- 8. 重新授權特權用戶(自動寫入新文件)
GRANT SYSDBA TO dba_admin;
GRANT SYSDBA TO backup_admin;
-- ... 其他
-- 9. 確認參數
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
-- 下次重啟生效
| 維度 | OS認證繞過 | 口令文件重建 |
|---|---|---|
| 前提 | OS特權組成員 | 僅需關閉實例權限 |
| 速度 | 秒級 | 分鐘級(含重啟) |
| 保留授權 | 自動保留 | 需手工重授 |
| 風險 | 低 | 中(遺漏授權導致應用斷連) |
SYS/SYSTEM密碼存入KeePass/1Password/HashiCorp Vault,離職交接流程化。cp $ORACLE_HOME/dbs/orapw /backup/orapw__$(date +%F) 。SYSDBA用戶(SYS + DBA_ADMIN),避免單點遺失。密碼遺失不可怕,可怕的是無預案。OS認證繞過為首選(快、保留授權),口令文件重建為備選(通用)。建立「密碼存儲、文件備份、多管理員、演練驗證」四層防護,將風險降至最低。