天天看点

创建standby过程(cp物理文件)

创建一个standby database的全过程

OS:windows 2000 advanced server SP2

Oracle:8.1.7.4

假定主库与备用库不在同一个主机上,目录结构相同,并且配置一个自管理备用库(managed standby database):

主库 备库

主机IP 192.168.1.20 192.168.1.30

主机名 PrimDB StbyDB

SID Orcl Orcl

数据库服务名 Orcl Orcl

一 创建一个主库的数据文件备份:用冷备份方式,备份到e:\shared\back

二 创建备用库的控制文件:冷备份之后,打开主库

SQL> connect internal/oracle as sysdba;

SQL>startup pfile=d:\oracle\admin\orcl\init.ora;

SQL>alter database create standby controlfile as ‘e:\shared\back\stby_ctl.ctl’;

三 通过网络复制备份的数据文件和备用控制文件到备库主机

四 配置主库的tnsnames.ora文件,添加备库别名为stby1,即下面内容:

stby1=(description=

(address=

(protocol=tcp)

(port=1523)

(host=192.168.1.30))

(connect_data=

(SID=orcl)))

五 配置备用库的listener.ora文件,添加监听服务standby_listener,在相应的节里添加有关的内容。如果原文件内已有,则修改之。

standby_listener节:

(address_list=

(host=192.168.1.30)

) )

SID_list_standby_listener节:

(sid_list=

(sid_desc=

(sid_name=orcl)

(oracle_home=d:\oracle\ora81)

这个文件中只能有这两节,不能有多个组,虽然可以定义监听的名字不同,但在启动监听服务的时候,都只启动一个监听服务。

六 重新启动备库监听服务,以使更改生效:

DOS>lsnrctl # 启动监听服务管理程序

LSNRCTL>status # 查看监听服务状态

LSNRCTL>stop # 停止监听服务

LSNRCTL>start # 启动监听服务

也可以在管理工具的服务管理里停止和启动服务。

七 配置主库的初始化参数文件init.ora,修改归档目的地。本地归档只归档到一个目录e:\log。添加以下内容:

# 定义本地归档路径,强制归档,重试时间2秒

log_archive_dest_1 = “location=e:\log\ mandatory reopen=2”

log_archive_dest_state_1 = enable

# 定义归档到备用库,强制归档,重试时间15秒。

# 如果定义为可选状态(optional),那么在归档失败后不会再次尝试归档的。定义

# 为madatory状态后,如果本次归档失败,则在归档下一个日志时会再次尝试

# 重传上一个未成功归档的日志。

log_archive_dest_2 = “service=stby1 mandatory reopen=15”

log_archive_dest_2 = enable

# 定义必须成功归档的日志数,只需要本地成功归档即可

log_archive_min_succeed_dest = 1

八 使主库修改后的参数生效。以下操作是在未重启主库时使用。如果修改主库初始化参数文件后重新启动了主库,则可以不使用下列命令。下列命令只对当前实例有效。

SQL>alter system set log_archive_dest_1 = “location=e:\log mandatory reopen=2”;

SQL>alter system set log_archive_dest_state_1 = enabl;

SQL>alter system set log_archive_dest_2 = “service=stby1 mandatory reopen=30”;

SQL>alter system set log_archive_dest_2 = enable;

SQL>alter system set log_archive_min_succeed_dest = 1;

九 配置备用库的初始化参数文件:将主库的初始化参数文件复制到备库,删除原有的日志归档目录项,并添加以下内容:

log_archive_dest = e:\log

log_archive_trace = 6 #定义日志跟踪层次

standby_archive_dest = e:\log

# 更改控制文件名

control_files = (“d:\oracle\oradata\orcl\stby_ctl.ctl”)

十 启动备用库

将从主库复制过来的数据文件、控制文件复制到相应的位置,然后在备库上操作(此时备库处于关闭状态):

SQL>connect internal/oracle as sysdba

SQL>startup nomount

SQL>alter database mount standby database

十一 如果有日志序列的缺失,则先将主库的日志复制到备库日志目录,进行手工恢复

SQL>recover automatic standby database;

或者:

SQL>recover standby database until cancel;

查看日志序列是否有缺失的SQL语句:

SQL>SELECT high.thread#, "LowGap#", "HighGap#"

FROM

(

SELECT thread#, MIN(sequence#)-1 "HighGap#"

( SELECT a.thread#, a.sequence#

v$archived_log a,

( SELECT thread#, MAX(next_change#) gap1

FROM v$log_history

GROUP BY thread#

) b

WHERE a.thread# = b.thread#

AND a.next_change# > b.gap1

)

) high,

SELECT thread#, MIN(sequence#) "LowGap#"

( SELECT thread#, sequence#

FROM v$log_history, v$datafile

WHERE checkpoint_change# <= next_change#

AND checkpoint_change# >= first_change#

) low

WHERE low.thread# = high.thread# ;

如果备库有日志序列缺失,则同一个thread#的LowGap# 与 HighGap# 不等。如果没有日志序列缺失,那么选出空值或者是LowGap# 与 HighGap# 相同。

十二 将备库置于自管理模式

SQL>recover managed standby database;

此时,SQLPLUS窗口停止响应,直到取消备库自管理模式。要取消备库的自管理模式的命令:

SQL>recover managed standby database cancel;

Standby database 维护

Standby

database 的生命周期,从建立一个standby database开始,一直到激活为止。即:创建——>>

使用(手工管理、自管理、只读模式选择循环)——>>激活。在使用过程中,主库可能发生很多影响到standby

database正常使用的事件,也就是说,主库的一些变化,不能通过日志同步到standby

database上来,因而需要手工干预。对于不同的主库事件,standby database需要进行不同的处理。

1

归档错误:发生归档错误的原因很多,因为各种原因导至主库产生的归档日志不能传递到待用库,都会发生归档错误。发生归档错误可以通过

error.v$archive_destination或archived.v$log查询,也可以查看alert.log日志文件或者是归档跟踪文件

查出。一旦出现归档错误,就需要手工传递归档日志到待用库。

2

添加主库表空间或数据文件:主库添加了表空间或者数据文件后,待用库的控制文件中表空间或数据文件信息可以通过使用主库传递而来的日志,从而与主库同步,

但是待用库不能在磁盘上创建文件,因此,如果待用库使用主库日志修改了待用库控制文件信息,同时又在待用库的相应位置找到了这个物理文件的话,那么恢复就

继续自动进行。如果找不到,那么恢复终止。这时,需要手工维护待用库:

在待用库处于自管理状态下的维护过程:

1) 添加主库的表空间tbs_2,文件为f_tbs2.dbf,大小为2M:

SQL> create tablespace tbs_2 datafile ‘d:\oracle\oradata\orcl\f_tbs2.dbf’ size 2M;

2) 切换主库日志,让待用库开始进行重做:

SQL>alter system switch logfile;

时,如果待用库自动恢复到包含有create

tablespace语句的日志时,就会因为在待用库的对应位置上找不到文件而中止恢复。我们可以等待待用库从自管理状态下退出,也可以在待用库上键入命

令 recover managed standby database cancel手工停止恢复。

待用库停止恢复后,控制文件中已包含了表空间tbs_2的信息,在待用库的alert.log文件中也能找到相应的警告信息,有该文件的全路径名。

3) 在待用库中创建数据文件:

SQL>alter database create datafile ‘d:\oracle\oradata\orcl\f_tbs2.dbf’ as ‘d:\oracle\oradata\orcl\f_tbs2.dbf’;

4) 将待用库重新置于自管理状态:

SQL> recover managed standby database;

这样,继续主库的过程,解决了待用库不能自动创建数据文件的问题。

3 重命名主库的数据文件:主库的数据文件重命名不能待用库,除非对待用库的控制文件也进行了更新。因此,在重命名了主库的数据文件后,同样的命令也需要在待用库是重做一遍。

4

添加或删除主库的重做日志组或成员:这个操作仅对主库的在线日志产生影响,而不影响到主库的归档日志,也不导致主库的数据变化。而待用库正常使用的过程

中,不需要在线日志,仅仅是在激活待用库时,才创建在线日志级及其成员。因此,主库添加或删除重做日志或成员,不影响待用库。仅仅当待用库激活后,才需要

重新添加或删除重做日志组或成员。也就是说,如果想让待用库与主库的变化相一致,这个操作应在待用库激活之后再重复一遍。

5

主库的数据文件自动扩展:如果主库的一个表空间数据文件设置为autoextend

on,那么当这个数据文件空间不够时,将会自动扩展。待用库可以在控制文件中记录这个变化,但是不能改变数据文件,因此不能完成数据文件的自动扩展。

Oracle文档在提到这个问题时,提供的解决办法就是确保数据文件有足够的空间。那么,一旦出现了空间不够而自动扩展呢?我猜测,恐怕只能重建待用库

了。

6 清空未归档日志内容:如果在主库上使用了clear unarchived logfiles 命令,则只能重建待用库。

7 open resetlogs: 只能重建待用库。

8 nologging :只能重建待用库。

其他的凡是导致主库记录在日志中的SCN号不连续的事件,都必须重建待用库,因为待用库在应用主库传递过来的归档日志时,会因为SCN号的不连续而中止。

9 主库的初始化参数改变:当改变了重做所需要的参数时,只能导致重做失败。此时,需要动态修改待用库的参数,或者是修改待用库的init.ora文件后重新启动待用库。

如果主库的一个表,设置nologging,那么备库肯定没有该表操作的数据,至一点也要注意哦

standby database三种模式的相互关系

环境: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*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 mount;

SQL>alter database open;

……这时就可以正常的使用数据库了。

这是oracle文档描述的standby database 三种模式的相互关系,按文档的说法,三种模式可以“直接”相互切换。

继续阅读