【listener】oracle静态监听和动态监听 【转载】

oracle静态监听和动态监听
 一、什么是注册?
  注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名
就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。
  在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册
到监听器中:数据库服务器对应的实例和服务。)
  相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对应的服务名(一
个数据库可能对应有多个服务名),当客户端需要连接数据库时,只需要提供服务名,就可以建立客户端和服务器之间的连接。
 二、静态注册
  静态注册就是实例启动时读取listener.ora文件的配置,将实例和服务注册到监听程序。无论何时启动一个数据库,默认地都有
两条信息注册到监听器中:数据库服务器对应的实例和服务。
  静态注册时,listener.ora中的GLOBAL_DBNAME向外提供服务名,listener.ora中的SID_NAME提供注册的实例名。
  采取静态注册方法时,listener.ora中的内容如下:
  SID_LIST_LISTENER =
  (SID_LIST =
  (SID_DESC =
  (SID_NAME = PLSExtProc)
  (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
  (PROGRAM = extproc)
  )
  (SID_DESC =
  (GLOBAL_DBNAME =orcl)
  (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
  (SID_NAME =orcl)
  )
  (SID_DESC =
  (GLOBAL_DBNAME =orcl1)
  (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
  (SID_NAME =orcl)
  )
  )
  该文件表明数据库是单实例的,实例名为orcl,向外提供了两个服务:orcl和orcl1
 三、动态注册
  动态注册是在instance启动的时候PMON进程根据init.ora中的instance_name,service_names两个参数将实例和服务动态注册到
listener中。
  首先要在init.ora中指定instance_name,service_names两个参数的值。在sqlplus下通过show parameter service_names 和show
parameter instance_name可以查看这两个参数的值。
  注册到监听器中的实例值从init.ora文件中的instance_name参数取得。如果该参数没有设定值,那么它将取init.ora文件中的
db_name的值。
  注册到监听器中的服务值从init.ora文件中的参数service_names取得。如果该参数没有设定值,数据库将拼接init.ora文件中的
db_name和db_domain的值来注册自己。如果选择提供service_names值,您可以使用完全限定的名称(比如 orcl.oracle.com)或缩写
的名称(比如orcl)。如果选择缩写的名称并设置了db_domain参数,注册到监听器中的服务将是 service_name值和db_domain值的拼
接。例如下面的设置将导致服务orcl.oracle.com被注册到监听器中:
  db_domain=oracle.com
  service_names=orcl ;
  采取动态注册方法时,listener.ora中的内容如下:
  SID_LIST_LISTENER =
  (SID_LIST =
  (SID_DESC =
  (SID_NAME = PLSExtProc)
  (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
  (PROGRAM = extproc)
  )
  )
  可选择的是,您可以在service_names参数中指定多个服务值,值之间用逗号格开,这对于共享服务器配置是很有用的。
  动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP),如果需要向非默认监听注册,则需要配置
local_listener参数!
  如果没有显式设置service_names和instance_name的值,那么仅当数据库在监听器运行之后启动时,动态注册才会发生;在这种
情况 下,如果监听器后来发生了重启,动态注册信息将会丢失。显然,最好在所有的数据库启动之前先启动监听器,这样就会避免没
有显式设置 service_names和instance_name的值时,若重启监听器带来的动态注册信息丢失的情况。
  为初始化参数service_names和instance_name设置显式的值是个值得可取的方法和建议。因为如果监听器在数据库运行过程中要
重新启 动,仅当你在init.ora文件中显式地设置了service_names和instance_name的值时,每个数据库的PMON进程才会在很短的 时
间之内完成动态注册。
 四、查询某服务是静态注册还是动态注册
  可以使用命令lsnrctl status来查看某服务是静态注册还是动态注册。
  实例状态为UNKNOWN值时表明此服务是静态注册的设置。这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连
接请求时,它才检查该实例是否存在。
  动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。不管关闭何时数据库,动态注册
的数据库都会动态地从 监听器注销,而与之相关的信息将从状态列表中消失。这样,不管数据库是在运行还是已经关闭,监听器总是
知道它的状态。该信息将被用于连接请求的回退 (fallback)和负载平衡。
  
 五、local_listener作用

pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,要想让pmon动态注册listener,需要设置local_listener参数。

LSNRCTL> start
启动tnslsnr: 请稍候...

TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
系统参数文件为e:oracleproduct10.2.0db_1networkadminlistener.ora
写入e:oracleproduct10.2.0db_1networkloglistener.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1522)))

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xys)(PORT=1522)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
启动日期 25-10月-2008 20:39:07
正常运行时间 0 天 0 小时 0 分 3 秒
跟踪级别 off
安全性 ON: Password or Local OS Authentication
SNMP OFF
监听程序参数文件 e:oracleproduct10.2.0db_1networkadminlistener.o
ra
监听程序日志文件 e:oracleproduct10.2.0db_1networkloglistener.log

