oracle三個連接配置文件 listener.ora、sqlnet.ora、tnsnames.ora


關於PLSQL連接ORACLE配置字符串

首先要講一下下面的一些知識

1.ORACLE_SID:(ORACLE SYSTEM IDENTIFIER)
     Oracle實例是由SGA和一組后台進程組成的,實例的創建和啟動需要一個參數文件,而參數文件的名稱就是由ORACLE_SID決定的。
對於init文件,缺省的文件名稱是init
<ORACLE_SID>.ora,對於 spfile文件,缺省的文件名稱是spfile<ORACLE_SID>.ora      設置不同的ORACLE_SID值,就可以默認使用不同的參數文件啟動不同的數據庫實例。
例如: sql>startup spfile='/u01/oracle/product/11.2.0/dbs/spfileprd.ora'      在實例啟動后,實例名稱INSTANCE_NAME也是從ORACLE_SID得到的。

     SQL> select value from v$parameter where name='spfile';

     VALUE
     --------------------------------------------------------------------------------
     /u01/oracle/product/11.2.0/dbs/spfileprd.ora  //spfile+prd.ora組成

2.INSTANCE_NAME:
     INSTANCE_NAME是Oracle實例的名字,用來區分不同的實例。在Oracle9i之前,該名字存儲在兩個地方:參數文件和數據庫的內部試圖(V$INSTANCE).
     而在Oracle10g之后的版本中,這個名字不再出現在參數文件中,而是動態從系統中獲得,默認是取自ORACLE_SID。
     INSTANCE_NAME的作用除了區別不同實例之外,在監聽器動態注冊時,還會用於向監聽器注冊。
比如instance_name
=abc,監聽中將動態注冊Instance "prd",status READY信息。

//查看實例名

      SQL> select INSTANCE_NAME FROM v$instance;

      INSTANCE_NAME

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

      prd

    //查看監聽器

    [oracle@prod:/home/oracle$lsnrctl status

    LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 16-MAR-2022 17:13:11

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

  Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
  STATUS of the LISTENER
  ------------------------
  Alias LISTENER
  Version TNSLSNR for Linux: Version 11.2.0.4.0 - Production
  Start Date 16-MAR-2022 16:59:10
  Uptime 0 days 0 hr. 14 min. 0 sec
  Trace Level off
  Security ON: Local OS Authentication
  SNMP OFF
  Listener Parameter File /u01/oracle/product/11.2.0/network/admin/listener.ora
  Listener Log File /u01/oracle/diag/tnslsnr/rac-12c-2/listener/alert/log.xml
  Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=rac-12c-2)(PORT=1521)))
  Services Summary...
  Service "prd" has 2 instance(s).
  Instance "prd", status UNKNOWN, has 1 handler(s) for this service...
  Instance "prd", status READY, has 1 handler(s) for this service...

3.DB_NAME:    
     DB_NAME概念相比於INSTANCE_NAME要重要的多,它決定實例將掛在的數據文件。它出現在數據文件,控制文件,日志文件中。在參數文件中也出現,且必須出現。
這個參數涉及到系統的物理文件。
4.SERVICE_NAME和GLOBAL_DBNAME:      這兩個參數之所以放在一起講,是因為他們往往是成對出現的。SERVICE_NAME出現在Tnsnames.ora文件中,是客戶端要請求的服務名。      GLOBAL_DBNAME 出現在Listener.ora文件中,是服務器提供的服務名,可以通過show parameter service_names查看,

    SQL> show parameter service_names;

    NAME       TYPE    VALUE

       service_names string  prd

     並可以通過alter system set service_name='servicename' scope=both來修改。
     二者對應,實現了Listerner.ora/Tnsnames.ora的重要功能----監聽、請求與驗證。

 

首先就要涉及三個配置文件中,其中最重要的首先要看sqlnet.ora,通過這個文件來決定怎么樣找一個連接中出現的連接字符串

oracle網絡配置三個配置文件 listener.ora、sqlnet.ora、tnsnames.ora文件查看(遠程和本地連接重點是看這三個文件)

三個文件中首先又要關注sqlnet.ora

 
            
1、sqlnet.ora

[grid@shdb02 ~]$ locate sqlnet.ora
/u01/app/11.2.0/grid/network/admin/sqlnet.ora

[grid@shdb02 ~]$ cat /u01/app/11.2.0/grid/network/admin/sqlnet.ora

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

ADR_BASE = /u01/app/grid

