首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

配置靜態監聽解決 Data Guard 環境下的 ORA-12514 錯誤

     編輯:Oracle 教學

問題背景

在 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 亦無異常。

總結與補充

  1. 核心原因:同實例名的 DG 環境下,動態註冊無法滿足跨端服務名解析需求。
  2. 靜態監聽優勢:實例啟動前即可提供服務,客戶端連接無需等待 PMON 註冊,加快故障切換響應;亦是 DG、RMAN 復原等場景的推薦做法。
  3. 維護提示:修改 listener.ora 後務必 reload;若實例名/服務名變更,同步更新靜態配置。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved