在 Linux 環境下配置 Oracle Data Guard (DG) 時,遇到一個典型現象:tnsnames.ora 配置正確、tnsping 通順、監聽服務運行正常,但主庫的 v$archive_dest 視圖仍報告 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 錯誤,導致歸檔日志無法傳輸到備庫。
執行 lsnrctl status 發現主庫監聽已註冊服務 prd、prdXDB、prd_XPT,實例狀態為 READY,看似正常。
備庫監聽顯示服務 std、std_XPT,實例名同為 prd(主備庫使用相同 instance_name),但缺少主庫所需的 prd 服務註冊。
雙向 tnsping prd、tnsping std 均成功,說明網絡層面無阻礙,問題核心在於「服務名解析」。
Oracle 預設採用 動態服務註冊(由 PMON 進程定期向監聽註冊)。主備庫 instance_name 均為 prd,導致備庫監聽只註冊了 std 服務,而主庫嘗試連接的 SERVICE_NAME=prd 在備庫監聽中不存在,故報 ORA-12514。
在主備庫的 listener.ora 中 SID_LIST_LISTENER 區段手動添加靜態服務註冊,關鍵參數對應關係如下:
SID_NAME = 實例名 (instance_name,本例為 prd)GLOBAL_DBNAME = tnsnames.ora 中的 SERVICE_NAME(本例同為 prd)ORACLE_HOME = 實際 Oracle Home 路徑SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = prd)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(SID_NAME = prd)
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
)
執行 lsnrctl reload 後,lsnrctl status 顯示服務 prd 下新增一個 UNKNOWN 狀態的實例 prd,即靜態註冊生效的標誌。
再次查詢主庫 v$archive_dest_status,DEST_ID=2 狀態變為 VALID,錯誤消失,歸檔傳輸恢復正常,Redo Apply 亦無異常。
listener.ora 後務必 reload;若實例名/服務名變更,同步更新靜態配置。