Oracle 連線不僅是「用戶名/密碼@IP:PORT/SERVICE」,背後涉及進程架構、環境變量、監聽器動態/靜態註冊、密碼文件驗證、特權用戶機制。本文從底層原理到實戰場景完整拆解。
| 類別 | 定義 | 關鍵特徵 |
|---|---|---|
| 本地連線 (Bequeath/Beq) | Client 與 Server 同機 | 無需 Listener,sqlplus 直接 fork 專用服務器進程,靠 $ORACLE_HOME + $ORACLE_SID 定位 Instance |
| 遠程連線 (Network) | Client 與 Server 異機 | 需 Listener (tnslsnr) 監聽,由 Listener 啟動專用/共享服務器,靠 Service Name 解析到 SID |
$ env | grep ORACLE ORACLE_SID=orcl12c ORACLE_HOME=/opt/app/oracle/product/12.1.0/dbhome_1 $ sqlplus / as sysdba -- OS 用戶 oracle 屬於 OSDBA 組 -> 無需密碼直接以 SYS 登入 -- "as sysdba" 強制以 SYS 身份,忽略命令列提供的用戶名/密碼
關鍵點: 本地連線時as sysdba會完全忽略命令列的用戶名密碼,只要 OS 驗證通過即以 SYS 登入。即使輸入sqlplus fake/wrong as sysdba也能成功 (前提是 OS 用戶正確)。
$ sqlplus / as sysdba Connected to an idle instance. -- 非 OSDBA 用戶 (如 root) 需密碼文件驗證 $ sqlplus sys/syspwd as sysdba Connected to an idle instance.
此時 Listener 甚至未啟動,sqlplus 直接啟動專用服務器進程掛載 SGA,密碼驗證靠 $ORACLE_HOME/dbs/orapw 密碼文件 (僅含 SYS)。
Instance 啟動後會向 Listener 動態註冊 Service (如 orcl12c.xy.com)。但Instance 未啟動時無法動態註冊,導致遠程連線報 ORA-12514: TNS:listener does not currently know of service requested。
# $ORACLE_HOME/network/admin/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME = /opt/app/oracle/product/12.1.0/dbhome_1)
(SID_NAME = orcl12c)
)
)
重啟 Listener:lsnrctl stop; lsnrctl start。lsnrctl status 會顯示 Service "orcl12c" ... Instance "orcl12c", status UNKNOWN,即可在 Instance 關閉時遠程以 SYSDBA 連線啟動庫。
| 維度 | 本地連線 | 遠程連線 |
|---|---|---|
| 服務器進程由誰產生 | sqlplus 直接 fork | Listener (tnslsnr) spawn |
| 如何定位 Instance | $ORACLE_HOME + $ORACLE_SID | Client 提供 Service Name → Listener 解析 |
| 用戶驗證方式 | 1. OS 認證 (OSDBA 組) 2. 密碼文件 3. 資料庫內部 | 1. 密碼文件 (Instance 下) 2. 資料庫內部 |
| 特權連線 | as sysdba 忽略用戶名密碼 | as sysdba 需正確 SYS 密碼 (除非配置 SSL/外部認證) |
orapw) 控制遠程特權連線,REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE/SHARED 參數控制共享。ORACLE_SID、ORACLE_HOME、OS 群組、sqlnet.ora SQLNET.AUTHENTICATION_SERVICES=(NTS)。ORA-12514?Listener 未註冊該 Service → 檢查 listener.ora 靜態註冊或 Instance 是否啟動動態註冊。ORA-12541?Listener 未啟動或 Port 防火牆攔截。REMOTE_LOGIN_PASSWORDFILE 非 NONE、SYS 密碼正確。sqlplus user/pwd@host:port/service_name (需 10g+ Client)。