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