监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1522)))
服务摘要..
服务 "orcl" 包含 1 个例程。
例程 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "test" 包含 1 个例程。
例程 "test", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xys)(PORT=1522)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
启动日期 25-10月-2008 20:39:07
正常运行时间 0 天 0 小时 0 分 6 秒
跟踪级别 off
安全性 ON: Password or Local OS Authentication
SNMP OFF
监听程序参数文件 e:oracleproduct10.2.0db_1networkadminlistener.o
ra
监听程序日志文件 e:oracleproduct10.2.0db_1networkloglistener.log

监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1522)))
服务摘要..
服务 "orcl" 包含 1 个例程。
例程 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "test" 包含 1 个例程。
例程 "test", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功

SQL> alter system register;    //手动注册

系统已更改。

SQL>
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xys)(PORT=1522)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ
ction
启动日期 25-10月-2008 20:39:07
正常运行时间 0 天 0 小时 0 分 21 秒
跟踪级别 off
安全性 ON: Password or Local OS Authentication
SNMP OFF
监听程序参数文件 e:oracleproduct10.2.0db_1networkadminlistener.o
ra
监听程序日志文件 e:oracleproduct10.2.0db_1networkloglistener.log

监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1522)))
服务摘要..
服务 "orcl" 包含 2 个例程。
例程 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orcl_XPT" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "test" 包含 1 个例程。
例程 "test", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功

local_listener是用在当使用非默认的端口时,PMON进程能够进行动态注册。

我们可以这么设置该值形如,local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = hostname or ip)(PORT = 1521))'

这里说下该值的一个注意点:

先看下listener.ora的配置吧

SID_LIST_LISTENER =

(SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = G:\oracle\product\\db_2)

     (PROGRAM = extproc)

   )

   (SID_DESC =

     (GLOBAL_DBNAME = orcl1)

     (SID_NAME = orcl1)

     (ORACLE_HOME = G:\oracle\product\\db_2)

     (PROGRAM = orcl1)

   )

)

LISTENER =

(DESCRIPTION_LIST =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

     (ADDRESS = (PROTOCOL = TCP)(HOST = fztxt)(PORT = 1521))

   )

)

TXT_LIS=

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = TCP)(HOST = fztxt)(PORT = 1525))

)

SID_LIST_TXT_LIS =

(SID_LIST =

   (SID_DESC =

     (SID_NAME = orcl1)

     (ORACLE_HOME = G:\oracle\product\\db_2)

     (PROGRAM = orcl1)

   )

)

我们这么设置listener.ora,这样,就有了静态的监听了,包括listener和txt_lis,我们可以通过lsnrctl start txt_lis来启动这个监听,也可以通过lsnrctl status txt_lis来观察这个监听的状态。

当我们设置了listener.ora后,txt_lis还不能被客户端访问,那怎么使这个生效呢,这时我们就要PMON来进行动态注册,这就需要local_listener了。

Local_listener有两种设置:

1、如果我们设置

Alter system set local_listener=’(ADDRESS = (PROTOCOL = TCP)(HOST = fztxt)(PORT = 1525))’。那么,我们只要alter system register;强制PMON注册,就可以实现动态注册了。

2、接下来,来讨论另外一个local_listener的设置:

Alter system set local_listener=txt_lis;

那么,PMON能识别出来吗?

答案是不能的,因为PMON不知道去哪里解析这个txt_lis。

那有一种情况:如果我们是在数据宕机的时候修改的local_listener=txt_lis;那这时启动,则会出现:

SQL> startup

ORA-00119: invalid specification for system parameter LOCAL_LISTENER

ORA-00132: syntax error or unresolved network name 'TXT_LIS'

这是因为:

要在服务器上的tnsnames.ora里做设置,来映射listener1

