remote_listener引發的故障分析

yingyifeng306發表於2021-05-06

內容介紹

ORACLE 資料庫是一個龐大的軟體,各個部件協同工作,有時候一個環節出現問題,往往會導致重大的問題,特別是有時候外部環境因素造成的問題,會直接影響資料庫的正常執行,比如儲存,比如網路,再比如主機。本次案例要分析的就是一次資料庫連線異常的問題,而引起資料連線異常的問題,多種多樣,不勝列舉,而具體問題具體分析,本能的反應應該是網路造成的連線問題。最終,我們還是透過 ORACLE 的網路跟蹤技術及資料庫資訊的檢視解決了故障。

故障的起因主要由於利用 rman 異地恢復資料庫, remote_listener 引數設定問題導致連線異常。

概念普及

oracle 提供的與網路層面互動的一個工具,比如如何解析客戶端發起的連線,如何對客戶端發起的連線進行辨別,如何對客戶端連線進行阻隔限制,或者啟用日誌及跟蹤( log and trace )功能等等一系列的功能, sqlnet 透過寫入檔案引數來進行分析併產生作用, sqlnet 配置檔案的存放位置一般在: $ORACLE_HOME/network/admin 目錄下,本次處理網路故障我們就是使用了 sqlnet 的啟用日誌及跟蹤功能。

sqlnet 網路連線跟蹤具體設定如下 :

TRACE_LEVEL_CLIENT=16

TRACE_FILE_CLIENT=CLIENT

TRACE_TIMESTAMP_CLIENT=ON

trace_directory_client=D:\oracle\product\10.2.0\db_1\network\ADMIN

詳細解釋一下以上引數值: TRACE_LEVEL_CLIENT – 開啟客戶端跟蹤級別

TRACE_LEVEL_LISTENER 的取值範圍為 0~16 ,當然級別越高,收集的資訊就相對越全面,系統預設是 0 ,即不生成 trace 資訊

off or 0 for no trace output

user or 4 for user trace information

admin or 10 for administration trace information

support or 16 for Oracle Support Services trace information
TRACE_FILE_CLIENT --
設定客戶端和伺服器端的 trace 檔案的名稱

TRACE_TIMESTAMP_CLIENT -- 是否在 trace 中寫入每條 trace 資訊的 dd-mon-yyyy hh:mi:ss:mi 時間戳

TRACE_DIRECTORY_CLIENT -- 設定客戶端和伺服器端的 trace 檔案的目錄

 

 

故障排查

客戶端操作如下:

客戶端連線異常

C:\Documents and   Settings\Administrator>sqlplus system/abc123@orcl

SQL*Plus: Release   10.2.0.1.0 - Production on 星期二 12 2 13:21:16 2014

Copyright (c) 1982, 2005,   Oracle.  All rights reserved.

ERROR:

ORA-12545: 因目標主機或物件不存在 , 連線失敗

請輸入使用者名稱 :

從報錯來看似乎是監聽的問題

 

檢查連線串配置及伺服器監聽狀態

C:\Documents and   Settings\Administrator>tnsping orcl

TNS Ping Utility for   32-bit Windows: Version 10.2.0.1.0 - Production on 02-12 -2014 13:22:17

Copyright (c) 1997, 2005,   Oracle.  All rights reserved.

已使用的引數檔案 :

F:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora

 

 

已使用 TNSNAMES 介面卡來解析別名

Attempting to contact   (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)

(HOST =   192.168.0.94)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0

.93)(PORT = 1521))   (LOAD_BALANCE = yes)) (CONNECT_DATA = (SERVER = SHARED) (SERV

ICE_NAME = orcl)   (FAILOVER_MODE = (TYPE = SELECT) (METHOD = BASIC))))

OK (30 毫秒 )

從tnsping的測試來看,連線串監聽都正常

 

由於是生產庫是 rac 環境的嘗試單節點登入

C:\Documents and   Settings\Administrator>sqlplus system/abc123@orcl1

SQL*Plus: Release   10.2.0.1.0 - Production on 星期二 12 2 13:26:17 2014

Copyright (c) 1982, 2005,   Oracle.  All rights reserved.

連線到 :

Oracle Database 10g   Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning,   Real Application Clusters, OLAP, Data Mining

and Real Application   Testing options

 

SQL> exit

Oracle Database 10g   Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning,   Real Application Clusters, OLAP, Data Mining

and Real Application   Testing options 斷開

C:\Documents and   Settings\Administrator>sqlplus system/abc123@orcl2

SQL*Plus: Release   10.2.0.1.0 - Production on 星期二 12 2 13:26:24 2014

Copyright (c) 1982, 2005,   Oracle.  All rights reserved.

 

連線到 :

Oracle Database 10g   Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning,   Real Application Clusters, OLAP, Data Mining

and Real Application   Testing options

從單節點的登入來看配置都正常而且可以正常連線,問題很奇怪為了進一步排查開啟開啟客戶端跟蹤

在客戶端的 sqlnet.ora 檔案中新增如下內容:

TRACE_LEVEL_CLIENT=16

TRACE_FILE_CLIENT=CLIENT

TRACE_TIMESTAMP_CLIENT=ON

trace_directory_client=D:\oracle\product\10.2.0\db_1\network\ADMIN

 

重新用客戶端登入收集跟蹤資訊

跟蹤資訊如下:

[02-12 -2014 14:10:32:968] nsmfr: normal exit

[02-12 -2014 14:10:32:968] nsmfr: entry

[02-12 -2014 14:10:32:968] nsmfr: 736 bytes at 0xe4b9d8

[02-12 -2014 14:10:32:968] nsmfr: normal exit

[02-12 -2014 14:10:32:968] nsclose: normal exit

[02-12 -2014 14:10:32:968] nscall: connecting...

[02-12 -2014 14:10:32:968] nsc2addr: entry

[02-12 -2014 14:10:32:968] nsc2addr:   (ADDRESS=(PROTOCOL=tcp)(HOST=hp)(PORT=3554))

[02-12 -2014 14:10:32:968] nttbnd2addr: entry

[02-12 -2014 14:10:32:968] snlinGetAddrInfo: entry

[02-12 -2014 14:10:32:968] snlinGetAddrInfo: Invalid IP address string hp

[02-12 -2014 14:10:32:968] snlinFreeAddrInfo: entry

[02-12 -2014 14:10:32:968] snlinFreeAddrInfo: exit

[02-12 -2014 14:10:32:968] snlinGetAddrInfo: exit

[02-12 -2014 14:10:32:968] nttbnd2addr: looking up IP addr for host: hp

[02-12 -2014 14:10:32:968] snlinGetAddrInfo: entry

[02-12 -2014 14:10:35:218] snlinGetAddrInfo: Name resolution failed for hp

[02-12 -2014 14:10:35:218] snlinFreeAddrInfo: entry

[02-12 -2014 14:10:35:218] snlinFreeAddrInfo: exit

[02-12 -2014 14:10:35:218] snlinGetAddrInfo: exit

[02-12 -2014 14:10:35:218] nttbnd2addr:    *** hostname lookup failure! ***

[02-12 -2014 14:10:35:218] nttbnd2addr: exit

[02-12 -2014 14:10:35:218] nserror: entry

[02-12 -2014 14:10:35:218] nserror: nsres: id=0, op=77, ns=12545, ns2=12560;   nt[0]=515, nt[1]=1001, nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0

[02-12 -2014 14:10:35:218] nsc2addr: error exit

從以上跟蹤資訊,當我們嘗試使用orcl連線串連線時被路由到了HP這個主機,可是tnsnames.ora連線串裡面根本沒有配置相關的資訊,那怎麼會呢從客戶端的配置似乎查不出什麼原因,嘗試從生產庫查詢。

 


 

伺服器端配置檢視

檢視生產庫的 local_listener remote_listener 配置

SQL> show parameter   local   

NAME                          TYPE    VALUE

---------------------------  ---------------------------------------

local_listener                string  (address=(protocol=tcp)(host=192.168.0.93)(port=1521))

SQL> show parameter   remote  

NAME                          TYPE    VALUE

---------------------------  ---------------------------------------

remote_listener               string  LISTENERS_ORCL

從配置上來看都沒有任何異常

 

檢視生產庫的監聽狀態

C:\Documents and   Settings\Administrator>lsnrctl status

LSNRCTL for 64-bit   Windows: Version 10.2.0.4.0 - Production on 02-12 -2014 14:15:29

Copyright (c) 1991, 2007,   Oracle.  All rights reserved.

正在連線到   (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

LISTENER STATUS

------------------------

別名                       LISTENER

版本                       TNSLSNR for 64-bit   Windows: Version 10.2.0.4.0 - Production

啟動日期                   24-11 -2014 20:52:17

正常執行時間               7 17 小時 23 13

跟蹤級別                   off

安全性                     ON: Local OS   Authentication

SNMP                      OFF

監聽程式引數檔案             D:\oracle\product\10g\network\admin\listener.ora

監聽程式日誌檔案             D:\oracle\product\10g\network\log\listener.log

監聽端點概要 ...

    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=svr01)(PORT=1521)))

