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:
    4)connection descriptor:oracle 连接描述串
    (DESCRIPTION=
         (ADDRESS=(PROTOCOL=tcp)(HOST=my-server) PORT=1521))
             (CONNECT_DATA=
                (SERVICE_NAME=mydb.us.acme.com)))
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值