启动时它会去服务端的tnsnames.ora里txt_lis的含义,找不到,解析不了,则会报ora-00132的错误。

那服务端的tnsnames.ora要怎么设置呢?

Txt_lis=(ADDRESS = (PROTOCOL = TCP)(HOST = fztxt)(PORT = 1525))

加上这个就OK了。

接下来我们再做另外的:

SQL> alter system set local_listener='asdf';

alter system set local_listener='asdf'

*

第1行出现错误:

ORA-02097:无法修改参数,因为指定的值无效

ORA-00119:系统参数LOCAL_LISTENER的说明无效

ORA-00132:语法错误或无法解析的网络名称'asdf'

说明:local_listener的值不能随便设置,要在listener.ora上有相应的标识

以上是local_listener的设置问题。

另外,就像上面批注里面说的,txt_lis注册的实例和服务跟默认的监听一样,那只要我们设置了alter system set local_listener=……

这时,我们listener status ,也就是默认的监听的状态,我们发现,动态监听没有了,剩下的静态监听

可以知道,默认的监听就只有静态监听了,动态监听都在等待local_listener所对应的监听了。PMON真是见风使舵啊。

更进一步,我们发现,只要我们成功设置了local_listener的值,包括实例和服务名不和默认监听一样,PMON都会在等待local_listener对应的监听

  
  六、相关的TNS解析
  • 什么是TNS?

TNS是Oracle Net的一部分,专门用来管理和配置Oracle数据库和客户端连接的一个工具,在大多数情况下客户端和数据库要通讯,必须配置TNS,当然在少数情况下,不用配置TNS也可以连接Oracle数据库,比如通过JDBC.如果通过TNS连接Oracle,那么客户端必须安装Oracle client程序.

  • TNS有那些配置文件?

TNS的配置文件包括服务器(安装Oracle数据库的机器)端和客户端两部分.服务器有listener.ora,sqlnet.ora,tnsnames.ora,如果通过OCM(Oracle Connection Manage)和域名服务管理客户端连接,服务器端可能还包括cman.ora等文件;客户端有tnsnames.ora,sqlnet.ora. 
listener.ora:监听器配置文件,成功启动后是驻留在服务器端的一个服务.什么是监听器?监听器是用来侦听客户端的连接请求以及建立客户端和服务器端连接通道的一个服务程序.默认情况下Oracle在1521端口上侦听数据库连接请求. 
sqlnet.ora:用来管理和约束或限制tns连接的配置,通过在该文件中设置一些参数,可以管理TNS连接.根据参数作用的不同,需要分别在服务器和客户端配置. 
tnsnames.ora:配置客户端到服务器端的连接服务,包括客户端要连接到的服务器和数据库的配置信息.

Oracle所有的TNS配置文件都存放在

unix/linux: $ORACLE_HOME/network/admin 
windows: %ORACLE_HOME%/network/admin

  • TNS有那些配置工具?

我们可以手动配置,也可以通过Oracle Net Configuretion Assitant配置.

  • OracleTNS配置流程

首先在Oracle server端安装完成之后,因该先着手配置LISTENER,listenerr是进行Oracle通讯的首要组件,紧接着在客户端安装Oracle client,同时配置tnsnames.ora文件.

  • LISTENER(监听器)配置

首先监听器包括两个部分:Oracle要监听的地址、端口、通讯协议;Oracle要监听的数据库实例.非RAC环境下,LISTENER只能监听本服务器的地址和实例,RAC环境下,LISTENER还可以监听远程服务器.每个数据库最少要配置一个监听器

LISTENER=
 (DESCRIPTION=
  (ADDRESS_LIST=
    (ADDRESS=(PROTOCOL=tcp)(HOST=sales-server)(PORT=1521))
    (ADDRESS=(PROTOCOL=ipc)(KEY=extproc))
  )
 )
SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (SID_NAME=plsextproc)
      (ORACLE_HOME=/oracle10g)
      (PROGRAM=extproc)
     )
    (SID_DESC=
     (SID_NAME=mayp)
     (ORACLE_HOME=/oracle10g)
    )
   )

listener部分配置了Oracle要监听的地址信息;SID_LIST_LISTENER部分配置了Oracle需要监听的实例.

HOST参数即可以是hostname,也可以是ip地址.在一个多IP的服务器上可以配置listener同时监听多个地址.比如下面的配置:

LISTENER=
 (DESCRIPTION=
   (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.10)(PORT=1521))
      (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.2.1) (PORT=1521))
   )
  )

或者可以配置多个监听器,分别监听不同的IP地址.

Oracle Net支持的通讯协议有:

 1) TCP/IP
 2) TCP/IP with SSL
 3) Named Pipes
 4) SDP

Oracle 9i引入了动态监听服务注册,指的是我们不需要在listener.ora中配置oracle要监听的数据库实例信息,数据库启动的时候, PMON进程可以自动注册当前数据库实例到listener的监听列表.也就是说上面的SID_LIST_LISTENER部分就不用配置了。使用动态监听服务器端必须满足以下条件:

    1) 数据库必须设置INSTANCE_NAMESERVICE_NAME参数;

    2) 监听器采用默认的TCP协议并使用1521端口进行监听;

    3)如果在配置监听器时采用了其他通讯协议或者侦听端口,进行以下设置告诉Oracle采用自定义监听器:

   1)通过LOCAL_LISTENER参数明确设置当前使用的监听器,

   2)在服务器端都tnsnames.ora文件中加入自定义监听器的配置信息.如果采用了OCM,那么还可以在cman.ora中加入监听器的配置信息.

.LOCAL_LISTENER 可以通过ALTER SYSTEM动态设置.

ALTER SYSTEM SET LOCAL_LISTENER=’listener_alias’;

一个动态监听配置的示例:

listener.ora文件的配置:

LISTENER1 =
  (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.205.73)(PORT = 1421))
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.64)(PORT = 1421))
        (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
      )
   )

LOCAL_LISTENER参数的配置(因为这里采用非1521的端口):

SQL> show parameter local_listener

NAME                                 TYPE         VALUE
------------------------------------ ------------ -----------
local_listener                       string       listener1

tnsnames.ora的配置:

LISTENER1=
 (ADDRESS_LIST=
  (ADDRESS = (PROTOCOL = TCP)(HOST = dbtest)(PORT = 1421)(IP = FIRST))
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.205.73)(PORT = 1421))
  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.64)(PORT = 1421))
 )
mayp =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbtest)(PORT = 1421))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.64)(PORT = 1421))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = mayp)
      (SERVER = DEDICATED)
    )
  )
  • TNS配置

我们说的TNS配置其实就是对tnsnames.ora文件的配置,tnsnames.ora 有客户端的配置,也有服务器端的配置.客户端和服务器端配置的区别是因为服务器端的配置跟LISTENER的配置相关.下面是一个简单的配置示例:

mayp =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbtest)(PORT = 1421))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = mayp)
      (SERVER = DEDICATED)
    )
  )

同样tnsnames.ora也包括两部分,ADDRESS_LIST 部分包含了远程数据库服务器的监听地址信息,也就是要告诉TNS远程数据库可通过乃些地址和CLIENT通讯;CONNECT_DATA 定义了CLIENT要连接的数据库,还有数据库的连接方式,(专用或共享)。在一个多ip环境中,TNS也可以配置多个远程IP地址:

mayp =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbtest)(PORT = 1421))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.64)(PORT = 1421))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = mayp)
      (SERVER = DEDICATED)
    )
  )

一般在多IP环境中,还可以在TNS端配置load_balance和failover特性.这些特性在RAC环境下比较流行,load_balance特性可以让client在连接数据库是选择任意地址进行连接,是各地址的连接均衡.failover开启Oracle特有的 TAF特性,TAF为Transparent Application Failover的缩写.load_balance可以在客户端配置,也可以在服务器端配置.下面是一个客户端的配置示例:

mayp =
(DESCRIPTION =
   (ADDRESS_LIST =
     (LOAD_BALANCE=ON)
     (FAILOVER=ON)
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.205.73)(PORT = 1421))
     (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.64)(PORT = 1421))
   )
   (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = MAYP)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
      )
   )
)
  • sqlnet.ora的配置

sqlnet.ora是个很重要的配置,他可以控制和管理Oracle连接的属性,根据参数作用的不同决定在客户端配置还是在server端配置.sqlnet.ora的配置是全局性的,也就说sqlnet.ora的配置是对所有的连接起作用,如果想对某个特殊的连接或服务进行约束或限制,可以在TNS配置相应参数.详细参数可以参考:


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27425054/viewspace-750395/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/27425054/viewspace-750395/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值