服務摘要 ..

服務 "+ASM" 包含 1 個例程。

  例程 "+asm2", 狀態 BLOCKED, 包含此服務的 1 個處理程式 ...

服務 "+ASM_XPT" 包含 1 個例程。

  例程 "+asm2", 狀態 BLOCKED, 包含此服務的 1 個處理程式 ...

服務 "orcl" 包含 3 個例程。

  例程 "orcl1", 狀態 READY, 包含此服務的 31 個處理程式 ...

  例程 "orcl2", 狀態 READY, 包含此服務的 32 個處理程式 ...

  例程 "orclstd", 狀態 READY, 包含此服務的 2 個處理程式 ...

服務 "orcl_XPT" 包含 3 個例程。

  例程 "orcl1", 狀態 READY, 包含此服務的 31 個處理程式 ...

  例程 "orcl2", 狀態 READY, 包含此服務的 32 個處理程式 ...

  例程 "orclstd", 狀態 READY, 包含此服務的 2 個處理程式 ...

命令執行成功

從監聽來看似乎也看不出什麼端倪

 

生產庫嘗試用 orcl 連線串連線

C:\Documents and   Settings\Administrator>sqlplus    system/abc123@orcl

SQL*Plus: Release   10.2.0.4.0 - Production on 星期二 12 2 13:45:51 2014

Copyright (c) 1982, 2007,   Oracle.  All Rights Reserved.

連線到 :

SQL> select   instance_name from v$instance;

INSTANCE_NAME

----------------

orclstd

SQL> show parameter   remote

NAME                                 TYPE        VALUE

------------------------------------   ----------- ------------------------------

remote_listener                      string      LISTENERS_ORCL

C:\Documents and   Settings\Administrator>tnsping listeners_orcl

TNS Ping Utility for   64-bit Windows: Version 10.2.0.4.0 - Production on 02-12 -2014 14:01:53

Copyright (c) 1997,  2007, Oracle.  All rights reserved.

已使用的引數檔案 :

D:\oracle\product\10g\network\admin\sqlnet.ora

已使用 TNSNAMES 介面卡來解析別名

Attempting to contact   (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = svr02-vip)(PORT = 1521))   (ADDRESS = (

PROTOCOL = TCP)(HOST =   svr01-vip)(PORT = 1521)))

OK (20 毫秒 )

C:\Documents and   Settings\Administrator>sqlplus / as sysdba

SQL*Plus: Release   10.2.0.4.0 - Production on 星期二 12 2 14:01:02 2014

Copyright (c) 1982, 2007,   Oracle.  All Rights Reserved.

連線到 :

Oracle Database 10g   Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning,   Real Application Clusters, OLAP, Data Mining

and Real Application   Testing options

SQL> select   instance_name from gv$instance;

INSTANCE_NAME

----------------

orcl2

orcl1

 

從以上的連線來看其實已經很明顯了,當時用orcl連線串連線時連線到orclstd,由於orclstd庫remote_listener引數所引起,orclstd庫在遠端註冊例項狀態了,然後路由到備機了,導致生產使用orcl報錯。

注:(orclstd這個庫是利用生產的rman備份恢復回來的資料庫)

 

檢視生產監聽狀態正式以上判斷

C:\Documents and   Settings\Administrator>lsnrctl status

 

LSNRCTL for 64-bit Windows:   Version 10.2.0.4.0 - Production on 02-12 -2014 14:15:29

 

Copyright (c) 1991, 2007,   Oracle.  All rights reserved.

 

正在連線到   (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

LISTENER STATUS

------------------------

別名                       LISTENER

版本                       TNSLSNR for 64-bit   Windows: Version 10.2.0.4.0 - Production

啟動日期                   24-11 -2014 20:52:17

正常執行時間               7 17 小時 23 13

跟蹤級別                   off

安全性                     ON: Local OS   Authentication

SNMP                      OFF

監聽程式引數檔案             D:\oracle\product\10g\network\admin\listener.ora

監聽程式日誌檔案             D:\oracle\product\10g\network\log\listener.log

監聽端點概要 ...

    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=svr01)(PORT=1521)))

服務摘要 ..

服務 "+ASM" 包含 1 個例程。

  例程 "+asm2", 狀態 BLOCKED, 包含此服務的 1 個處理程式 ...

