在Oracle Data Guard的重建过程中,曾经发生的一次故障,现在回想应该属于备库动态监听和重启监听器问题导致的。
因当时某种原因导致,Data Guard环境需要重新搭建。为此,当我在主库上执行RMAN备份后复制到,备库的服务器,但是执行到如下步骤时,开始出错,然后我又把备库的监听器重启了...
1:RMAN> backup database format='/backup/full_%u%p%s.dbf' include current controlfile for standby;
2:将rman的备份集拷贝至standby库相同的路径
3 复制主数据库RMAN备份及控制文件到备库
注意:备份存放位置要与primary database RMAN备份文件的位置相同. 控制文件存放位置要与生成standby database controlfile的位置相同
scp /oracle/rmanback/*.dbf root@192.168.18.2:/oracle/rmanback/
scp /oracle/rmanback/*.ctl root@192.168.18.2:/oracle/oracle/oradata/stand
[@more@]4.对拷贝过来备份进行Rman duplicate恢复操作:
-bash-3.00$ rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Fri Oct 22 09:35:12 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: BOSS (DBID=1185551605)
RMAN> connect auxiliary sys/oracle@standby
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-04006: error from auxiliary database: ORA-12528: TNS:listener: all appropriate instances are blocking new connections
避免该错误方法有两个:
1、在备库上执行duplicate操作(在我第一次执行过在备库上执行该方法,通过实际操作已经验证该方法是没有问题的):
-bash-3.00$ rman target sys/onewave@primary auxiliary /
Recovery Manager: Release 10.2.0.1.0 - Production on Fri Oct 22 20:53:28 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: BOSS (DBID=1185551605)
connected to auxiliary database: BOSS (not mounted)
RMAN> duplicate target database for standby nofilenamecheck;
Starting Duplicate Db at 22-OCT-10
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: sid=1090 devtype=DISK
allocated channel: ORA_AUX_DISK_2
channel ORA_AUX_DISK_2: sid=1089 devtype=DISK
allocated channel: ORA_AUX_DISK_3
channel ORA_AUX_DISK_3: sid=1088 devtype=DISK
allocated channel: ORA_AUX_DISK_4
channel ORA_AUX_DISK_4: sid=1087 devtype=DISK
2、在备库的监听器配置为静态注册方式:
实例虽然启动,但是没有注册到监听。实例是通过PMON进程注册到监听上的,而PMON进程需要在MOUNT状态下才会启动。因此造成了上面的错误。在$ORACLE_HOME/network/admin目录下的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)
)
)
在动态监听情况下,如果监听器后来发生了重启,动态注册信息将会丢失。显然,最好在所有的数据库启动之前先启动监听器,这样就会避免没有显式设置 service_names和instance_name的值时,若重启监听器带来的动态注册信息丢失的情况。
为初始化参数service_names和instance_name设置显式的值是个很好的实践,尽管如果您没有设置它们,Oracle也会为动态注册而生成默认值(基于db_name和db_main)。这样做的原因是,如果监听器在数据库启动之后重新启动,其动态注册行为将会有一些微妙的区别.如果监听器在数据库运行之后重新启动,你们仅当您在init.ora文件中显式地设置了service_names和instance_name的值时,每个数据库的PMON进程才会在很短的时间之后自动注册数据库。
关于动态和静态监听的区别,请访问本站连接:http://kuqlan.itpub.net/post/38575/523820
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/18841027/viewspace-1055260/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/18841027/viewspace-1055260/