Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92889
  • 博文数量: 46
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-15 03:05
文章分类

全部博文(46)

文章存档

2011年(1)

2008年(45)

我的朋友

分类: Oracle

2008-08-14 16:05:32

    许多新手在作某些oracle实验时总会配置监听器,如用rman duplicate 复制数据库,表空间时间点恢复(TSPITR),Dataguard等等,通过oracle 工具配置的默认为动态注册,在作实验时一般用不到他的优点。

  静态注册就是实例启动时读取listener.ora文件的配置,用静态注册服务数据库无论数据库处于什么状态都能连接(但不保证数据库可用)适合单机实验,例如rman可以连接nomount状态的数据库!!。采取静态注册方法时,listener.ora中的内容如下:

 LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1522))
  )(动态服务只有这么几行)

静态注册服务还有如下几行
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = rgsong)
      (ORACLE_HOME = /opt/ora10g/product/10.2.0/db_1)
      (SERVICE_NAME = rgsong)
    )
    (SID_DESC =
      (SID_NAME = aux)
      (ORACLE_HOME = /opt/ora10g/product/10.2.0/db_1)
      (SERVICE_NAME = aux)
    )
  )


  该文件表明数据库是单监听的,两个实例名为rgsong,aux,向外提供了两个服务:rgsong和aux下面主要介绍动态服务注册。


            如果用动态注册的话数据库没有到mount/open状态就不能进行远程连接,经常会出现如下错误:ORA-12514: TNS:listener does not currently know of service requested in connect  descriptor    

但tnsping还能成功,有时数据库到了mount/open状态还会有 ORA-12514:错误,一般情况下有以下几种解决方法:

                   1 reload  listener,重启数据库;

                   2 alter system register;

              * 3 检查参数文件是否设置了service_names ,  instance_name ;

为初始化参数service_names和instance_name设置显式的值是个很好的实践,尽管如果您没有设置它们,oracle也会为动态注册而生成默认值(基于db_name和db_main)。这样做的原因是,如果监听器在数据库启动之后重新启动,其动态注册行为将会有一些微妙的区别.如果监听器在数据库运行之后重新启动,仅当在init.ora文件中显式地设置了service_names和instance_name的值时,每个数据库的PMON进程才会在很短的时间之后自动注册数据库.(有了service_names,instance_name 就不怕老是重启监听了!)
如果没有显式设置service_names和instance_name的值,那么仅当数据库在监听器运行之后启动时,动态注册才会发生;在这种情况下,如果监听器后来发生了重启,动态注册信息将会丢失。参考

而且当你使用远程登录数据库时关闭数据库再startup 时也会出现ORA-12514:TNS:listener does not currently know of service requested in connect descriptor
默认监听情况下,pmon只会自动向tcp 1521的监听器自动注册,当你的监听不是默认监听时以上配置即使都一样,
仍然会出现ORA-12514,这时就须要改参数文件中local_listener=非默认监听名了,并且重启数据库!


我的实验:(
非默认监听,针对local_listener)
listener.ora

ABC =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1522))
  )  (无SID列表即是动态监听)


tnsnames.ora

RGSONG =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rgsong)
     )
    (HS = OK)
  )
AUX =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = aux)
    )
    (HS = OK)
  )

记得要重启监听哦! 

SQL> alter system set local_listener='abc' scope=spfile;
System altered.

SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00132: syntax error or unresolved network name 'abc'

google吧!
引起ORA-00119原因很多其中之一就是default listener you dont need to have local_listener set.
这里我们将ABC =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1522))
  )复制到tnsnames.ora中

tnsnames.ora
ABC =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1522))
  )

RGSONG =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rgsong)
     )
    (HS = OK)
  )

AUX =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = aux)
    )
    (HS = OK)
  )

再 startup 就ok了!!

本文如有错误之处还请大家批评指正,谢谢!








阅读(768) | 评论(0) | 转发(0) |
0

上一篇:standby Database

下一篇:遇到了 ORA-09925

给主人留下些什么吧!~~