文档库

最新最全的文档下载
当前位置:文档库 > Oracle Net配置、工作原理及常见错误分析

Oracle Net配置、工作原理及常见错误分析

Oracle Net配置、工作原理及常见错误分析

(2007-02-27 10:15:19)

转载

Oracle Net配置、工作原理及常见错误分析

oracle10g安装之后,并且创建了ORACLE数据库之后,如果没有使用netca配置ORACLE NET,或者说,没有配置listener.ora,tnsnames.ora,sqlnet.ora这几个文件,那么oracle数据库也是可以正常启动,关闭的.也就是说oracle数据库的运行并不依靠ORACLE NET 组件.可以使用sqlplus /nolog-->connect as sysdba--> startup/shutdown来启动和关闭数据库.

但是当一个客户程序(位于oracle数据库所在计算机或是其他联网计算机)想要访问ORACLE数据库时,就要配置ORACLE NET.可以通过ORACLE提供的图形界面工具netca;或者手工修改上面提到的三个配置文件来完成.

方法一:手工修改三个配置文件配置ORACLE NET

1)在数据库服务器上编辑$ORACLE_HOME/network/admin/listener.ora,定义监听器.加入如下内容:

MYLISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST= HOSTNAME.DOMAINNAME/HOST

IP) (PORT=1521))

)

)

其中:MYLISTENER是监听器名字,可以是任意字符;

缺省通信协议是TCP

HOSTNAME是本机的主机名,DOMAINNAME是其域名,也可以填写本机的IP地址.

缺省监听端口是1521

2)在客户端计算机上安装ORACLE客户端软件.(如果该计算机上安装有oracle数据库,则不必再安装oracle客户端.将3),4)中的$ORACLE_CLIENT_HOME改为$ORACLE_HOME即可).

3)编辑客户端计算机上的文件$ORACLE_CLIENT_HOME/network/admin/sqlnet.ora,指定命名方法.这里我们使用本地命名(Local Naming).加入如下行:

NAMES.DIRECTORY_PATH=(TNSNAMES)

4)编辑客户端计算机上的文件$ORACLE_CLIENT_HOME/network/admin/tnsnames.ora,定义NET SERVICE NAME.加入如下行:

BOB =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = HOSTNAME.DOMAINNAME/HOST

IP)(PORT=1521))

)

(CONNECT_DATA =

(SERVICE_NAME = bob)

)

)

其中BOB是你指定的NET SERVICE NAME;

PROTOCOL:缺省通信协议是TCP;

HOST:想要连接的数据库服务器的主机名.域名或其IP

PORT:数据库服务器上listener所监听的端口号.必须与数据库服务器上listener.ora中定义的PORT一致.

SERVICE_NAME:oracle数据库服务名,缺省情况下和创建数据库时定义的数据库全局名(database global name)一致.

方法二:使用netca图形界面工具进行配置:

1)在数据库服务器上,使用netca命令启动ORACLE NET配置工具;

2)选择第一项listener配置.为监听器起一个名字,其他选项均为缺省设置.

3)在客户端计算机上,使用启动ORACLE NET配置工具;

4)选择第二项naming method配置-->选择local naming-->其他选项均为缺省设置.

5)选择第三项local net service name配置-->输入服务名(想要访问的数据库的全局数据库名)-->输入数据库服务器的主机名/IP、PORT(缺省1521)-->输入net_service_name,可以任意.

6)如果是在数据库服务器上使用客户程序访问本机数据库,则直接使用netca配置工具进行第一,二,三项的配置即可.

实际上使用netca图形界面进行的一,二,三项配置,分别就是编辑

listener.ora,sqlnet.ora,tnsnames.ora.两种方法的效果是等价的.

下面我们测试以下oracle net是否配置成功.

1)在数据库服务器上启动数据库:sqlplus "/as sysdba"-->startup

2)在数据库服务器上启动监听器:lsnrctl start

3)在客户端计算机上,在命令行模式下输入如下命令:sqlplus sys/passwd@BOB

其中BOB是你在tnsnames.ora中定义的net_service_name.

当客户端程序发出请求串username/passwd@net_service_name之后,oracle NET 组件首先在本地查找sqlnet.ora文件确定命名方法,这里假设为local naming,则sqlnet.ora中内容如下:NAMES.DIRECTORY_PATH=(TNSNAMES).oracle NET紧接着查找tnsnames.ora,读取该文件,匹配net_service_name.如果该net_service_name匹配失败,则提示错误;如果成功则根据connect descriptor中protocol,host,port信息发给正确的listener.listener再根据connect descritpor中的service_name与向它注册了的oracle services 进行比对.如果比对成功, 则建立连接,否则提示错误.

oracle数据库库网络连接常见错误分析:

oracle10g安装之后会默认的也安装listener.如果listener处于关闭状态,则客户端程序将无法连接到数据库提供的服务,也就是说运行中的oracle数据库服务(包括ORACLE数据库实例)将处于孤立状态.这时如果使用客户程序进行连接,会报ora-12154错误,提示:no listener.可以理解为没有守侯者接受该连接请求.(任何客户端对数据库的请求都会首先发给listner,然后由listener转发给已经向其注册过的相应数据库服务.)当使用lsnrctl start 命令启动listener之后,系统中运行的服务(包括数据库实例)会自动的向listener注册自己.这时使用listener status命令,会发现listener监听的服务由原来的support no services变成了系统中运行实例的servcies name 列表.这个动态注册过程大概在一分钟之内完成(在笔者的系统环境下).在数据库启动,listener也启动,并且数据库向listener注册自己之后.这时如果使用客户程序比如sqlplus连接数据库,命令如下sqlplus username/passwd@NET_SERVICE_NAME as sysdba ,系统提示ora_12514:TNS:listener does not currently know of service requested in connect descriptor.这是

因为在连接串中的NET_SERVICE_NAME所代表的Connect description不能被listener识别.如果命名方法使用的是local naming 的话,这时可以编辑位于

$ORACLE_HOME/network/admin/tnsnames.ora,加入对NET_SERVICE_NAME的定义.以后,就可以在连接标识串中使用该NET_SERVICE_NAME连接数据库.

几个概念:

1)oracle SERVICE NAME:oracle 服务名,缺省情况下就是oracle global name:orale全局名(在使用DBCA创建数据库时指定).因此每一个数据库实例都有一个SERVICE name.可以使用sqlplus show parameter service_name来查找数据库实例的服务名.

2)oracle net service name:oracle 网络服务名.使用netca工具,配置local net service naming 时需指定的一个名字.也对应了TNS中的一个名字解析段.

该段格式为:net_service_name = connection descriptor;它经常被用在客户端连接服务器时,请求串中的connection identifier(如果命名方法是local naming).

3)connection string:连接串.客户端连接ORACLE database时,要指明该串.连接串包括username,passwd,a connect identifier.格式如下:

a)如使用local naming:

CONNECT username/passwd@connect identifier .其中Connec identifier可以是connect descriptor,也可以是net service name,该名字可以被解析为connect descriptor.

b)easy connect naming:

connect username/passwd@host[:port][/service_name]

比如: sys/syspasswd@octopus:1521/BOB

4)connection descriptor:oracle 连接描述串

(DESCRIPTION=

(ADDRESS=(PROTOCOL=tcp)(HOST=my-server) PORT=1521))

(CONNECT_DATA=

(SERVICE_NAME=http://www.wendangku.net/doc/ce545bc00c22590102029d5d.html)))