实现最大保护模式,可以先实现最大性能模式,然后再转换为最大保护模式。


一、三种保护模式

最大性能(maximize performance):这是data guard默认的保护模式。primay上的事务commit前不需要从standby上收到反馈信息,该模式在primary故障时可能丢失数据,但standby对primary的性能影响最小。

最大可用(maximize availability):在正常情况下,最大可用模式和最大保护模式一样;在standby不可用时,最大可用模式会自动降低成最大性能模式,所以standby故障不会导致primay不可用。只要至少有一个standby可用的情况下,即使primary down机,也能保证不丢失数据。

最大保护(maximize protection):最高级别的保护模式。primay上的事务在commit前必须确认redo已经传递到至少一个standby上,如果所有standby不可用,则primary会挂起。该模式能保证零数据丢失。



二、查看当前保护模式

SQL> select DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;

DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL

---------------- -------------------- --------------------

PRIMARY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE


三、两种日志传输方式

Arch:传统的日志传送方式。现在只有在最大性能模式时才能采用。归档日志通过primary上的arch进程传送给standby的RFS进程。

LGWr:oracle9i开始可以使用LGWR即时将日志传送到standby,而不再需要等到归档操作时才传送,已减少可能的数据丢失。在三种保护模式下都可以使用该方式传送日志。使用LGWR方式传送,在standby库上必须先建立standby redo logfile


四、查看日志传送方式

SQL> select dest_name,archiver from v$archive_dest;

DEST_NAME ARCHIVER

-------------------- ----------

LOG_ARCHIVE_DEST_1 ARCH

LOG_ARCHIVE_DEST_2 LGWR

LOG_ARCHIVE_DEST_3 ARCH

LOG_ARCHIVE_DEST_4 ARCH

LOG_ARCHIVE_DEST_5 ARCH

LOG_ARCHIVE_DEST_6 ARCH

LOG_ARCHIVE_DEST_7 ARCH

LOG_ARCHIVE_DEST_8 ARCH

LOG_ARCHIVE_DEST_9 ARCH

LOG_ARCHIVE_DEST_10 ARCH

10 rows selected.



五、添加standby redo logfile

首先停止standby的自动恢复状态

SQL> alter database recover managed standby database finish;

Database altered.

如果没有停止自动恢复状态就添加standby logfile,会报错:

ORA-01156: recovery in progress may need access to files

SQL> alter database add standby logfile group 4 ('d:/oracle/oradata/test/standby

04.redo') size 10m;

Database altered.

SQL> alter database add standby logfile group 5 ('d:/oracle/oradata/test/standby

05.redo') size 10m;

Database altered.

SQL> alter database add standby logfile group 6 ('d:/oracle/oradata/test/standby

06.redo') size 10m;

Database altered.

注意standby logfile的group名不能和primary的redo logfile group重复,因为我的primay已经有3组日志了,这里添加的三组standby logfile从group 4开始。同时standby redo logfile的大小和primary的redo logfile保持一致。


六、设置standby的归档路径

log_archive_dest_1='location=/free/oracle/orabak '

standby_archive_dest='/free/oracle/orabak '


七、在primary上修改为用LGWR传送日志

SQL> alter system set log_archive_dest_2='service=standby lgwr async affirm';

System altered.

在primary上swith logfile

SQL> alter system switch logfile;

System altered.

在primary的alter中可以看到成功的记录

Thu Nov 23 12:41:28 2006

ALTER SYSTEM SET log_archive_dest_2='service=standby lgwr async' SCOPE=BOTH;

Thu Nov 23 12:43:12 2006

LGWR: Setting 'active' archival for destination LOG_ARCHIVE_DEST_2

***********************************************************

Creating archive destination LOG_ARCHIVE_DEST_2: 'standby'

LNS0 started with pid=13

Thu Nov 23 12:43:16 2006

LGWR: Beginning to archive log 3 thread 1 sequence 102

Thread 1 advanced to log sequence 102

Current log# 3 seq# 102 mem# 0: D:ORACLEORADATANINGREDO03.LOG

Thu Nov 23 12:43:16 2006

ARC0: Evaluating archive log 2 thread 1 sequence 101

ARC0: LGWR is actively archiving destination LOG_ARCHIVE_DEST_2

ARC0: Beginning to archive log 2 thread 1 sequence 101

Creating archive destination LOG_ARCHIVE_DEST_2: 'standby'

Creating archive destination LOG_ARCHIVE_DEST_1: 'D:ORACLEARCHNINGARC00101.001'

ARC0: Completed archiving log 2 thread 1 sequence 101


八、切换standby的保护模式

切换保护模式的操作必须在primay执行,且primay必须处于mount状态

如果在open状态执行,则报错:

ORA-01126: database must be mounted EXCLUSIVE and not open for this operation

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.

Total System Global Area 134814580 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes

Redo Buffers 143360 bytes

Database mounted.

SQL> alter database set standby database to maximize protection;

Database altered.

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

注意,这时需要先修改日志传送方式为lgwr同步方式,否则,数据库是无法open,可以在初始化参数文件中定义。

SQL> conn / as sysdba

Connected to an idle instance.

SQL> startup mount;

ORACLE instance started.

Total System Global Area 134814580 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes

Redo Buffers 143360 bytes

Database mounted.

SQL> alter system set log_archive_dest_2='service=standby lgwr sync affirm';

System altered.

SQL> alter database open;

Database altered.

再来看看当前保护模式

SQL> select DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL from v$database;

DATABASE_ROLE PROTECTION_MODE PROTECTION_LEVEL

---------------- -------------------- --------------------

PHYSICAL standby maximize protection maximize protection

切换成maximize availability也需要类似的步骤,不再演示。

注:在10gR2的data guard中,按照上述步骤切换保护模式的时候却不成功。主库完成切换语句后再open就报错:ORA-03113: end-of-file on communication channel。看alert文件,报错ORA-16072: a minimum of one standby database destination is required。但实际上备库的standby logfile都已经建好了,解决方法如下:

解决方法:

将主备库的flashback打开:

启动到mount

SQL> select FLASHBACK_ON from v$database;

FLASHBACK_ON

------------------------------------

NO

SQL> alter database flashback on;

数据库已更改。

然后再切换到最大可用或者最大保护模式就ok了,切换前注意备库已经处于mount状态,并且主库原有的归档日志都已经全部复制到备库对应的归档目录下了,否则传送方式由arch改成lgwr后这些差异日志就无法自动传过去了。


九、  有次在做10gR2试验,将主库切换到maximize availability正常open,但是如果切换到Maximum protection就直接报错ORA-03113: end-of-file on communication channel,检查归档日志主备库都已经同步了,FLASHBACK_ON也已经是yes,但是就是不能open主数据库。

后来查看资料发现 Maximum protection模式必须满足以下条件:

Redo Archival Process: LGWR

Network Tranmission mode: SYNC

Disk Write Option: AFFIRM

Standby Redo Logs: Yes

standby database type: Physical Only

但是我的主库参数设置为:

*.LOG_ARCHIVE_DEST_2= 'SERVICE=STANDBY VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=STANDBY LGWR SYNC REOPEN=10'

缺少了AFFIRM参数:增加后,如下

*.LOG_ARCHIVE_DEST_2= 'SERVICE=STANDBY VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=STANDBY LGWR SYNC AFFIRM REOPEN=10'

这样,切换到Maximum protection就ok了。

在最大保护模式下,直接关闭备库是不行的,如果在备库上关闭数据库,会有如下提示:

SQL> shutdown immediate

ORA-01154: database busy. Open, close, mount, and dismount not allowed now

SQL>

看来在最大保护模式下,备库是不允许关闭的,此时首先关闭主库,然后备库就可以顺利关闭了。


十、打开standby数据库以read only方式

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

SQL> SHUTDOWN;

SQL> STARTUP MOUNT;

SQL> ALTER DATABASE OPEN READ ONLY;

对比主库与standby数据库中的表记录,应该是一样的。

把standby数据库重新变成recovery状态:

SQL> SHUTDOWN IMMEDIATE

SQL> STARTUP NOMOUNT

SQL> ALTER DATABASE MOUNT STANDBY DATABASE;

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;


oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html