服務 "+ASM_XPT" 包含 1 個例程。

  例程 "+asm2", 狀態 BLOCKED, 包含此服務的 1 個處理程式 ...

服務 "orcl" 包含 3 個例程。

  例程 "orcl1", 狀態 READY, 包含此服務的 31 個處理程式 ...

  例程 "orcl2", 狀態 READY, 包含此服務的 32 個處理程式 ...

  例程 "orclstd", 狀態 READY, 包含此服務的 2 個處理程式 ...

服務 "orcl_XPT" 包含 3 個例程。

  例程 "orcl1", 狀態 READY, 包含此服務的 31 個處理程式 ...

  例程 "orcl2", 狀態 READY, 包含此服務的 32 個處理程式 ...

  例程 "orclstd", 狀態 READY, 包含此服務的 2 個處理程式 ...   -- 確實證實了之前的判斷,罪魁禍首水落石出

命令執行成功

 

證實備機是否主機名為 hp

C:\Documents and   Settings\Administrator>hostname

hp

 

C:\Documents and   Settings\Administrator>ping hp

Pinging hp [192.168.0.80]   with 32 bytes of data:

Reply from 192.168.0.80:   bytes=32 time<1ms TTL=128

 

故障後期處理

1. 登出備機的 remote_listener

alter system set remote_listener=''   scope=both;

2. 生產庫重新載入監聽

C:\Documents and   Settings\Administrator>lsnrctl reload

LSNRCTL for 64-bit Windows: Version 10.2.0.4.0   - Production on 02-12 -2014 14:18:51

Copyright (c) 1991, 2007, Oracle.  All rights reserved.

 

正在連線到   (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

命令執行成功

 

C:\Documents and   Settings\Administrator>lsnrctl status

LSNRCTL for 64-bit Windows: Version 10.2.0.4.0   - Production on 02-12 -2014 14:18:57

Copyright (c) 1991, 2007, Oracle.  All rights reserved.

 

正在連線到   (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

LISTENER STATUS

------------------------

別名                       LISTENER

版本                       TNSLSNR for 64-bit   Windows: Version 10.2.0.4.0 - Production

啟動日期                   24-11 -2014 20:52:17

正常執行時間               7 17 小時 26 40

跟蹤級別                   off

安全性                     ON: Local OS   Authentication

SNMP                      OFF

監聽程式引數檔案             D:\oracle\product\10g\network\admin\listener.ora

監聽程式日誌檔案             D:\oracle\product\10g\network\log\listener.log

監聽端點概要 ...

    (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=svr01)(PORT=1521)))

服務摘要 ..

服務 "+ASM" 包含 1 個例程。

  例程 "+asm2", 狀態 BLOCKED, 包含此服務的 1 個處理程式 ...

服務 "+ASM_XPT" 包含 1 個例程。

  例程 "+asm2", 狀態 BLOCKED, 包含此服務的 1 個處理程式 ...

服務 "orcl" 包含 2 個例程。

  例程 "orcl1", 狀態 READY, 包含此服務的 31 個處理程式 ...

  例程 "orcl2", 狀態 READY, 包含此服務的 1 個處理程式 ...

服務 "orcl_XPT" 包含 2 個例程。

  例程 "orcl1", 狀態 READY, 包含此服務的 31 個處理程式 ...

  例程 "orcl2", 狀態 READY, 包含此服務的 1 個處理程式 ... 

--orclstd 已經消失了

命令執行成功

3. 客戶端再次利用 orcl 連線資料庫正常

D:\>sqlplus system/abc123@orcl

 

SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 12 2 14:21:01 2014

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

 

連線到 :

Oracle Database 10g Enterprise Edition Release   10.2.0.4.0 - 64bit Production

With the Partitioning, Real Application Clusters,   OLAP, Data Mining

and Real Application Testing options

 

SQL> show parameter name

 

NAME                                 TYPE        VALUE

------------------------------------   ----------- ------------------------------

db_file_name_convert                 string

db_name                              string      orcl

db_unique_name                       string      orcl

global_names                         boolean     FALSE

instance_name                        string      orcl2

lock_name_space                      string

log_file_name_convert                string

service_names                        string      orcl

到此處問題已經解決

技術結論

透過以上一步步的推敲,終於發現了問題的根本原因,由於利用rman異機恢復時remote_listener引數所引起。 orclstd庫在遠端註冊例項狀態了,然後路由到80備機了,導致生產使用orcl報錯。


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

相關文章