tnsnames.ora配置小结

2023-10-28


oracle网络配置 
三个配置文件 listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOME/network/admin目录下。 
1.  sqlnet.ora—–作用类似于linux或者其他unix的nsswitch.conf文件,通过这个文件来决定怎么样找一个连接中出现的连接字符串。 
例如我们客户端输入 
sqlplus sys/oracle@orcl 
假如我的sqlnet.ora是下面这个样子 
SQLNET.AUTHENTICATION_SERVICES= (NTS) 
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME) 
那么,客户端就会首先在tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的 ip地址然后去连接这个ip上GLOBAL_DBNAME=orcl这个实例,当然我这里orcl并不是一个主机名 
如果我是这个样子 
NAMES.DIRECTORY_PATH= (TNSNAMES) 
那么客户端就只会从tnsnames.ora查找orcl的记录,括号中还有其他选项,如LDAP等并不常用。 
2.  Tnsnames.ora——这个文件类似于unix 的hosts文件,提供的tnsname到主机名或者ip的对应,只有当sqlnet.ora中类似 
NAMES.DIRECTORY_PATH= (TNSNAMES) 这样,也就是客户端解析连接字符串的顺序中有TNSNAMES是,才会尝试使用这个文件。 
PROTOCOL:客户端与服务器端通讯的协议,一般为TCP,该内容一般不用改。 
HOST:数据库侦听所在的机器的机器名或IP地址,数据库侦听一般与数据库在同一个机器上,所以当我说数据库侦听所在的机器一般也是指数据库所在的机器。在UNIX或WINDOWS下,可以通过在数据库侦听所在的机器的命令提示符下使用hostname命令得到机器名,或通过ipconfig(for WINDOWS) or ifconfig(for UNIX)命令得到IP地址。需要注意的是,不管用机器名或IP地址,在客户端一定要用ping命令ping通数据库侦听所在的机器的机器名,否则需要在 hosts文件中加入数据库侦听所在的机器的机器名的解析。 
PORT:数据库侦听正在侦听的端口,可以察看服务器端的listener.ora文件或在数据库侦听所在的机器的命令提示符下通过lnsrctl status [listener name]命令察看。此处Port的值一定要与数据库侦听正在侦听的端口一样。 
SERVICE_NAME:在服务器端,用system用户登陆后,sqlplus> show parameter service_name命令察看。 
ORCL 对应的本机,SALES对应的另外一个IP地址,里边还定义了使用主用服务器还是共享服务器模式进行连接 
#你所要连接的时候输入得TNSNAME 
ORCL = 
(DESCRIPTION = 
(ADDRESS_LIST = 
#下面是这个TNSNAME对应的主机,端口,协议 
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) 

(CONNECT_DATA = 
#使用专用服务器模式去连接需要跟服务器的模式匹配,如果没有就根据服务器的模式自动调节 
(SERVER = DEDICATED) 
#对应service_name,SQLPLUS>;show parameter service_name; 进行查看 
(SERVICE_NAME = orcl) 


#下面这个类似 
SALES = 
(DESCRIPTION = 
(ADDRESS_LIST = 
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521)) 

(CONNECT_DATA = 
(SERVER = DEDICATED) 
(SERVICE_NAME = sales) 


注意:如果数据库服务器用MTS,客户端程序需要用database link时最好明确指明客户端用dedicated直连方式,不然会遇到很多跟分布式环境有关的ORACLE BUG。一般情况下数据库服务器用直接的连接会好一些,除非你的实时数据库连接数接近1000。 
3.  listener.ora——listener监听器进程的配置文件 
关于listener进程就不多说了,接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。 
Listener.ora文件的例子 
#listener.ora Network Configuration File: #E:/oracle/product/10.1.0/Db_2/NETWORK/ADMIN/listener.ora 
# Generated by Oracle configuration tools. 
#下面定义LISTENER进程为哪个实例提供服务 这里是ORCL,并且它对应的ORACLE_HOME和GLOBAL_DBNAME 其中GLOBAL_DBNAME不是必需的除非 
#使用HOSTNAME做数据库连接 
SID_LIST_LISTENER = 
(SID_LIST = 
(SID_DESC = 
(GLOBAL_DBNAME = boway) 
(ORACLE_HOME = E:/oracle/product/10.1.0/Db_2) 
(SID_NAME = ORCL) 


#监听器的名字,一台数据库可以有不止一个监听器 
#再向下面是监听器监听的协议,ip,端口等,这里使用的tcp1521端口,并且使#用的是主机名 
LISTENER = 
(DESCRIPTION = 
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521)) 

上面的例子是一个最简单的例子,但也是最普遍的。一个listener进程为一个instance(SID)提供服务。 
监听器的操作命令 
$ORACLE_HOME/bin/lsnrctl start,其他诸如stop,status等。具体敲完一个lsnrctl后看帮助。 
上面说到的三个文件都可以通过图形的配置工具来完成配置 
$ORACLE_HOME/netca 向导形式的 
$ORACLE_HOME/netmgr 
本人比较习惯netmgr, 
profile 配置的是sqlnet.ora也就是名称解析的方式 
service name 配置的是tnsnames.ora文件 
listeners配置的是listener.ora文件,即监听器进程 
具体的配置可以尝试一下然后来看一下配置文件。 
这样一来总体结构就有了,是 
当你输入sqlplus sys/oracle@orcl的时候 
1. 查询sqlnet.ora看看名称的解析方式,发现是TNSNAME 
2. 则查询tnsnames.ora文件,从里边找orcl的记录,并且找到主机名,端口和service_name 
3. 如果listener进程没有问题的话,建立与listener进程的连接。 
4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的server process。 
5. 这时候网络连接已经建立,listener进程的历史使命也就完成了。 
#————— 
几种连接用到的命令形式 
1.sqlplus / as sysdba 这是典型的操作系统认证,不需要listener进程 
2.sqlplus sys/oracle 这种连接方式只能连接本机数据库,同样不需要listener进程 
3.sqlplus sys/oracle@orcl 这种方式需要listener进程处于可用状态。最普遍的通过网络连接。 
以上连接方式使用sys用户或者其他通过密码文件验证的用户都不需要数据库处于可用状态,操作系统认证也不需要数据库可用,普通用户因为是数据库认证,所以数据库必需处于open状态。 
init.ora中的Remote_Login_Passwordfile对身份验证的影响 
    三个可选值: 
    NONE:默认值,指示Oracle系统不使用密码文件,通过操作系统进行身份验证的特权用户拥有SYSORA和SYSOPER权限 
    EXCLUSIVE: 
    1.表示只有一个数据库实例可以使用密码文件 
    2.允许将SYSORA和SYSOPER权限赋值给SYS以外的其它用户 
    SHARED: 
    1.表示可以有多个数据库实例可以使用密码文件 
    2.不允许将SYSORA和SYSOPER权限赋值给SYS以外的其它用户 
    所以,如果要以操作系统身份登录,Remote_Login_Passwordfile应该设置为NONE 
    当登录用户不是ORA_DBA组和ORA_OPER组成员时,登录数据库需要在Oracle中创建当前操作系统用户相同的用户名,如果当前用户是域用       户,则名称为:domainname/yourname,如果是本地计算机用户,则名称为:computername/yourname 
    创建方法: 
    create "domainname/yourname" identified externally; 
    操作系统,修改HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0下面添加AUTH_PREFIX_DOMAIN,值设为FALSE,在创建Oracle用户时可以忽略     掉域名 
    这种方式下,init.ora中有一个参数将影响数据库如何匹配一个windows用户和Oracle用户os_authent_prefix = "" 
    缺省为空,Oracle8i以前,无该参数,而使用OPS$作为用户名前缀.(Oracle用户名最大长度限制为30个字符) 
关于域名(主机名)解析      
           /etc/hosts (UNIX) 
           或者windows/hosts(WIN98)  winnt/system32/drivers/etc/hosts (WIN2000) 
           客户端需要写入数据库服务器IP地址和主机名的对应关系。 
           127.0.0.1       localhost 
           192.168.0.35    oracledb oracledb 
           192.168.0.45    tomcat tomcat 
           202.84.10.193   bj_db   bj_db    
           有些时候我们配置好第一步后,tnsping 数据库服务器别名显示是成功的, 
           但是sqlplus username/password@servicename不通,jdbc thin link 也不通的时候,         
           一定不要忘了在客户端做这一步,原因可能是DNS服务器里没有设置这个服务器IP地址和主机名的对应关系。 
           如果同时有私有IP和Internet上公有IP,私有IP写在前面,公有IP写在后面。 
           编辑前最好留一个备份,增加一行时也最好用复制粘贴,避免编辑hosts时空格或者tab字符错误。 
UNIX下ORACLE多数据库的环境,OS客户端需要配置下面两个环境变量 
           ORACLE_SID=appdb;export ORACLE_SID 
           TWO_TASK=appdb;export TWO_TASK 
      来指定默认的目标数据库   
#————- 
平时排错可能会用到的 
1.lsnrctl status查看服务器端listener进程的状态 
LSNRCTL>; help 
The following operations are available 
An asterisk (*) denotes a modifier or extended command: 
start stop status 
services version reload 
save_config trace change_password 
quit exit set* 
show* 
LSNRCTL>; status 
:em11: 
2.tnsping 查看客户端sqlnet.ora和tnsname.ora文件的配置正确与否,及对应的服务器的listener进程的状态。 
C:/>tnsping orcl 
TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 – Production on 16-8月 – 
2005 09:36:08 
Copyright (c) 1997, 2003, Oracle. All rights reserved. 
Used parameter files: 
E:/oracle/product/10.1.0/Db_2/network/admin/sqlnet.ora 
Used TNSNAMES adapter to resolve the alias 
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) 
(HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_ 
NAME = orcl))) 
OK (20 msec) 
3. 
SQL>;show sga 查看instance是否已经启动 
SQL>; select open_mode from v$database; 查看数据库是打开还是mount状态。 
OPEN_MODE 
———- 
READ WRITE 
使用hostname访问数据库而不是tnsname的例子 
使用tnsname访问数据库是默认的方式,但是也带来点问题,那就是客户端都是需要配置tnsnames.ora文件的。如果你的数据库服务器地址发生改变,就需要重新编辑客户端这个文件。通过hostname访问数据库就没有了这个麻烦。 
需要修改 
服务器端listener.ora 
#监听器的配置文件listener.ora 
#使用host naming则不再需要tnsname.ora文件做本地解析 
# listener.ora Network Configuration File: d:/oracle/product/10.1.0/db_1/NETWORK/ADMIN/listener.ora 
# Generated by Oracle configuration tools. 
SID_LIST_LISTENER = 
(SID_LIST = 
(SID_DESC = 
# (SID_NAME = PLSExtProc) 
(SID_NAME = orcl) 
(GLOBAL_DBNAME = boway) 
(ORACLE_HOME = d:/oracle/product/10.1.0/db_1) 
# (PROGRAM = extproc) 


LISTENER = 
(DESCRIPTION_LIST = 
(DESCRIPTION = 
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) 

(DESCRIPTION = 
(ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521)) 


客户端sqlnet.ora 如果确认不会使用TNSNAME访问的话,可以去掉TNSNAMES 
# sqlnet.ora Network Configuration File: d:/oracle/product/10.1.0/db_1/NETWORK/ADMIN/sqlnet.ora 
# Generated by Oracle configuration tools. 
SQLNET.AUTHENTICATION_SERVICES= (NTS) 
NAMES.DIRECTORY_PATH= (HOSTNAME) 
Tnsnames.ora文件不需要配置,删除也无所谓。 
下面就是网络和操作系统的配置问题了,怎么样能够解析我的主机名的问题了 
可以通过下面的方式连接 
sqlplus sys/oracle@boway 
这样的话,会连接boway这台服务器,并且listener来确定你所要连接的service_name 
常见故障解决办法: 
TNS-12154 (ORA-12154):TNS:could not resolve service name 
该错误表示用于连接的网络服务名在tnsnames.ora文件中不存在,如上面的tnsnames.ora中的网络服务名只有test,假如用户在连接时用sqlplus system/manager@test1则就会给出TNS-12154错误。 
要注意的是,有时即使在tnsnames.ora文件中有相应的网络服务名,可是用该网络服务名连接时还会出错,出现这种情况的典型配置如下(在客户端的机器上): 
sqlnet.ora文件: 
NAMES.DIRECTORY_PATH = (TNSNAMES, ….) 
NAMES.DEFAULT_DOMAIN = server.com 
tnsnames.ora文件: 
test = 
(DESCRIPTION= 
(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521)) 

(CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com) 


sql*plus运行基本机理: 
在用户输入sqlplus system/manager@test后,sqlplus程序会自动到sqlnet.ora文件中找NAMES.DEFAULT_DOMAIN参数,假如该参数存在,则将该参数中的值取出,加到网络服务名的后面,即此例中你的输入由sqlplus system/manager@test自动变为sqlplus system/manager@test.server.com ,然后再到tnsnames.ora文件中找test.server.com网络服务名,这当然找不到了,因为该文件中只有test网络服务名,所以报错。解决的办法就是将sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN参数注释掉即可,如 #NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN参数不存在,则sqlplus程序会直接到tnsnames.ora文件中找 test网络服务名,然后取出其中的host,port,tcp,service_name,利用这些信息将连接请求发送到正确的数据库服务器上。 
另外原则上tnsnames.ora中的配置不区分大小写,但是我的确遇到区分大小写的情况,所以最好将使用的网络服务与tnsnames.ora中配置的完全一样。 
ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect Descriptor. 
该错误表示能在tnsnames.ora中找到网络服务名,但是在tnsnames.ora中指定的SERVICE_NAME与服务器端的 SERVICE_NAME不一致。解决的办法是修改tnsnames.ora中的SERVICE_NAME。 
易混淆术语介绍: 
Db_name:对一个数据库(Oracle database)的唯一标识,该数据库为Oracle database。这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了Db_domain参数,这样在数据库的标识是由Db_name和 Db_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们将Db_name和 Db_domain两个参数用’.’连接起来,表示一个数据库,并将该数据库的名称称为Global_name,即它扩展了Db_name。 Db_name参数只能由字母、数字、’_’、’#’、’$’组成,而且最多8个字符。 
Db_domain:定义一个数据库所在的域,该域的命名同互联网的’域’没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。 
Global_name:对一个数据库(Oracle database)的唯一标识,oracle建议用此种方法命令数据库。该值是在创建数据库是决定的,缺省值为Db_name. Db_domain。在以后对参数文件中Db_name与Db_domain参数的任何修改不影响Global_name的值,如果要修改 Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO 命令进行修改,然后修改相应参数。 
Service_name:该参数是oracle8i新引进的。在8i以前,我们用SID来表示标识数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name参数,该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。该参数的缺省值为Db_name. Db_domain,即等于Global_name。一个数据库可以对应多个Service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即不必Service name 必须与SID一样。 
Net service name:网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。 
如何利用配置的网络服务名连接到数据库: 
  用sqlplus程序通过test网络服务名进行测试,如sqlplus system/manager@test。如果不能连接到数据库,则在tnsname.ora文件中的test网络服务名(net service)后面加上Oracle数据库的DB_Domain参数值,通过用sqlplus> show parameter db_domain命令察看。此处db_domain参数值为testserver.com,将其加到网络服务名后面,修改后的tnsname.ora中关于该网络服务名的内容为: 
应该改为: 
如何利用配置的网络服务名连接到数据库: 
用sqlplus程序通过test网络服务名进行测试,如sqlplus system/manager@test。如果不能连接到数据库,则在tnsname.ora文件中的test网络服务名(net service)后面加上sqlnet.ora文件中NAMES.DEFAULT_DOMAIN参数的值,此处我的参数值为 testserver.com,将其加到网络服务名后面,修改后的tnsname.ora中关于该网络服务名的内容为: 
什么情况下会引起oracle自动设置NAMES.DEFAULT_DOMAIN参数? 
出现这种情况的典型环境为windows的客户端的‘我得电脑à属性à计算机名à更改à其它…à此计算机的主DNS后缀’中设置了‘primary dns suffix’,因为在这种情况下安装客户端时,会在sqlnet.ora文件中自动设置NAMES.DEFAULT_DOMAIN参数,或许当把计算机加入域中安装oracle客户端时也会出现这种情况,有条件的话大家可以试一下。 
我在设置oracle的客户端时一般手工修改tnsnames.ora文件,但是还有许多人喜欢用图形工具配置,该图形工具最终还是修改tnsnames.ora文件,但是它有时会引起其它的问题: 
在用oracle的图形配置软件’net assistant’或‘Net Configuration Assistant’配置网络服务名时,假如已经设置了‘primary dns suffix’,但是在图形配置软件中写的网络服务名的名字中没有‘primary dns suffix’,如只是写了test,则图形配置软件会自动在后面加上‘primary dns suffix’,使之变为test.testserver.com,并存在tnsnames.ora中,而不管你的sqlnet.ora文件中是否有 NAMES.DEFAULT_DOMAIN参数。此时,用图形工具进行测试连接是通过的,但是假如此时sqlnet.ora文件中没有 NAMES.DEFAULT_DOMAIN参数,则你在使用网络服务名时应该使用在tnsnames.ora中的 test.testserver.com,而不是你在图形配置软件中键入的test。解决的办法为: 
可以在sqlnet.ora文件中设置NAMES.DEFAULT_DOMAIN= testserver.com,这时你可以用test或test.testserver.com连接数据库 
在sqlnet.ora文件中不设置NAMES.DEFAULT_DOMAIN参数,在tnsnames.ora文件中将 test.testserver.com中的.testserver.com去掉,这时你可以用test连接数据库

listener.ora、 tnsnames.ora和sqlnet.ora这3个文件是关系oracle网络配置的3个主要文件,其中listener.ora是和数据库服务器端 相关,而tnsnames.ora和sqlnet.ora这2个文件不仅仅关系到服务器端,主要的还是和客户端关系紧密。 
检查客户端oracle网络的时候可以先检查sqlnet.ora文件:

# SQLNET.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/sqlnet.ora 
# Generated by Oracle configuration tools. 
SQLNET.AUTHENTICATION_SERVICES= (NTS) 
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES) 
##NAMES.DEFAULT_DOMAIN = us.oracle.com

上面的sqlnet.ora文件说明: 
SQLNET.AUTHENTICATION_SERVICES= (NTS)——这个表示采用os认证,在数据库服务器上,可以利用sqlplus “/ as sysdba”。一般这个配置在windows上是ok的,在unix环境下可能会有问题,一般在unix下可以去掉这个配置。

NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)——表示将首先利用tnsnames进行解析;如果tnsnames解析不到,将使用hostname解析;如果hostname解析不 到,将采用onames进行解析。

被注释掉的NAMES.DEFAULT_DOMAIN = us.oracle.com——表示采用默认的domain name为us.oracle.com,在tnsnames.ora中如果配置对应的解析,如果原来的别名oralocal,那么,当启用这个参数后,在 tnsnames中的配置要改成oralocal.us.oracle.com。在使用tnsping时或者sqlplus登录时,只需写前面的别名,系 统会自动加上后面的domain name来进行解析。

检查完毕sqlnet.ora,一般都会发现是使用tnsname来解析别名的,那么,tnsnames.ora中可以有哪些配置种类呢?

# TNSNAMES.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora 
# Generated by Oracle configuration tools. 
###### 一般的配置 ################################## 
ORALOCAL = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) 
    ) 
    (CONNECT_DATA = 
      (SERVER = DEDICATED) 
      (SERVICE_NAME = oralocal) 
    ) 
  ) 
