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日志,在登陆时候就会出现相应的反映。

 

 

posted @ 2022-03-10 20:29  jinzi  阅读(3474)  评论(0编辑  收藏  举报