11 應用程式突報Oracle TNS-12514典型案例分析

龍山游龍發表於2023-03-06

故障描述

某次深夜,使用者反饋某核心業務系統故障,提示無法連線資料庫。之後,使用者同步嘗試在堡壘機上,使用客戶端工具連線資料庫,同樣命中報錯,輸出TNS-12514無法連線資料庫。相信但凡有經驗的DBA,遇到此類報錯,可能會想“這不是很常見的連線問題嘛”,但事實真的有這麼簡單麼?

 

根因分析

首先,使用者就檢查了資料庫alert日誌,其中也未發現ORA-報錯資訊,在和使用者的交流當中,其實也大概排除了網路問題以及可能的配置變更,如下圖所示:

其次檢視叢集狀態crsctl stat res -t顯示正常,CRS日誌該時間點未發現錯誤資訊,系統日誌/var/log/messages該時間點未發現錯誤資訊,監聽狀態正常但監聽日誌裡報錯無法連線,如下顯示:

Sat Jan 28 00:08:04 2023
28-JAN-2023 00:08:04 * service_update * ecrac1 * 0
28-JAN-2023 00:08:07 * service_update * ecrac1 * 0
Sat Jan 28 00:08:16 2023
28-JAN-2023 00:08:16 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ecrac1)(CID=(PROGRAM=sqlplus)(HOST=infolexdr)(USER=mon))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.128.243.41)(PORT=19157)) * establish * ecrac1 * 12514
TNS-12514: TNS:listener does not currently know of service requested in connect descriptor
28-JAN-2023 00:08:16 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ecrac1)(CID=(PROGRAM=sqlplus)(HOST=infolexdr)(USER=mon))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.128.243.41)(PORT=19158)) * establish * ecrac1 * 12514
TNS-12514: TNS:listener does not currently know of service requested in connect descriptor
28-JAN-2023 00:08:16 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ecrac1)(CID=(PROGRAM=sqlplus)(HOST=infolexdr)(USER=mon))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.128.243.41)(PORT=19159)) * establish * ecrac1 * 12514
TNS-12514: TNS:listener does not currently know of service requested in connect descriptor
28-JAN-2023 00:08:16 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ecrac1)(CID=(PROGRAM=sqlplus)(HOST=infolexdr)(USER=mon))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.128.243.41)(PORT=19160)) * establish * ecrac1 * 12514
TNS-12514: TNS:listener does not currently know of service requested in connect descriptor
28-JAN-2023 00:08:16 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ecrac1)(CID=(PROGRAM=sqlplus)(HOST=infolexdr)(USER=mon))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.128.243.41)(PORT=19161)) * establish * ecrac1 * 12514
TNS-12514: TNS:listener does not currently know of service requested in connect

 

透過檢查TNS-12514錯誤輸出,大致判斷跟SERVICE_NAME相關,返回檢視alert日誌裡有修改service_name的操作,引起關注。

與客戶核實確認問題時間點是在執行expdp邏輯備份資料庫操作,近期無資料庫引數修改等操作,且第一次出現該故障。

重點分析alert日誌,發現邏輯備份前系統執行alter system set 語句如下:

Sat Jan 28 00:05:02 2023
ALTER SYSTEM SET service_names='ecrac1','SYS$SYS.KUPC$C_1_20230128000501.ECRAC' SCOPE=MEMORY SID='ecrac1';
ALTER SYSTEM SET service_names='SYS$SYS.KUPC$C_1_20230128000501.ECRAC','ecrac1','SYS$SYS.KUPC$S_1_20230128000501.ECRAC' SCOPE=MEMORY SID='ecrac1';
Sat Jan 28 00:05:02 2023
DM00 started with pid=645, OS id=141291, job IMPCBSMID.SYS_EXPORT_SCHEMA_01
Sat Jan 28 00:05:03 2023
ALTER SYSTEM SET service_names='SYS$SYS.KUPC$S_1_20230128000501.ECRAC','ecrac1' SCOPE=MEMORY SID='ecrac1';
ALTER SYSTEM SET service_names='ecrac1' SCOPE=MEMORY SID='ecrac1';
Sat Jan 28 00:05:06 2023
ALTER SYSTEM SET service_names='ecrac1','SYS$SYS.KUPC$C_1_20230128000506.ECRAC' SCOPE=MEMORY SID='ecrac1';
ALTER SYSTEM SET service_names='SYS$SYS.KUPC$C_1_20230128000506.ECRAC','ecrac1','SYS$SYS.KUPC$S_1_20230128000506.ECRAC' SCOPE=MEMORY SID='ecrac1';
Sat Jan 28 00:05:07 2023
DM00 started with pid=326, OS id=141607, job IMPCBSMID.SYS_EXPORT_SCHEMA_01
Sat Jan 28 00:05:08 2023
DW00 started with pid=133, OS id=141707, wid=1, job IMPCBSMID.SYS_EXPORT_SCHEMA_01
Sat Jan 28 00:10:04 2023
ALTER SYSTEM SET service_names='SYS$SYS.KUPC$S_1_20230128000506.ECRAC','SYS$SYS.KUPC$C_1_20230128000506.ECRAC','ecrac1','SYS$SYS.KUPC$C_1_20230128001004.ECRAC' SCOPE=MEMORY SID='ecrac1';
ALTER SYSTEM SET service_names='SYS$SYS.KUPC$C_1_20230128001004.ECRAC','SYS$SYS.KUPC$S_1_20230128000506.ECRAC','SYS$SYS.KUPC$C_1_20230128000506.ECRAC','ecrac1','SYS$SYS.KUPC$S_1_20230128001004.ECRAC' SCOPE=MEMORY SID='ecrac1';

理論上service_names包含了例項名即可正常連線,其他名字是系統預設追加進去,邏輯備份結束後會自動去掉,但該問題現象感覺跟此相關。對比其他rac環境上的alert日誌發現也是如此記錄,未發現異常點;對比前幾天的備份點均如此,無異常。初步判斷該問題為資料庫bug導致,檢視mos文件:Bug 14320415 - The value of service name is sometimes removed during expdp/impdp in RAC - superseded (Doc ID 14320415.8)

 

事後,在和客戶的交流溝通中,有聊到這套資料庫例項大概有5、6年時間沒有重啟了,Oracle官方在原文中描述,資料庫例項在長期未重啟過的情況下,如果註冊service_names次數達到65536上限後,就會觸發此bug導致註冊失敗,進而會引發連線問題。

 

解決方案

針對該案例,MOS文件原文中也給出了幾種解決方案,最快捷的方式是重啟資料庫例項,不過需要額外申請停機視窗;其次,可以選擇安裝該BUG對應的補丁,甚至可以升級至大版本,比如12C或者19C,不過這類動作影響較大,停機時間更久。綜上,最後使用者透過重啟例項解決,對於每年定期重啟資料庫或者伺服器的使用者,也不太可能碰到類似的問題。詳情可以參考:Connection With Net Service Name Sometimes Fails With ORA-12514 During DataPump Export/Import In RAC (Doc ID 2302731.1)

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30310891/viewspace-2938349/,如需轉載,請註明出處,否則將追究法律責任。

相關文章