2、listener.ora
[grid@shdb02 ~]$ locate listener.ora
/u01/app/11.2.0/grid/network/admin/listener.ora
 
[grid@shdb02 ~]$ cat /u01/app/11.2.0/grid/network/admin/listener.ora
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) 
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER))))   
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON   
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = htcmsdb)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME =htcmsdb2)
)
)

ADR_BASE_LISTENER = /u01/app/grid
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON    # line added by Agent

 3、tnsnames.ora

[grid@shdb02 ~]$ locate tnsnames.ora
/u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

[grid@shdb02 ~]$ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
STANDBY1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.129.51.40)(PORT = 1521))
)
(CONNECT_DATA =
(SID = shdb1)
(SERVICE_NAME = shdb1)  //這個是lsnrctl中注冊的實例名,lsnrctl status查看
)
)

ORA1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.128.51.20)(PORT = 1521))
    )
    (CONNECT_DATA =
      (service_name = ora1)
    )
  )

htst =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.128.51.20)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = htst) //這個是lsnrctl中注冊的實例名,lsnrctl status查看
)
)

 對應數據庫(各個數據庫以什么方式可以連接)

SQL> Select username,server,program from v$session where username is not null;

USERNAME               SERVER
------------------------------ ---------
PROGRAM
------------------------------------------------
SYS                   DEDICATED
oraagent.bin@shfpdb02 (TNS V1-V3)

SHFP                   DEDICATED
plsqldev.exe

SYS                   DEDICATED
sqlplus@shfpdb02 (TNS V1-V3)

USERNAME               SERVER
------------------------------ ---------
PROGRAM
------------------------------------------------
SHFP                   DEDICATED
JDBC Thin Client

SHFP                   DEDICATED
JDBC Thin Client

oracle網絡配置

三個配置文件中最重要的首先要看sqlnet.ora,通過這個文件來決定怎么樣找一個連接中出現的連接字符串

三個配置文件 listener.ora、sqlnet.ora、tnsnames.ora ,我們這里是放在了/u01/app/11.2.0/grid/network/admin目錄下。

1.  sqlnet.ora

 
            

文件作用:
sqlnet.ora文件控制着客戶端Oracle NetServices的行為,例如跟蹤級別和會話特性。
當客戶發出請求時,通過使用tnsnames.ora文件首先解析Oracle Net Services的名稱。
tnsnames.ora文件中的參數將該請求指引到適當的數據庫節點。

監聽器進程監聽客戶請求,
並且將其與一個服務器進程相連接。該請求將被處理,其結果被返回到客戶端機器。


參數解釋:
#SQLNET.AUTHENTICATION_SERVICES= (NTS)
none:作用是不允許通過os系統用戶登錄數據庫,需要提供數據庫用戶名及密碼
all: 作用是允許所有的登錄方式
nts: 作用是windows的本地操作系統用戶認證,unix環境需注釋掉。
NONE,NTS 兩種方式可以並用。

 
            

#NAMES.DIRECTORY_PATH可以有多種設置,
例如:
1、設置NAMES.DIRECTORY_PATH=(TNSNAMES)
客戶端就只會從設置的tnsnames.ora查找你要連接的字符串(如orcl)記錄,
如果tnsname.ora文件中沒有此記錄,則連接不上數據庫。

 
            

2、設置NAMES.DIRECTORY_PATH=(TNSNAMES,ONAMES)
客戶端首先會從tnsnames.ora查找你要連接的字符串(如orcl)記錄,
如果tnsname.ora文件中沒有此記錄,
則Oracle使用自己的名稱服務器(Oracle Name Server)來解析 (ONAMES) 。
一般比較少使用Name Server。

 
            

3、設置 NAMES.DIRECTORY_PATH= (TNSNAMES,ONAMES,HOSTNAME,EZCONNECT)
先找tnsnames.ora,沒有的話,再找Oracle Name Server,再找不到,那么嘗試把客戶端(設置的)要連接的字符串(如orcl)
當作一個主機名,通過網絡的途徑去解析它的ip地址然后去連接這個ip上GLOBAL_DBNAME=連接字符串(如orcl)
這個實例,當然這里連接字符串(如orcl)並不是一個主機名,最后會嘗試以ezconnect的方式連接數據庫。

所謂 EZCONNECT是oracle10g引入的簡單連接,sqlplus連接格式:

不是 sqlplus user/password@10.121.10:1521:orcl
而是 sqlplus user/password@10.121.10:1521/orcl  是/不是:

