在Windows的服务中启动监听器时,报告错误如图4-25所示。
图4-25 监听器错误信息
在命令行启动监听器,也出现错误,如下所示。
注册表优化工具或者其他原因导致注册表的键ImagePath丢失都会使监听器不能正常启动。
打开注册表。
进入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleOraDb10g_home1TNSListener。OracleOraDb10g_home1TNSListener含有监听器的名字。
展开OracleOraDb10g_home1TNSListener以后,在右面单击鼠标右键,选择“新建”→“可扩充字符串值”→输入键的名字“ImagePath”,输入ImagePath的值E:\Oracle\product\10.2.0\db_1\BIN\TNSLSNR,ImagePath的值根据TNSLSNR的路径不同而有所变化。
重新启动监听器。
监听器启动成功。
连接数据库时,报告错误“没有监听器”(no listener)。
监听器没有启动。
在服务器端,用lsnrctl status命令确定监听器是否已经启动。
从这里看出,监听器没有启动。
注意: 如果使用的不是默认的监听器,则要使用lsnrctl status listener_name命令查看监听器的状态,listener_name表示监听器的名称。
启动监听器。
【小贴士(Tip)】 “没有监听器”(no listener),可能是由于下面的原因造成的。
(1)客户端指定的目标主机的IP地址有误。
(2)客户端指定的端口号(PORT)有误。
(3)客户端指定的实例名(SID与SERVICE_NAME)有误。
(4)服务器端监听器没有启动。
以图4-26所示的方式连接数据库,其中nbo是网络服务名(Net Service Name)。
图4-26 登录数据库的窗口
单击“确定”按钮,报告如下错误:
端口号(PORT)的错误会导致TNS-12541错误。配置网络服务名时,客户端的端口号必须和数据库服务器端监听器的端口号相同。
登录数据库服务器,用lsnrctl status命令查看监听器是否正在运行。
从这里可以看出,服务器端的监听器运行正常。
如果监听器被停掉,则执行lsnrctl status命令将会显示类似于如下的信息:
看到这里,很多朋友肯定会很郁闷,明明监听器正在运行,为什么Oracle还会报告监听器不存在呢。有时候,我们不能够太相信Oracle的错误提示!
仔细对比客户端网络服务名(Net Service Name)nbo的参数和服务器端监听器的相应参数是否匹配。
服务器端监听器的配置(listener.ora)如下:
客户端的配置(tnsnames.ora)如下:
仔细对比,我们发现,服务器端监听器的端口号(PORT)和客户端配置文件中指定的端口号(PORT)不同。服务器端监听器的端口号是1521,客户端指定的端口号是1522。
将客户端的端口号(PORT)改成1521,一切搞定,连接数据库正常。
数据库服务器端tnsnames.ora的配置如下:
启动监听器AUXI时,发生错误,具体过程如下:
经过仔细检查,发现初始化参数文件(PFILE)中设置参数local_listener=LISTENER_AUXI,LISTENER_AUXI是网络服务名。网络服务名(Net Service Name)LISTENER_AUXI指向的地址是:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.200.33)(PORT=1521))),而监听器没有监听1521这个端口。在本例中,监听器监听的端口号是1522。
在服务器端,找到网络配置文件tnsnames.ora。
tnsnames.ora文件的位置由环境变量TNS_ADMIN指定,如果没有设置这个环境变量,则默认的位置是$ORACLE_HOME/network/admin(UNIX平台)或%ORACLE_HOME%\network\admin(Windows平台)。
其中,ORACLE_HOME表示Oracle主目录(Oracle Home)。
修改tnsnames.ora。
将
改成
这使得服务名LISTENER_AUXI所引用的端口号和服务器端监听器的端口号(1522)相同。同时,LISTENER_AUXI所引用的主机地址也必须和监听器的主机地址相同。
listener.ora是监听器配置文件,监听器启动的时候,会读取这个文件。这个文件决定监听器监听的主机(HOST)、监听的数据库(SID)、监听的端口号(PORT)等信息。监听器的默认端口号是1521。可以通过修改文件listener.ora来修改监听器的端口号。
找到监听器配置文件listener.ora,文件的内容大致如下:
其中,PORT用来指定监听器的端口号。
修改端口号。
修改监听器配置文件的PORT参数。如:可以把PORT=1521改成PORT=1522。
修改完监听器的端口号以后,重新启动监听器。
启动监听器。
出现下面的错误:
这是因为目标主机不存在所造成的。目标主机就是监听器要监听的数据库服务器。
找到监听器配置文件listener.ora。listener.ora文件的位置由环境变量TNS_ADMIN指定,如果没有设置这个环境变量,则默认的位置是$ORACLE_HOME/network/admin(UNIX平台)或%ORACLE_HOME%\network\admin(Windows平台)。
其中,ORACLE_HOME表示Oracle主目录(Oracle Home)。
查看文件listener.ora的内容。listener.ora文件当前的内容如下:
从这里可以看出,我们指定了一个错误的IP地址,因为IP地址是192.168.200.38的这台机器根本不存在,正确的IP地址应该是192.168.200.33。
把文件listener.ora中的IP地址改成正确的IP地址。
将HOST=192.168.200.38改成HOST=192.168.200.33。其中,192.168.200.33是实际存在的机器。
重新启动监听器。
网络简要描述:Oracle数据库服务器的网口被连接到一个网络集线器上。
在数据库服务器端启动监听器时,报告错误TNS-12545,具体过程如下:
这个问题很奇怪,百思不得其解,网络集线器的网线没有插好时会发生这种错误。
插好网线,使网络连接的图标变成
。
重新启动监听器。
监听器启动成功。
启动SQL*Plus连接数据库时,报告权限不足,具体过程如下:
如果出现ORA-01031错误,则说明Oracle试图去找口令文件(password file),但是找不到(口令文件丢失或者用户没有创建口令文件)。
创建口令文件。
■ FILE:指定口令文件的名称及路径。
■ PASSWORD:指定用户SYS的口令。
■ ENTRIES:指定最多可以有多少个超级用户(具有SYSDBA权限的用户)。
■ FORCE:是否强制覆盖已经存在的口令文件(Password File)。
查看用户SYS是否已经有了SYSDBA权限。
如果SYSDB是TRUE,说明用户sys已经有了SYSDBA权限。
重新连接数据库。
启动SQL*Plus,登录数据库,产生错误,具体过程如下:
在Windows中,如果服务OracleService<SID>没有启动,则用户试图连接数据库就会产生ORA-12518错误。
在Windows中单击“开始”→“设置”→“管理工具”→“服务”,启动服务“OracleServiceWM”,WM是我们创建的数据库。
重新启动SQL*Plus,然后登录数据库。
以图4-27所示的方式连接数据库,其中nbo是网络服务名(Net Service Name)。
图4-27 登录数据库的窗口
单击“确定”按钮,报告如下错误:
配置Oracle网络客户端时,如果客户端网络配置文件tnsnames.ora中使用了非法的网络协议,则会引起TNS-12538错误。合法的网络协议有IPC、Named Pipes、SDP、TCP/IP、TCP/IP with SSL。
找到客户端的网络配置文件tnsnames.ora。
tnsnames.ora文件的位置由环境变量TNS_ADMIN指定,如果没有设置这个环境变量,则默认的位置是$ORACLE_HOME/network/admin(UNIX平台)或者%ORACLE_HOME%\network\admin(Windows平台)。
其中,ORACLE_HOME表示Oracle主目录(Oracle Home)。
检查网络服务名(Net Service Name)的语法是否正确。
当前网络服务名nbo(Net Service Name)的内容如下:
从这里可以看出,本例中使用的协议是TCPk,TCPk是一种非法的网络协议。
将客户端的协议(PROTOCOL)设置成和监听器相同的协议(PROTOCOL)。
Oracle的认证方式由sqlnet.ora文件中的SQLNET.AUTHENTICATION_SERVICES参数控制。当把sqlnet.ora文件中的参数设置成SQLNET.AUTHENTICATION_SERVICES=(NTS)时,客户端通过操作系统认证的方式登录数据库。
使用#号注释掉参数SQLNET.AUTHENTICATION_SERVICES。如:
【小贴士(Tip)】 sqlnet.ora文件位于%ORACLE_HOME%\network\admin目录下面,其中ORACLE_HOME是环境变量,表示Oracle主目录。
使用网络服务名(Net Service Name)nbo连接数据库时,提示错误:
在配置客户端连接时,客户端的SID必须和数据库服务器端的SID完全相同。如果客户端的SID和数据库服务器端的SID不匹配,将会产生ORA-12505错误,用户将无法登录数据库。
找到客户端配置文件tnsnames.ora.这个文件通常位于%ORACLE_HOME%\network\admin目录下面,其中ORACLE_HOME是环境变量,表示Oracle主目录(Oracle Home)。这个文件的内容大致如下:
其中,nbo是我们指定的网络服务名(Net Service Name),我们就是通过nbo来连接数据库的。
找到tnsnames.ora文件中的参数SID,修改SID,使客户端的SID和服务器端监听器的SID相同。
【小贴士(Tip)】 SID一般情况下是在创建数据库时由用户自己指定的。
客户端的网络配置文件tnsnames.ora如下:
sqlnet.ora的配置如下:
使用网络服务名(Net Service Name)bss连接数据库时,报告错误“TNS-03505 Failed to resolve name”(无法解析服务名)。
本例中,产生TNS-03505错误,是由于我们使用了错误(或不存在)的网络服务名(Net Service Name)所造成的。本例中,bss是不存在的网络服务名(Net Service Name)。
找到客户端的网络配置文件tnsnames.ora。
sqlnet.ora文件的位置由环境变量TNS_ADMIN指定,如果没有设置这个环境变量,则默认的位置是$ORACLE_HOME/network/admin(UNIX平台)或者%ORACLE_HOME%\network\admin(Windows平台)。
其中,ORACLE_HOME表示Oracle主目录(Oracle Home)。
查看文件tnsnames.ora中是否存在刚才登录时使用的网络服务名(Net Serv ice
Name)bss。经过检查,该文件中不存在网络服务名bss。
往文件tnsnames.ora中添加网络服务名bss,内容大概如下:
■ HOST=192.168.200.33表示客户端要连接的主机地址。
■ SERVICE_NAME=nbo表示要连接的实例(instance)。
■ PORT用于指定端口号。
重新登录数据库。
【小贴士(Tip)】 我们可以手工修改tnsnames.ora的内容,也可以使用Oracle的图形界面工具Net Manager进行修改。网络服务名(Net Service Name)的语法有严格的定义,因此,对于初学Oracle的朋友来说,推荐使用图形界面工具进行修改;对于DBA来说,还是推荐手工对tnsnames.ora的内容进行修改,这样比较方便,不用把时间浪费在启动图形界面上。
Oracle网络客户端配置tnsnames.ora的内容如下:
sqlnet.ora的内容如下:
连接数据库,网络服务名是xxx,如图4-28所示。
图4-28 登录数据库的窗口
单击“确定”按钮,报告TNS-03505:Failed to resolve name错误。仔细检查,网络服务名xxx的配置都是正确的。
网络配置文件sqlnet.ora中的参数NAMES.DEFAULT_DOMAIN定义了默认的域名。在连接数据库的时候,Oracle会自动把默认的域名追加到网络服务名之后。如:NAMES.DEFAULT_DOMAIN=wm.com.cn,网络服务名是xxx,在连接数据库时,网络服务名就自动变成了xxx.wm.com.cn。经过检查,发现sqlnet.ora中的NAMES.DEFAULT_DOMAIN=wm.com.cn。
把sqlnet.ora中的NAMES.DEFAULT_DOMAIN=wm.com.cn注释掉。
如:
再次使用网络服务名xxx连接数据库。
客户端网络配置文件tnsnames.ora的内容如下:
客户端网络配置文件sqlnet.ora的内容如下:
连接数据库,网络服务名是xxx,如图4-29所示。
图4-29 登录数据库的窗口
单击“确定”按钮,报告错误“TNS-03505:Failed to resolve name”。
网络配置文件sqlnet.ora中的参数NAMES.DEFAULT_DOMAIN定义了默认的域名。在连接数据库的时候,Oracle会自动把默认的域名追加到网络服务名的后面。如:NAMES.DEFAULT_DOMAIN=wm.com.cn,网络服务名是nbo,在连接数据库时,网络服务名就自动变成了nbo.wm.com.cn。
但是,如果在连接时指定了域名(如:CONNECT scott/tiger@sales.us.acme.com),则默认域名不会被追加到网络服务名之后。
经过检查,sqlnet.ora中的NAMES.DEFAULT_DOMAIN没有定义。sqlnet.ora的配置没有错误。
最后发现,我们的网络服务名被定义成xxx.wm.com.cn。
连接数据库时,手工加上域名,如图4-30所示。
图4-30 登录数据库的窗口
这里使用xxx.wm.com.cn连接数据库。
客户端网络配置文件tnsnames.ora的内容如下:
文件sqlnet.ora的内容如下:
连接数据库,网络服务名是xxx,如图4-31所示。
图4-31 登录数据库的窗口
单击“确定”按钮,报告“TNS-03505:Failed to resolve name”错误。
客户端网络配置文件sqlnet.ora中的参数NAMES.DEFAULT_DOMAIN定义了默认的域名。在连接数据库的时候,Oracle会自动把默认的域名追加到网络服务名的后面。如:NAMES.DEFAULT_DOMAIN=wm.com.cn,网络服务名是nbo,在连接数据库时,网络服务名就自动变成了nbo.wm.com.cn。但是,如果在连接时指定了域名(如:CONNECT scott/tiger@sales.us.acme.com),则默认域名不会被追加到网络服务名的后面。
经过检查,sqlnet.ora中的NAMES.DEFAULT_DOMAIN=wm.com.cn。
在不注释掉sqlnet.ora中的NAMES.DEFAULT_DOMAIN=wm.com.cn的情况下,把tnsnames.ora中的网络服务名由现在的
改成
连接数据库方式如图4-32所示,其中nbo是网络服务名。
图4-32 登录数据库的窗口
单击“确定”按钮,报告错误“TNS-12535:TNS:operation timed out(连接超时)”。
看到这样的错误提示,我们的第一感觉是操作系统(OS)出现问题,应该从OS这一层查找问题的所在。可能是我们要连接的主机已经停机,或者目标主机的IP地址配置有问题,或者我们要连接的主机根本不存在,或者网线没有插好等。
用操作系统命令ping目标主机,看看目标主机是否存在。
一般情况下,我们从这里基本就可以断定问题的所在。
如果ping的结果是“Request t imed out”,则表示客户端到目标主机(192.168.200.38)的网络不通。这时候,需要解决操作系统这一层的网络连接问题。如果不是操作系统的网络问题,则再查看问题是不是出在Oracle这一层。
找到客户端的网络配置文件tnsnames.ora,看看我们指定的主机地址是否正确。tnsnames.ora文件的位置由环境变量TNS_ADMIN指定,如果没有设置这个环境变量,则默认的位置是$ORACLE_HOME/network/admin(UNIX平台)或者%ORACLE_HOME%\network\admin(Windows平台)。
其中,ORACLE_HOME表示Oracle主目录(Oracle Home)。
这个文件的内容如下:
从这里可以看出,这里连接的主机名192.168.200.38错误,这台主机根本不存在。我们想连接的正确主机应该是192.168.200.33。
连接数据库方式如图4-33所示,其中nbo是网络服务名。
图4-33 登录数据库的窗口
单击“确定”按钮,报告错误“TNS-12533:TNS:illeg al ADDRESS parameters”。
各位朋友一看到上面的错误提示信息,不用多想,肯定是网络服务名配置出现语法错误。
找到客户端网络配置文件tnsnames.ora。tnsnames.ora文件的位置由环境变量TNS_ADMIN指定,如果没有设置这个环境变量,则默认的位置是$ORACLE_HOME/network/admin(UNIX平台)或者%ORACLE_HOME%\network\admin(Windows平台)。
其中,ORACLE_HOME表示Oracle主目录(Oracle Home)。
检查网络服务名的语法是否正确。
当前网络服务名的内容如下:
仔细检查,我们发现地址描述(connect descr iptor)的关键字ADDRESS_LISTd多了一个“d”,正确的应该是ADDRESS_LIST。
去掉这个多余的字符,我们就可以连接数据库了。
【小贴士(Tip)】 连接描述符(connect descriptor)涉及的关键字(Oracle保留字)有DESCRIPTION、ADDRESS_LIST、ADDRESS等,如果这些关键字出现错误,则肯定会报告错误“TNS-12533:TNS:illegal ADDRESS parameters”。所以,对于不太熟悉网络服务名语法的朋友来说,还是推荐使用图形界面工具(Net Manager)来配置Oracle的网络。
连接数据库方式如图4-34所示,其中nbo是网络服务名。
图4-34 登录数据库的窗口
单击“确定”按钮,报告错误“TNS-12504:TNS:listener was not given the SID in CONNECT_DATA”。
这个错误和SID(或SERVICE_NAME)的设置有关系。
找到客户端网络配置文件tnsnames.ora。tnsnames.ora文件的位置由环境变量TNS_ADMIN指定,如果没有设置这个环境变量,则默认的位置是$ORACLE_HOME/network/admin(UNIX平台)或者%ORACLE_HOME%\network\admin(Windows平台)。
其中,ORACLE_HOME表示Oracle主目录(Oracle Home)。
检查网络服务名的配置。
网络服务名的语法如下:
从这里可以看出,我们在配置客户端的时候,不小心在关键字SERVICE_NAME上多加了一个“s”,同时,在地址描述符的定义中,我们也没有使用SID,所以在连接数据库时会报告找不到SID。
去掉SERVICE_NAMEs的“s”后,就可以连接数据库了。
启动SQL*Plus,然后登录数据库,报告错误,具体过程如下:
在Windows中,如果语句数据库相关的服务OracleService<SID>没有启动,就会导致ORA-12560错误。
在Windows中单击“开始”→“设置”→“管理工具”→“服务”,启动服务“OracleServiceWM”,WM是我们创建的数据库。
重新启动SQL*Plus,然后登录数据库。
启动SQL*Plus,然后登录数据库,出现错误,具体信息如下:
这是由于环境变量ORACLE_SID没有设置或者设置错误所造成的。在启动SQL*Plus以前,我们在DOS窗口的命令行执行了这样的命令:set Oracle_sid=BBC。这个命令设置的SID(BBC)不存在,造成了ORA-12560错误。
◆ 方法一 :设置正确的ORACLE_SID,然后登录数据库。
设置环境变量ORACLE_SID。
wm是实例名。
登录数据库。
成功登录数据库。
◆ 方法二 :连接数据库时,使用网络服务名。
这里使用网络服务名wm连接数据库,网络服务名wm是在Oracle网络中进行配置的。
登录数据库,nbo是网络服务名。
一段时间以后,客户端还在连接数据库,这时候,数据库因为意外停机,或者因日常维护被强行关闭。我们再次使用刚才的SQL*Plus界面重新登录数据库,会提示如下所示的错误。
如果数据库启动以后,再次使用刚才的SQL*Plus界面重新登录数据库,又会报告下面的错误。
退出SQL*Plus。
重新启动SQL*Plus,然后登录数据库。
登录数据库成功。
硬件平台:两台DELL 6850,一台EMC CX300光纤存储。
两台DELL 6850共享一台EMC CX300光纤存储,加上Oracle 10g构建一套Oracle RAC(集群)。
客户端的网络(Tnsnames.ora)配置成负载均衡模式。
172.16.20.7是第一个节点的虚拟IP地址(VIP);172.16.20.8是第二个节点的虚拟IP地址(VIP)。
连接第一个节点的网络服务名配置如下:
连接第二个节点的网络服务名配置如下:
当使用网络服务名nbo1连接第一个节点(172.16.20.7)时,不论什么时候连接,不论怎么连接,都不会报错。
当使用网络服务名nbo2连接第二个节点(172.16.20.8)时,不论什么时候连接,不论怎么连接,都不会报错。
但是,当使用网络服务名nbo(配置成负载均衡)连接数据库的时候,有时候能够成功,有时候会失败。失败时提示错误“ORA-12545:Connect failed because target host or object does not exist”(因目标主机或对象不存在,连接失败)。如果第一次连接失败,则多试几次,总有一次能够成功连接数据库。
ping第一个节点,没问题。ping第二个节点,没问题。tnsping第一个节点(nbo1),没有问题。tnsping第二个节点(nbo2),也没有问题。数据库、监听器、网络各方面都正常!
当一个客户端要连接数据库时,客户端首先向服务器端的监听器发出请求,然后监听器会根据客户端的请求信息(主机名/IP地址、SID、协议、端口号等)来决定是否允许客户端进行连接。如果客户端的网络服务名(Net Service Name)中含有主机名,则会去客户端查找hosts文件,通过hosts文件把主机名解析成IP地址,如果通过hosts文件不能够解析主机名,则会产生“Connect failed because target host or object does not exist”的错误。但是,我们的客户端配置文件tnsnames.ora中没有使用主机名,全部使用IP地址。通过Google,找到国外的几篇文章,才彻底明白RAC(集群)环境下的客户端连接过程。RAC环境下的客户端连接和单机环境下的连接是不同的。
在RAC(集群)环境下,当使用一个配置成负载均衡(Load Balance)的网络服务名(如nbo)连接数据库时,首先,客户端向监听器发出请求,监听器会检查每个节点的负载情况,监听器会选择负载最小的那个节点,把那个节点的信息返回给客户端,然后客户端再使用监听器返回的信息重新连接数据库。在返回信息中,可能含有主机名。如果返回的主机名不能够被客户端解析,就会产生错误。例如:如果客户端使用网络服务名nbo连接数据库,监听器接到客户端请求以后,监听器发现第一个节点(172.16.20.7)很繁忙,于是监听器把第二个节点的信息(包含主机名。本例中的第二个节点的监听器配置使用主机名)返回给客户端。客户端通过文件hosts(这个文件在客户端的机器上)对主机名(第二个节点的主机名)进行解析。而客户端的hosts文件中恰恰没有关于这个主机名的信息,这时候将返回错误。
◆ 方法一 :把所有的主机名都改成IP地址。
修改服务器端监听器的配置文件listener.ora,将主机名全部改成IP地址,具体步骤如下。
以用户oracle的身份登录服务器。
进入监听器配置文件listener.ora所在的目录。
其中,ORACLE_HOME是环境变量,表示Oracle主目录(Oracle Home)。
编辑监听器配置文件。
把主机名都改成IP地址。
如将HOST=node2改成HOST=192.168.200.33。
重新启动监听器。
修改客户端网络配置文件tnsnames.ora,将主机名都换成IP地址。
◆ 方法二 :使用主机名的情况。
修改客户端的hosts文件,在文件中加入服务器的主机名和IP地址的映射关系。
如:
172.16.20.7是第一个节点的IP地址,node1是第一个节点的主机名。172.16.20.8是第二个节点的IP地址,node2是第二个节点的主机名。
hosts文件的默认路径如下:
启动SQL*Plus,用网络服务名tt连接数据库,具体过程如下:
这里使用网络服务名tt来连接数据库。
连接数据库时,如果客户端网络配置文件tnsnames.ora文件不存在,则会产生ORA-12154错误,换句话说,就是没有配置好Oracle网络客户端。
◆ 方法一 :用图形界面工具Net Manager配置Oracle客户端。
◆ 方法二 :手工配置Oracle客户端。
进入下面的目录。
其中ORACLE_HOME是环境变量,表示Oracle主目录(Oracle Home)。
建立文件tnsnames.ora。
往文件中加入如下内容:
■ tt是我们指定的网络服务名,这个名字由用户自己指定。
■ PROTOCOL指定我们用什么协议连接数据库,这里的协议必须和服务器端监听器的协议相同。一般使用TCP(TCP/IP)。
■ HOST=192.168.200.88指定服务器的IP地址,也就是指定客户端要连接哪台服务器。
■ SERVICE_NAME=nbo,也就是SID,指定要连接哪个实例(instance),这里的SID必须和服务器端监听器监听的SID相同。
■ PORT=1521指定端口号,这里的端口号必须和服务器端监听器的端口号完全相同。
测试客户端配置是否成功。
tnsping命令会通过文件tnsnames.ora解析tt,从这个文件获得要目标的IP(HOST=192.168.200.88)、实例名(SERVICE_NAME=nbo)、端口号(PORT=1521),然后向监听器发出请求。如果成功,则在最后会返回类似于“OK(20 msec)”的信息,“OK”表示请求成功,20 msec表示整个过程耗费了20ms。如果客户端配置不当,则会返回其他错误信息。
登录数据库时报告错误,具体过程如下:
即使指定网络服务名连接数据库,也会报出这样的错误。如:sys@NBO as S YSDBA,NBO是网络服务名,即使这样连接数据库,也会产生ORA-12162错误。
用env命令查看用户oracle的环境变量。
可以发现,少了环境变量ORACLE_SID=NBO。
◆ 方法一 :临时设置。
在每次启动SQL*Plus以前,设置好环境变量。
设置完环境变量以后,就可以启动SQL*Plus,登录数据库。
这种方式只是临时的,每次登录操作系统以后,都要执行上面的设置。
NBO是本例中的SID。
◆ 方法二 :永久设置。
以用户oracle的身份登录操作系统(OS)。
查看用户启动文件。
会看到一个文件.profile,这个文件是用户配置文件(用户启动文件)。
编辑文件.profile。
往这个文件中加入如下内容:
每次用户oracle登录操作系统的时候,都会自动执行这个文件,不再需要再手工设置环境变量。也就是说,这种设置是永久的。
启动SQL*Plus,登录数据库,出现错误,具体过程如下:
客户端配置文件tnsnames.ora的内容如下:
服务器端监听器配置文件listener.ora的内容如下:
客户端配置正常。从监听器的配置中可以看出,少了有关数据库的描述。
把监听器的配置文件listener.ora改为
其中添加了有关数据库的描述。
此外,产生ORA-12514还有可能由其他原因造成的,如指定SERVICE_NAME时,应该指定的是数据库的名字,而不是实例的名字。
【小贴士(Tip)】 可以手工编辑监听器配置文件listener.ora,添加有关数据库的描述;也可以使用图形界面工具Net Manager(用命令netmgr启动)来修改有关监听器的配置。
客户端网络配置文件tnsnames.ora的内容如下:
启动SQL*Plus,使用网络服务名AUXI登录数据库时,报告错误“ORA-12523:TNS:listener could not find instance appropriate for the client connection”。
将客户端网络配置文件tnsnames.ora的内容由
改成
客户端网络配置文件tnsnames.ora的内容如下:
启动SQL*Plus登录数据库。
Oracle官方的解释是“Cause:None of the known and available service handlers for requested type of server(dedicated or shared)are appropriate for the client connection”。
客户端试图请求一个共享服务器连接(SERVER=SHA RED),但是数据库被配置成专有服务器模式(DEDICATED SERVER)。
◆ 方法一 :把数据库配置成共享服务器模式(SHARED SERVER)。
◆ 方法二 :改变客户端请求,使客户端请求专有服务器(DEDICATED SERVER)连接。
找到tnsnames.ora文件。tnsnames.ora文件的位置由环境变量TNS_ADMIN指定,如果没有设置这个环境变量,则默认的位置是$ORACLE_HOME/network/admin(UNIX平台)或者%ORACLE_HOME%\network\admin(Windows平台)。
其中,ORACLE_HOME表示Oracle主目录(Oracle Home)。
编辑文件tnsnames.ora。
将网络服务名改成如下形式:
这里将参数SERVER的值改成DEDICATED,使客户端总是请求专有服务器(DEDICATED SERVER)连接。
重新连接数据库。
以如图4-35所示的方式连接数据库。其中,nbo是网络服务名,网络服务名nbo中设置的端口是1522。
图4-35 登录数据库的窗口
单击“确定”按钮,半天没有反应,最后报告错误“ORA-12170:TNS:Connect timeout occurred”。
这表明和防火墙有关,奇怪的是,用netstat命令查看,1522端口却是开放的。
这种问题只出现在Windows平台。
经过分析,这和防火墙的设置有关系。
Oracle的监听器(listener)只起一个中介的作用。当客户端使用特定的端口(如1521)连接监听器时,它根据配置寻找到相应的数据库实例,分裂一个新的数据库连接,然后监听器(listener)返回一个不同的端口(PORT)给客户机,这个端口(PORT)和监听器的端口(PORT)是截然不同的,然后客户端就不再和监听器通信。客户端就使用这个新的端口直接和数据库进行通信,即使监听器被停掉,客户端和数据库之间仍然能够正常通信。这个新的端口是不可预知的,因而会被防火墙阻止。
◆ 方法一 :在数据库服务器上关闭Widows XP自带的防火墙。
单击屏幕右下角的“Windows安全警报”,出现如图4-36所示的界面。
图4-36 W indows安全中心
单击“Windows防火墙”,出现如图4-37所示的界面。在防火墙的“常规”
选项卡中选择“关闭(不推荐)”来禁用防火墙。
单击“确定”按钮,关闭防火墙。
重新连接数据库,连接成功。
【小贴士(Tip)】 关闭防火墙(Firewall)是一种不可取的方法,它会使我们的系统遭受非法入侵者的攻击。因此,使用这种方法的时候,一定要三思而后行!
◆ 方法二 :在防火墙启用的情况下。
打开Windows防火墙,选择“例外”选项卡,如图4-38所示。
图4-37 W indows防火墙
图4-38 设置例外
单击“添加程序”按钮,出现如图4-39所示的界面。
单击“浏览”按钮,添加%Oracle_home%\Bin\oracle.exe,Oracle_home是Oracle的主目录(Oracle Home),可以在注册表中找到它指向的路径。
单击“确定”按钮,回到“例外”的界面,单击“添加端口”按钮,出现如图4-40所示的界面。
图4-39 选择“例外”的应用程序
图4-40 设置“例外”的端口
在“名称”中输入任意一个名称,如oracle_port。在“端口号”中输入监听器的端口号,如1522。选择监听的协议,一般选择TCP。单击“确定”按钮,配置完成。
重新连接数据库,连接成功!
【小贴士(Tip)】 修改防火墙(Firewall)后,不需要重新启动数据库,也不需要重新启动监听器。
执行tnsping命令,产生TNS-12535错误,如下所示:
这表明和防火墙有关,奇怪的是,用netstat命令查看,1522端口却是开放的。
经过分析,这和防火墙的设置有关系。
Oracle的监听器(listener)只起一个中介的作用。当客户端用一个端口(如1521)连接监听器时,它根据配置寻找到相应的数据库实例,分裂一个新的数据库连接,然后监听器(listener)返回一个不同的端口给客户机,这个端口和监听器的端口是截然不同的,然后客户端就不再和监听器通信。客户端就使用这个新的端口直接和数据库进行通信。即使监听器被停掉,客户端和数据库之间仍然能够进行通信。
这个新的端口是不可预知的,因而会被防火墙阻止。
该解决方法同故障“ORA-12170:TNS:Connect timeout occurred”的解决方法。
客户端IP地址:192.168.200.33
从客户端(192.168.200.33)连接数据库时,报告连接已关闭。具体过程如下:
在Oracle中,可以通过防火墙或者Oracle服务器端的网络配置文件sqlnet.ora对特定客户端的IP进行限制,限制这些客户端访问Oracle数据库。如果做了这样的限制,当客户端试图连接数据库时,将会产生ORA-12537错误。
◆ 方法一 :如果是网络中的防火墙做了限制,请联系网络管理员。
◆ 方法二 :如果是sqlnet.ora对客户端进行了限制,则执行下面的过程。
找到服务器端的网络配置文件sqlnet.ora。sqlnet.ora文件的位置由环境变量TNS_ADMIN指定,如果没有设置这个环境变量,则默认的位置是$ORACLE_HOME/network/admin(UNIX平台)或%ORACLE_HOME%\network\admin(Windows平台)。
其中,ORACLE_HOME表示Oracle主目录(Oracle Home)。
查看并修改sqlnet.ora的内容。
■ tcp.validnode_checking=yes表示启用客户端的IP检查,非法的IP将被拒绝访问Oracle。
■ tcp.invited_nodes=(IP1,IP2,IP3…)表示允许哪些IP访问Oracle。
■ tcp.excluded_nodes=(IP1,IP2,IP3…)表示拒绝哪些IP访问Oracle。
本例中,客户端IP地址(192.168.200.33)在列表tcp.excluded_nodes中,因此,客户端(192.168.200.33)被拒绝访问数据库。把客户端(192.168.200.33)放到tcp.invited_nodes指定的列表中。
如果手工编辑sqlnet.ora文件比较麻烦,则可通过Net Manager来修改客户端IP地址限制,如图4-41所示。
在这里,192.168.200.33被放到“允许访问的客户机”列表中。
sqlnet.ora文件修改完成以后,一定要重新启动监听器。
图4-41 编辑概要文件
再次连接数据库,连接成功。