###### 这样也行,用SID=oralocal ########################### 
ORALOCAL_2 = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) 
    ) 
    (CONNECT_DATA = 
      (SERVER = DEDICATED) 
      (SID = oralocal) 
    ) 
###### RAC的配置(3节点rac) ############################### 
ORALOCAL = 
  (DESCRIPTION = 
  (load_balance = yes) 
  (failover = on) 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)) 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521)) 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))    
    ) 
    (CONNECT_DATA = 
        (SERVICE_NAME = oralocal) 
        (SERVER = DEDICATED) 
        (failover_mode=(type=select)(method=basic)(retries=20)(delay=20)) 
    ) 
  ) 
ORALOCAL_NODE1 = 
   (DESCRIPTION = 
     (ADDRESS_LIST = 
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)) 
       ) 
       (CONNECT_DATA = 
         (SERVICE_NAME = oralocal) 
         (INSTANCE_NAME = oralocal_node1) 
       ) 
   ) 
ORALOCAL_NODE2= 
   (DESCRIPTION = 
     (ADDRESS_LIST = 
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521)) 
       ) 
       (CONNECT_DATA = 
         (SERVICE_NAME = oralocal) 
         (INSTANCE_NAME = oralocal_node2) 
       ) 
   ) 
ORALOCAL_NODE3 = 
   (DESCRIPTION = 
     (ADDRESS_LIST = 
       (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521)) 
       ) 
       (CONNECT_DATA = 
         (SERVICE_NAME = oralocal) 
         (INSTANCE_NAME = oralocal_node3) 
       ) 
   ) 
  ) 
###### DATA GUARD配置(primary库和standby库都需要配置)############## 
standby = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.2)(PORT = 1521)) 
        ) 
    (CONNECT_DATA = 
          (SERVER=DEDICATED) 
          (SERVICE_NAME = oralocal) 
      ) 
  ) 
primary = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.1)(PORT = 1521)) 
        ) 
    (CONNECT_DATA = 
          (SERVER=DEDICATED) 
          (SERVICE_NAME = oralocal) 
      ) 
  )

另外需要注意的2点情况: 
(1)如果tnsnames中的service_name配置错误,配置成了instance_name了,这个时候会发生tnsping能通,但是 sqlplus连接不上的奇怪情况。报错ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor。这个时候查错的时候,需要检查对应的service_name。 
(2)如果远程数据库是rac,而且本地客户端端远程数据库处于不同的网段,通过公网链接,rac对外的ip映射只有一个,即只映射到一个节点。请注意在 客户端配置tnsnames的时候按照单机的情况来配置。呵呵,dba不仅仅要学习oracle,了解一些网络的知识,特别是自己系统的网络架构,也是需 要的。

Oracle网络配置用到的sqlnet.ora,tnsnames.ora,listener.ora文件
注:文章内容由网络及相关书籍整理而来,如此只为共享知识,给予帮助。

listener.ora、tnsnames.ora和sqlnet.ora这3个文件是关系oracle网络配置的3个主要文件,都是放在$ORACLE_HOME/network/admin目录下。其中listener.ora是和数据库服务器端相关,而tnsnames.ora和sqlnet.ora这2个文件不仅仅关系到服务器端,主要的还是和客户端关系紧密。

一、客户端设置

1.sqlnet.ora

通过这个文件来决定怎样找一个连接中出现的连接字符串

示例文件: 
    # sqlnet.ora Network Configuration File: F:/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora 
    # Generated by Oracle configuration tools.

    # This file is actually generated by netca. But if customers choose to 
    # install "Software Only", this file wont exist and without the native 
    # authentication, they will not be able to connect to the database on NT.

    SQLNET.AUTHENTICATION_SERVICES= (NTS)

    NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME, ONAMES, EZCONNECT)

    #NAMES.DEFAULT_DOMAIN = oracle.com

内容说明:

SQLNET.AUTHENTICATION_SERVICES= (NTS)——这个表示采用OS认证,在数据库服务器上,可以利用sqlplus / as sysdba。一般这个配置在windows上是ok的,在unix环境下可能会有问题,一般在unix下可以去掉这个配置。

NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)——表示将首先利用tnsnames进行解析;如果tnsnames解析不到,将使用hostname解析;如果hostname解析不到,将采用onames进行解析;最后使用EZCONNECT解析。例如我们客户端输入:sqlplus zidi/zidi@changbai,那么,客户端就会首先在tnsnames.ora文件中找orcl的记录.如果没有相应的记录则尝试把orcl当作一个主机名,通过网络的途径去解析它的IP地址然后去连接这个IP上global_name=changbai这个实例,当然我这里orcl并不是一个主机名。

被注释掉的NAMES.DEFAULT_DOMAIN = changbai.com——表示采用默认的域名为changbai.com,在tnsnames.ora中如果配置对应的解析,如果原来的数据库别名是oralocal(即网络服务名),那么,当启用这个参数后,在tnsnames中的配置要改成oralocal.changbai.com。在使用tnsping时或者sqlplus登录时,只需写前面的别名,系统会自动加上后面的域名来进行解析。

2.tnsnames.ora

这个文件放在客户端机器上,记录客户端访问数据库的本地配置,其实就是定义网络服务,只有当sqlnet.ora中有“NAMES.DIRECTORY_PATH= (TNSNAMES)”这样的字样时,也就是客户端解析连接字符串的顺序中有TNSNAMES时,才会尝试使用这个文件。

示例文件: 
# tnsnames.ora Network Configuration File: F:/oracle/product/10.2.0/db_1/NETWORK/ADMIN/tnsnames.ora 
# Generated by Oracle configuration tools.

HUINAMN =网路服务名 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 108.108.108.108)(PORT = 1521))访问数据库使用的协议,数据库计算机的主机名或IP地址,数据库的端口号 
    ) 
    (CONNECT_DATA = 
      (SID = HN)数据库实例名,前提是所连接的数据库是Oracle8或更低版本 
    ) 
  ) 
CHANGBAI = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = 208.208.208.208)(PORT = 1521)) 
    ) 
    (CONNECT_DATA = 
      (SERVICE_NAME = CB)数据库服务名,即全局数据库名 
    ) 
  ) 
ORCL = 
  (DESCRIPTION = 
    (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) 
    ) 
    (CONNECT_DATA = 
      (SERVER = DEDICATED)使用专用服务器模式去连接,这需要跟服务器的模式匹配,如果没有就根据服务器的模式自动调节 
      (SERVICE_NAME = orcl) 
    ) 
  )

二、服务器端设置 
listener.ora

它是listener监听器进程的配置文件。关于listener进程就不多说了,接受远程对数据库的接入申请并转交给oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,同样的如果关闭listener进程并不会影响已经存在的数据库连接。 
示例文件: 
# listener.ora Network Configuration File: F:/oracle/product/10.2.0/db_1/network/admin/listener.ora 
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =这里定义LISTENER进程为哪个实例提供服务 
  (SID_LIST = 
    (SID_DESC = 
      (SID_NAME = PLSExtProc) 
      (ORACLE_HOME = F:/oracle/product/10.2.0/db_1) 
      (PROGRAM = extproc) 
    ) 
  )

LISTENER =监听器的名字,一台数据库可以有不止一个监听器 
  (DESCRIPTION_LIST = 
    (DESCRIPTION = 
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))监听器监听的协议,IP,端口等 
      (ADDRESS = (PROTOCOL = TCP)(HOST = dabeng)(PORT = 1521)) 
    ) 
  )

上面的例子是一个最简单的例子,但也是最普遍的。一个listener进程为一个数据库实例(SID)提供服务。

三、总结

上面说到的三个文件都可以通过图形的配置工具来完成配置:Database Configuration Assistant,Net Configuration Assistant 
具体的配置可以尝试一下,然后来看一下配置文件,这样一来总体结构就有了,是当你输入sqlplus zidi/zidi@changbai的时候

1. 查询sqlnet.ora看看名称的解析方式,发现是TNSNAME 
2. 则查询tnsnames.ora文件,从里边找orcl的记录,并且找到主机名,端口和service_name 
3. 如果listener进程没有问题的话,建立与listener进程的连接。 
4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的server process。 
5. 这时候网络连接已经建立,listener进程的历史使命也就完成了。

换个角度理解: 
changbai是我们连接远端数据库用到的服务命名,但是最终必须转化为host:port:servide_name这样的连接字串,而这个转化可以理解为是翻译的过程,而要想翻译成功,则必须选择好翻译方法,那么sqlnet.ora就是我们用来选择翻译方法的,其中的NAMES.DIRECTORY_PATH= (TNSNAMES) 就是我们选择的命名解析方法; tnsnames.ora是翻译方法中的一种——本地命名解析方法的配置文件,就好像我们选择了查字典方法,这个文件就是我们的字典一样里面存放着所有服务命名对应的连接字串;至于listener.ora则是负责接受我们请求的负责任人——连接地址配置文件,里面包括了连接负责人的连接地址,也放着经过他允许可以连接的数据库信息。这样就构成了Oracle的网络架构。


转载出处:http://blog.csdn.net/selfsupport/archive/2010/07/11/5726303.aspx


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tnsnames.ora配置小结 的相关文章

  • 如何在MySQL数据库中插入数据?

    我有一个 ASP NET 应用程序和一个 MySQL 数据库 我想编写一个类来插入 删除和显示数据库中的数据 我有到数据库的连接 但无法在数据库中插入数据 我的班级插入方法 public string CreateEntry string
  • 在 MongoDB 中查找 7 天前的记录

    我有一个包含对象的集合 如下所示 1 id ObjectId 551c6605e4c6ac495c923aab sender id ObjectId 551c6605e4c6ac495c923aac rep sender id 38 sen
  • 使用 SqlBulkCopy 和 Azure 并行批量插入

    我在云上有一个带有 sql azure 数据库的 azure 应用程序 我有一个辅助角色 需要对文件 最多约 3000 万行 进行解析 处理 因此我无法直接使用 BCP 或 SSIS 我目前正在使用 SqlBulkCopy 但这似乎太慢了
  • 数组 (UUID[ ]) 会破坏 1NF 吗?

    我的问题是包含 UUID 数组的字段是否会破坏范式 http en wikipedia org wiki Database normalization 在包含数组之前位于 NF 中的表中 原表 CREATE TABLE Floor Floo
  • 同步2个具有不同模式的数据库

    我们有一个使用通用表设计的标准化 SQL Server 2008 数据库 因此 我们没有为每个实体 例如产品 订单 订单项等 使用单独的表 而是使用通用表 实体 实例 关系 属性等 我们决定建立一个单独的非规范化数据库来快速检索数据 您能否
  • 哪些 ORM 与 Scala 配合得很好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在哪里可以下载可用作数据仓库的示例数据库? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以下载可用于创建数据仓库的示例数据库 它不应该是来自 Microsoft Northwind
  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • 如何获取与值匹配或存在于另一个表中的记录?

    我试图弄清楚在这种情况下如何获取所有任务 其中两个字段等于某个值或者它们存在于另一个表中 这是查询 SELECT TASKS task id TASKS task title TASKS task description TASKS tas
  • 时间序列数据的键值存储?

    我一直在使用 SQL Server 存储数十万个对象的历史时间序列数据 每天观察大约 100 次 我发现查询 给我时间 t1 和时间 t2 之间对象 XYZ 的所有值 太慢 对于我的需要 慢超过一秒 我按时间戳和对象 ID 建立索引 我考虑
  • DB2连接授权失败原因:Java不支持安全机制

    我正在尝试使用 DB2JDBC Type4 驱动程序配置 DB2 连接 但我收到这个错误 线程 main 中的异常 com ibm db2 jcc am SqlInvalidAuthorizationSpecException jcc t4
  • 通过 JDBC 将“daterange”字段值插入 PostgreSQL 表

    我在 PostgreSQL 9 3 有一个表日期范围 http www postgresql org docs 9 3 static rangetypes html字段类型 我可以像使用 JDBC 的字符串一样选择此字段 但无法将其插入表中
  • CloudKit 通过 cron 作业发送推送通知?

    我正在创建一个大学餐饮菜单应用程序 在其中我需要根据每日菜单发送推送通知 最初 我计划通过 Heroku 将用户数据存储在数据库中 并使用 cron 作业将数据库中的数据与每日菜单进行比较 并向用户发送适当的通知 然而 在 Cloudkit
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • 什么是数据库池?

    我只是想了解数据库连接池的概念以及它是如何实现的 数据库联系池是一种用于保持数据库连接打开的方法 以便其他人可以重用它们 通常 打开数据库连接是一项昂贵的操作 尤其是在数据库位于远程的情况下 您必须打开网络会话 进行身份验证 检查授权等等
  • Neo4j Desktop DB 无法启动,状态为“KILLED”

    运行 Neo4j Desktop 版本 1 0 15 尝试启动DB导致启动失败 数据库启动失败 DB database f8950fdd 6b5f 4fea 8c9f e8457ee1da9a v3 3 1 退出 状态为 已杀 检查日志 主
  • 在触发期间更新 oracle 中的同一行?

    简短的问题 因为我不知道如何搜索这个 我可以 重新更新 同一行吗 例如 我有一个存储付款小计的字段 并且考虑到我的业务限制 我可以更新该值 我可以仅用触发器更新同一行的总计吗 预先谢谢您 顺便说一句 我正在使用 Oracle 和 PL SQ
  • 使用Python将文本文件导入Access 2003数据库

    我正在尝试使用我正在开发的 Python 3 4 应用程序将管道分隔的文本文件导入到具有现有表的 Access 数据库中 但遇到了一些麻烦 该应用程序将用于导入不同的文本文件 因此我使用条目小部件来写入文件名 并且我希望将输入的文件的内容加
  • 我应该用不可变或可变的数据结构来表示数据库数据吗?

    我目前正在使用 Scala 进行编程 但我想这适用于任何函数式编程语言 或者更确切地说 任何建议不变性并可以与数据库交互的编程语言 当我从数据库中获取数据时 我将其映射到模型数据结构 在函数式编程中 数据结构往往是不可变的 但是数据库中的数
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含

随机推荐

  • GOM 登录器源码及编译教程

    常见登录器引擎如下 BLUE LEGEDN引擎 一般应用于1 70 1 76 复古 80英雄合击 85英雄合击版本 MirXM2引擎 一般应用于1 70 1 76 复古 80英雄合击 85英雄合击版本 3km2引擎 一般应用于1 95 英雄
  • matlab 快速均匀采样

    目录 一 算法概述 二 代码实现 三 结果展示 四 测试数据 一 算法概述 实现从every k points个点中选取一个来达到下采样的目的 二 代码实现 清空变量 clc clear close all
  • java找不到符号解决办法

    一 java找不到符号 如果你的代码里没有报错 明明是存在的 但是java报错找不到符号 像下面这样子 二 解决步骤 1 清除编码工具缓存 本人用的idea eclipse清除缓存方式有需要的可以百度一下 2 如果是mavne项目的 先cl
  • valid 与 same的卷积方式

    http www jianshu com p 05c4f1621c7e 这个简书的作者已经写得很清楚了
  • spss 异常值

    spss 异常值剔除 用什么方法 1 可以通过 分析 下 描述统计 下 频率 的 绘制 直方图 看图发现频数出现最少的值 就可能是异常值 但还要看距离其它情况的程度 2 可通过 分析 下的 描述统计 下的 探索 下的 绘制 选项的 叶茎图
  • 嵌入式AI-K210篇-硬件-模型训练、部署

    K210的其他参数如下 双核 64 bit RISC V RV64IMAFDC RV64GC CPU 400MHz 可超频到600MHz 双精度 FPU 8MiB 64bit 片上 SRAM 6MiB通用SRAM 2MiB的AI专用SRAM
  • 谷歌机器学习:问题构建 (Framing):机器学习主要术语

    谷歌机器学习 问题构建 Framing 机器学习主要术语 地址 https developers google cn machine learning crash course framing ml terminology 什么是 监督式
  • Linux只允许特定IP访问特定端口

    目录 1 查看 开启 关闭防火墙 2 查看 开放 关闭端口 3 给指定的IP开放 关闭指定的端口 4 规则的持久化位置 5 其它命令 1 查看 开启 关闭防火墙 查看服务器的防火墙状态可使用如下命令 查看防火墙状态 systemctl st
  • sqlserver单独备份某个表_T+应急备份和恢复数据方法汇总

    对于企业系统管理员来讲 定时地将企业数据备份出来存储到不同的介质上 如常见的光盘 网络磁盘等等 对数据的安全性是非常重要的 如果企业由于不可预知的原因 如地震 火灾 计算机病毒 人为的误操作等等 造成数据损失或丢失 需要对数据进行恢复 此时
  • 快速搭建你的MQTT服务器

    MQTT服务器在Linux和Windows上的搭建稍微有些区别 不过使用第三方开源的项目一般会有比较详细的说明文档 不做过多赘述 笔者搭建环境是windows10 ActiveMQ 1 windows MQTT服务器下载 https act
  • neo4j修改节点(包括属性,关系)

    将 傅式级数 这个节点删除 并把 单位冲激序列的傅里叶变换 这个节点 指向 傅氏级数 这个节点 match r where id r 76247 detach delete r match p KnowledgeBlock name 单位冲
  • Sass 条件-循环语句

    学习Sass中 if else for while each 一 条件判断 if else 示例 1 mixin blockOrHidden boolean true 2 if boolean 3 debug boolean is bool
  • OpenCV机器视觉-边缘与轮廓

    边缘与轮廓 基于图像边缘提取或二值化的基础寻找对象轮廓 边缘提取的阈值会最终影响轮廓发现的结果 主要API要有以下俩个 findContours发现轮廓 drawContours绘制轮廓 查找轮廓 处理的图像 轮廓列表 继承关系 cv fi
  • druid的解密

    项目中往往配置的数据库密码不是明文 当我们的数据库配置的密码是一系列的你看不懂的文字时 你就应该考虑是不是是druid的加解密了 使用druiid的加解密 首先应该配置依赖
  • 简易虚拟培训系统-UI控件的应用3

    目录 Button组件的组成 Button组件方法1 在Button组件中设置OnClick 回调 Button组件方法2 在脚本中添加Button类的监听 上一篇使用了文件流读取硬盘数据并显示在Text组件中 本篇增加使用按钮来控制显示哪
  • 牛客网SQL题目解析(答案+解析+理解)

    本文记录了牛客网sql全部题目的答案与难题解析 部分题目包含多种解法 并且涵盖了开窗函数等各种语法点的理解 标题中高亮的题目 是易错题 牛客网刷题链接 牛客网sql在线练习 本文所有语句使用mysql8 0 参考教程资源 mysql教程1
  • 贪心法求解背包问题

    编写程序 输入一组物体重量以及它们的价值大小 对每一个物体求出它对的价值重量比 按由大到小的顺序排列 每一次取出这个比值最大且物体可以被包装下的物体 直到包装满为止 输出装入背包的物体 并给出装入物体的编号以及它们各自的价值和装入背包的物体
  • java commons-chain_Apache commons chain 初探

    Apache commons chain 是什么 Apache common chain 是对责任链设计模式的改造封装 让使用者更加方便的使用 简单回顾一下责任链设计模式 在阎宏博士的 JAVA与模式 一书中开头是这样描述责任链 Chain
  • 收藏

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 仅作学术分享 不代表本公众号立场 侵权联系删除 转载于 来自 知乎 https www zhihu com question 56024942 编辑 AI有道 卷积神经网
  • tnsnames.ora配置小结

    oracle网络配置 三个配置文件 listener ora sqlnet ora tnsnames ora 都是放在 ORACLE HOME network admin目录下 1 sqlnet ora 作用类似于linux或者其他unix