我們的配置文件是:NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
先找tnsnames.ora,沒有的話,再找Oracle Name Server,再找不到,那么嘗試把客戶端(設置的)要連接的字符串(如orcl)
當作一個主機名,通過網絡的途徑去解析它的ip地址然后去連接這個ip上GLOBAL_DBNAME=連接字符串(如orcl)

2.  tnsnames.ora------這個文件類似於unix 的hosts文件,提供的tnsname到主機名或者ip的對應。

   遠程連接中 tnsnames.ora和listener.ora 他兩是息息相關的(集群模式除外,集群的時候, 監聽器開啟與否無關)

只有當sqlnet.ora中類似 NAMES.DIRECTORY_PATH= (TNSNAMES) 這樣,
也就是客戶端解析連接字符串的順序中有TNSNAMES是,才會嘗試使用這個文件。

 [oracle@shdb02 ~]$ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

STANDBY1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.121.51.41)(PORT = 1521))
)
(CONNECT_DATA =
(SID = shdb1)
(SERVICE_NAME = standby)
)
)

#這條信息記錄我們將使用TCP協議,去連接IP地址為10.128.51.20,端口號為1521的數據庫主機上服務名為htst的數據庫

 htst =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.121.51.20)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.121.51.21)(PORT = 1521))
    (CONNECT_DATA =
     (SERVER = DEDICATED)
     (SERVICE_NAME = htst) 
    )
  )

MYORA:客戶端連接服務器端使用的服務別名。注意一定要頂行書寫,否則會無法識別服務別名。
PROTOCOL:客戶端與服務器端通訊的協議,一般為TCP,該內容一般不用改。
HOST:ORACLE服務器端IP地址或者hostname。確保服務器端的監聽啟動正常。
PORT:數據庫偵聽正在偵聽的端口,可以察看服務器端的listener.ora文件或在數據庫偵聽所在的機器
命令提示符下通過lnsrctl status [listener name]命令察看。
此處Port的值一定要與數據庫偵聽正在偵聽的端口一樣。
SERVICE_NAME:在服務器端,用system用戶登陸后,sqlplus> show parameter service_name命令查看。

3.  listener.ora------listener監聽器進程的配置文件

關於listener進程就不多說了,接受遠程對數據庫的接入申請並轉交給oracle的服務器進程。
所以如果不是使用的遠程的連接,listener進程就不是必需的,同樣的如果關閉listener進程並不會影響已經存在的數據庫連接。
例子:

oracle@prod:/home/oracle$vi /u01/oracle/product/11.2.0/network/admin/listener.ora

//配置監聽多個服務名和多個全局數據庫

SID_LIST_LISTENER =
(SID_LIST =
  (SID_DESC =
    (GLOBAL_DBNAME = prd)
    (SID_NAME = prd)
    (ORACLE_HOME=/u01/oracle/product/11.2.0)
  )

  (SID_DESC=
    (GLOBAL_DBNAME=fp)
    (ORACLE_HOME=/u01/oracle/product/11.2.0)
    (SID_NAME=fp)
  )

  (SID_DESC=
    (SID_NAME=mysql_uts01)
    (ORACLE_HOME=/u01/oracle/product/11.2.0)
    (PROGRAM=dg4odbc)
   )
 )

//配置監聽器名稱,如何你配置了多個監聽器名稱,我們可以通過 lsnrctl status MYLISTENER 來查看某個監聽器的狀態

//所以這是一個名為 MYLISTENER的監聽器

MYLISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.121.51.70)(PORT = 1522))


LISTENER :監聽名稱,可以配置多個監聽,多個監聽的端口號要區分開來。
GLOBAL_DBNAME :全局數據庫名。通過select * from global_name; 查詢得出
ORACLE_HOME :oracle軟件的跟目錄
SID_NAME :數據庫實例的SID
PROTOCOL:監聽協議,一般都使用TCP
HOST:本機IP地址,雙機時候使用浮動VIP
PORT:監聽的端口號,使用netstat –an 檢查該端口不被占用。



1、客戶端連接形式為:  用戶名: serp01 密碼: passwd01   數據庫為連接字符串: 10.128.51.22:1521/fp,注意/fp,而不是:fp 因為是服務名連接方式

2、服務器監聽log

[grid@shdb02 app]$ locate listener.log
/u01/app/grid/diag/tnslsnr/shdb02/listener/trace/listener.log
[grid@shfpdb02 app]$ tail -f /u01/app/grid/diag/tnslsnr/shdb02/listener/trace/listener.log
......
監聽的log日志,在登陸時候就會出現相應的反映。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM