环境:windows 2k advServer SP2 + oracle 8.1.7.4
一 standby database不同模式的特点及其作用
……standby
database可以分别运行在三种模式下,即手工恢复模式(manual recover mode)、自动恢复模式(managed
recover mode)和只读模式(read only mode)。通过这三种不同的运行方式,oracle standby
database提供了丰富的功能。
……1
手工模式:手工模式是standby database运行的基础模式,在这个模式下,standby
database并不自动使用主库传递过来的日志进行恢复而保持与主库的同步,而是需要手工进行恢复。虽然我们可以配置主库的归档位置,使得主库的归档日
志能自动传递到手工模式的待用库,但更多的情况下是使用操作系统命令手工传递日志,因而理论上我们可以为一个主库配置无穷多个手工模式的待用库。
……
在手工模式下,待用库可以看作是处于静止状态,数据文件、控制文件等是一致的,我们可以简单的关闭一个手工模式的待用库,从而得到一个数据文件一致的冷备
份,再用这个冷备份结合归档日志来做其他方式的恢复,比如时间点恢复,指定事务号的恢复,特定的数据文件的恢复,或者是做完全恢复等。
……
当创建完一个备用库,并且使用alter database mount standby
database加载以后,待用库即处于手工恢复模式。在这个模式的基础上,我们可以以只读方式打开(open)它,或者是将他切换到自动恢复模式,或者
是进行手工恢复,或者是关闭它而得到一个一致的冷备份,或者是激活它成为一个普通的数据库。
……2
自动恢复模式:将一个standby
database切换到自动恢复模式需要两个前提:一是主库的归档日志能自动传递过来,二是切换之前,standby
database与主库的最大归档日志号是一致的,即没有日志序列缺失(gap sequence
我实在不知道这样的一个单词应该怎样翻译,从原文来讲,应该是序列缝隙,而从oracle文档里的意思来讲,应该是指待用库的v$log_history
里的最大日志号与主库的v$log_history
里的最大日志号之间的差距,即是待用库里还有多少个主库的日志没有用于恢复,就起了这样一个名字。各位大侠如果有更合适的词来翻译这个短语,请不吝赐
教)。有了这两个前提,就可以将一个standby database 从手工模式切换到自动模式。当standby database
处于自动模式时,它可以自动应用主库传递过来的归档日志进行恢复,从而使得standby
database数据与主库保持一致(相差主库在线日志里记录的事务)。在8i版本,一个主库的日志归档路径最多有5个,其中一个必须是本地路径,因此,
从理论上讲,一个主库最多只能带4个自动模式的待用库。
……
自动模式的待用库使用起来非常方便,只要日志能正常归档,不需要对它进行干预。当主库出现问题时,我们可以简单的将一个自行恢复模式的待用库激活,即可替
代主库运行,数秒钟的操作即可完成这个转换。但是,如果因为任何原因出现了日志序列缺失,那么自动模式就会中止,从而回到手工模式。
……3
只读模式:将一个standby database 置于只读模式是oracle在8i以后才增加的功能。Oracle 7
只有手工模式,8.0以后增加了自动模式,815以后才增加了standby database 的只读模式。我们可以将一个standby
database以只读模式打开,然后对数据库进行查询,在上面运行较大较复杂的查询事务,比如统计报表之类的,减轻主库的负担。也可以通过查询最新的数
据来检验standby
database是否真的自动恢复了主库的数据,是否真的与主库同步了。如同oracle文档所讲的那样,我们可以将一个只读模式的standby
database切换到手工模式,或者是自动模式,从而再次使得这个standby database能保持与主库同步。
……
据oracle文档讲,在只读模式上运行较大较复杂的查询事务时,我们可能需要使用磁盘进行排序操作。在只读模式下,我们可以为一个只读的库创建一个临时
表空间来进行排序,这样将在磁盘上创建一个临时文件,而不需要改变standby
database的控制文件。关于oracle文档里讲到的临时表空间的问题,我看得不是很明白,当时也没有时间做这方面的测试,这里就不细细的再翻译文
档了,免得误导大家。等我详细的做完测试,彻底搞清楚这个临时表空间的问题之后,再专门的写一个专题贴上来。
二 oracle standby database三种模式的相互关系
……
在oracle文档里,提供了一张图片,描述了三种模式的相互关系。据我的测试,这张图片是错误的。如图1所示,oracle文档讲,这三种模式可以直接
的互相转换。按照我在做standby
database的测试时得出的结论(具体的测试后面单独的写一文贴上来)以及我的理解这三种模式,包括standby
database创建、激活的关系,应该是如图2所示
……
我们可以将一个手工模式的standby database切换到其他的任何一个模式,反过来讲,当一个standby
database处于其他模式时,要切换到另外一种模式,都必须先切换回手工恢复模式(或者取消只读,或者中止自动恢复),然后才能切换到想要切换的模
式。并不是如oracle文档里所讲,手工模式,自动模式与只读模式可以互相(直接)切换。不同模式的转换,必须通过手工模式作为中介(只限于8i版本。
据说9i版本可以直接的切换而不需要通过手工模式进行转换,因为我没有9i环境,也没有针对9i作过测试,也没有看过9i的文档,姑且存疑)。这就是为什
么我说手工模式是oracle standby database三种模式的基础模式的原因。后面的相互切换的测试将详细的说明这种关系。
三 standby database相互切换的测试结果
1 手工模式切换到其他模式:
……手工模式————> 自动模式
SQL>recover managed standby database;
……此时,当前的SQL*PLUS窗口停止响应。可以关闭当前窗口或者打开另外的SQL*PLUS窗口来对待用库进行管理或查询。也可以在另外的窗口中输入命令取消待用库的自动模式,即中止待用库自动恢复。
……手工模式————> 只读模式
SQL> alter database open read only;
……将一个待用库置于只读模式以后,就可以进行查询。
2 自动模式到其他模式:
……
虽然oracle文档讲,自动模式可以切换到手工模式,也可以切换到只读模式,但是文档所提供的方法,都是首先取消自动模式的自动恢复。实际上,将一个自
动模式的自动恢复取消,就是将它切换到了手工模式了。因此,自动模式的standby
database只能直接切换到手工模式,然后再通过手工模式切换到其他模式。
SQL>recover managed standby database cancel;
……或者
SQL>recover managed standby database cancel immediate;
……
这两个命令的不同之处在于,如果不带immediate选项,那么managed standby
database将当前正在进行恢复的日志恢复完成以后,才中止自动恢复,而不再读取下一个归档日志。如果添加了immediate选项,那么
managed standby
database将在读取当前使用的归档日志的下一个块之前,或者是在读取下一个日志之前中止恢复。如果输入此命令时,oracle正在使用当前日志的最
后一个块,即在读取下一个日志之前中止了恢复,那么与不带immediate选项是一样的。如果是在读取当前日志的下一个块之前中止了恢复,那么
oracle的文件是不一致的,这种情况下,不能以只读方式打开待用库(这一步未做测试,因为我的测试环境里没有产生过超过100K的日志文件,姑且信
之)。
……要想快速检测备库是否自动使用了主库的最
新的归档日志,即检测备库是否真的处于自管理模式,可以手工强制切换主库日志后,分别查询主库与备库的最大归档日志号是否一致。如果不一致,等待一段时间
后再查询(有可能备库还没有来得及用主库的日志进行自动恢复),等待的时间取决于归档日志的大小,以及机器的性能。
查询最大归档日志号的命令:
SQL>select max(sequence#) from v$log_history;
3 只读模式到其他模式:
……
同样地,oracle文档也说可以将只读模式的standby
database转换到其他模式,前提是首先关闭所有连接到待用库的连接,然后再进行切换。我在测试中发现,就连当前输入切换命令的连接也需要关闭,只读
模式的standby
database才能切换。在实际的应用中,如果连输入命令的窗口都关闭了,那么如何输入切换的命令呢?因此,想要将一个只读模式的待用库切换到其他模
式,只能先将它关闭,然后再加载它,切换到其他的模式。
SQL>shutdown immediate;
SQL>startup nomunt;
SQL>alter database mount standby database;
……此时,standby database就置于手工模式了,可以进行手工恢复,或者在消除了日志序列缺失后,切换到自动模式。
4 激活一个standby database:
……如果standby database处于手工模式之外的其他模式,首先应将之切换到手工模式,然后做手工恢复,消除日志序列缺失,再将它激活,否则可能丢失数据。
SQL>alter database activate standby database;
……完成这一步操作之后,查看在线日志组所在的目录,可以看到新生成了在线日志组。此时查询v$instance视图,数据库为start状态,此时数据库还不能进行查询或其他操作。Oracel文档讲,需要关闭数据库,然后再打开它,即作如下操作:
SQL>shutdown immdiate;
SQL>startup;
……但经测试发现,虽然在激活standby database之后数据库处于start状态,但是可以不关闭再打开它,而可以先加载,然后再打开:
SQL>alter database activate standby database;
SQL>alter database mount;
SQL>alter database open;
……这时就可以正常的使用数据库了。
这是oracle文档描述的standby database 三种模式的相互关系,按文档的说法,三种模式可以“直接”相互切换。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/90618/viewspace-670036/ ,如需转载,请注明出处,否则将追究法律责任。