天天看点

oracle database guard

Maximum protection:零数据丢失。发生事务时需要同时向主数据库和备用数据写重做日志。 

为了保证数据不丢失,如果有一个事务发现不能向备用数据写重做日志,那么主数据库会自 

动关闭。 

Maximum availability:在保证主数据库可用的情况下最大程度上保证数据的不丢失。同 

Maximum protection 一样也是同时向主和备用数据库写重做日志。与 Maximum protection 不 

同的时当发现不能向备用数据库写重做日志时不会关闭数据库,而是采用 Maximum 

performance 的模式管理直到修复故障。 

当发生第二次错误时至少要能够将重做日志写入到一个备用数据库中才能保证零数据丢失。 

(多备用库的情况下。如果是一个备用库发生一次错误就会丢失数据)

Maximum performance:Oracle 默认采用这种方式。在不影响主库的性能的情况下最大程度 

上保证数据不丢失。由于前两种方式要同时向主和备库写重做日志这就会给系统的性能带来 

负面影响。当事务提交时会立即将数据写入到本地的联机日志中。主库的重做数据流 

至少要写入到一个从库中,但是这个并不是与主库同时发生的。 

如果采用了足够的带宽的话,这种模式提供的数据保护保证最大的可用性,同时对主库的性 

能影响最小。

检查数据库是否支持 Data Guard,企业版才支持 Data Guard

SQL> select * from v$option where parameter = 'Managed Standby';

PARAMETER                        VALUE

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

Managed Standby                TRUE

SQL> 

创建物理备用数据库的步骤: 

一、强制主库产生日志,由于备库是采用归档日志恢复的,如果没有归档日志恢复无从谈 

起。

SQL> ALTER DATABASE FORCE LOGGING; 

二、创建备库的密码文件

D:>orapwd           file=D:\oracle\product\10.2.0\db_1\database\PWDauxdb.ora   password=oracle

entries=5; 

创建实例

D:> oradim -NEW -SID auxdb -INTPWD D:\oracle\product\10.2.0\db_1\database\PWDauxdb.ora

-STARTMODE manual 

三、修改主库的参数文件,并同步到 spfile

orcl.__db_cache_size=88080384

orcl.__java_pool_size=4194304

orcl.__large_pool_size=4194304

orcl.__shared_pool_size=67108864 

orcl.__streams_pool_size=0

*.audit_file_dest='D:\oracle\product\10.2.0\admin\orcl\adump'

*.background_dump_dest='D:\oracle\product\10.2.0\admin\orcl\bdump'

*.compatible='10.2.0.1.0'

*.control_files='D:\oracle\product\10.2.0\oradata\orcl\CONTROL01.CTL','D:\oracle\product\10.2.

0\oradata\orcl\CONTROL02.CTL','D:\oracle\product\10.2.0\oradata\orcl\CONTROL03.CTL'

*.core_dump_dest='D:\oracle\product\10.2.0\admin\orcl\cdump'

*.db_block_size=8192

*.db_domain='

*.db_file_multiblock_read_count=16

*.db_name='orcl'

*.db_recovery_file_dest_size=2147483648

*.db_recovery_file_dest='d:\oracle\product\10.2.0\flash_recovery_area'

*.db_unique_name='orcl'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

*.job_queue_processes=10

*.log_archive_config='dg_config=(orcl,auxdb)'

*.log_archive_dest_1='location=D:\oracle\product\10.2.0\oradata\orcl\archive

VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl'

*.log_archive_dest_2='service=AUX                VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)

DB_UNIQUE_NAME=auxdb'

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE

*.log_archive_max_processes=1

*.open_cursors=300

*.pga_aggregate_target=16777216

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.sga_target=167772160

*.undo_management='AUTO'

*.undo_tablespace='UNDOTBS1'

*.user_dump_dest='D:\oracle\product\10.2.0\admin\orcl\udump'

*.fal_service='aux'

*.fal_client='orcl'

*.standby_archive_dest='D:\oracle\product\10.2.0\oradata\orcl\standbyarchive'

*.standby_file_management=auto 

四、创建备库的数据文件 

查看主库数据文件列表

SQL> select file#,name from v$datafile;

FILE# NAME

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

      1 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF

      2 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF 

      3 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF

      4 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF

      5 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF

      6 D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST01.DBF

已选择 6 行。 

1)、将主库的数据文件 copy 到从库的路径下

SQL>ALTER DATABASE CREATE STANDBY CONTROLFILE AS 'd:\bak\standby.ctl'; 

然后关闭数据库将 file 1、2、3、4、5、6 copy 到 d:\bak 下。 

或采用如下方法: 

2)、采用 rman 将数据文件 copy 到备库中

C:\Documents and Settings\Administrator.XY>rman target/

恢复管理器: Release 10.2.0.1.0 - Production on 星期四 3 月 15 14:42:25 2009

Copyright (c) 1982, 2005, Oracle.      All rights reserved.

已连接到目标数据库: ORCL(DBID=1140649303, 未打开)

RMAN> copy datafile 1 to 'd:\bak\system01.dbf',datafile 2 to 'd:\bak\undotbs01.d

bf',datafile 3 to 'd:\bak\sysaux01.dbf',datafile 4 to 'd:\bak\users01.dbf',dataf

ile 5 to 'd:\bak\example01.dbf',datafile 6 to 'd:\bak\test01.dbf', current contr

olfile for standby to 'd:\bak\standby.ctl';

2> 

启动 backup 于 15-3 月 -07 

使用目标数据库控制文件替代恢复目录 

分配的通道: ORA_DISK_1 

通道 ORA_DISK_1: sid=155 devtype=DISK 

通道 ORA_DISK_1: 启动数据文件副本 

。。。 

通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:01 

复制备用控制文件 

输出文件名 = D:\BAK\STANDBY.CTL 标记 = TAG20070315T144240 recid = 40 时间戳 =

61

7294620 

完成 backup 于 15-3 月 -09

RMAN> 

打开数据库

SQL> ALTER DATABASE OPEN; 

五、在备库中创建备库的重做日志 

1)、maximum protection 和 maximum availability 模式必须要求有备库的重做日志。数据传 

输模式建议采用 LGWR SYNC。 

Data Guard 可以更多地采用备库的重做日志恢复,而不仅仅是采用归档日志恢复。 

2)、确保从库的重做日志大小与主库的重做日志大小完全一致。 

3)、创建合适的重做日志组数量。 

      从库的重做日志组至少要比主库多一组。 

      通常情况下一个实例对应一个 thread。 

      推荐采用如下公式来计算重做日志组的个数。

 (maximum number of logfiles for each thread + 1) * maximum number of threads 

 采用这中方式可以减少由于备库重做日志不能被分配从而导致主库的日志读写进程 

(LGWR)的阻塞。 

 例如:主库每个 thread 有两个日志组,那么备库应该有 6 个重做日志组。 

 添加从库的日志组。

SQL>alter database add standby logfile thread 1 'D:\oracle\product\10.2.0\oradata\orcl\redo04.log'

size 50m;

SQL>alter database add standby logfile thread 1 'D:\oracle\product\10.2.0\oradata\orcl\redo05.log'

SQL>alter database add standby logfile thread 1 'D:\oracle\product\10.2.0\oradata\orcl\redo06.log'

SQL>alter database add standby logfile thread 1 'D:\oracle\product\10.2.0\oradata\orcl\redo07.log'

size 50m; 

4)、检查备用重做日志是否创建成功 

      在主库上执行

      SQL>alter system switch logfile; 

      然后从库查询

      SQL> SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM

V$STANDBY_LOG;

      GROUP#             THREAD#           SEQUENCE# ARC STATUS

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

             4                 1                 0 NO   ACTIVE

             5                 1                 0 YES UNASSIGNED

             6                 1                 0 YES UNASSIGNED

             7                 1                 0 YES UNASSIGNED

六、配置 listener.ora 和 tnsnames.ora。

listener.ora

SID_LIST_LISTENER =

   (SID_LIST =

      (SID_DESC =

         (SID_NAME = PLSExtProc)

         (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)

         (PROGRAM = extproc)

      )

          (GLOBAL_DBNAME = auxdb) 

       (ORACLE_HOME = D:\oracle\product\10.2.0\db_1)

       (SID_NAME = auxdb)

    (SID_DESC =

       (GLOBAL_DBNAME = orcl)

       (SID_NAME = orcl)

  )

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.199)(PORT = 1521))

    )

tnsnames.ora

ORCL =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.199)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl)

EXTPROC_CONNECTION_DATA =

    (ADDRESS_LIST =

      (SID = PLSExtProc)

      (PRESENTATION = RO)

aux =

      (SERVER = DEDICATED) 

       (SID = auxdb)

     )

七、修改从库的 pfile,并将其同步到 spfile 

从库:auxdb

initauxdb.ora

*.db_name=orcl

*.db_unique_name=auxdb

*.DB_FILE_NAME_CONVERT=('d:\oracle\product\10.2.0\oradata\orcl','d:\bak')

*.LOG_FILE_NAME_CONVERT=('d:\oracle\product\10.2.0\oradata\orcl','d:\bak')

*.control_files='D:\bak\standby.CTL'

*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

*.sga_target=250000000

*.background_dump_dest=d:\bak\bdump

*.core_dump_dest=d:\bak\cdump

*.user_dump_dest=d:\bak\udump

*.standby_archive_dest='d:\bak\standbyarchive'

 *.fal_server='orcl'

 *.fal_client='aux'

 *.standby_file_management='AUTO'

*.log_archive_dest_1='location=D:\bak\archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES)

*.LOG_ARCHIVE_DEST_2='SERVICE=orcl LGWR ASYNC

VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl'

SQL> create spfile from pfile; 

文件已创建。

SQL> startup mount; 

ORACLE 例程已经启动。

Total System Global Area     251658240 bytes

Fixed Size                       1248380 bytes

Variable Size                  83886980 bytes

Database Buffers              163577856 bytes

Redo Buffers                     2945024 bytes 

数据库装载完毕。

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT

FROM SESSION; 

数据库已更改。 

验证是否成功: 

主库:

SQL> ALTER SYSTEM SWITCH LOGFILE; 

系统已更改。

从库:

SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG

ORDER BY SEQUENCE#;

 SEQUENCE# FIRST_TIME                        NEXT_TIME

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

             1 15-3 月 -07             15-3 月 -09

                        ... 

            25 15-3 月 -07             15-3 月 -09

已选择 17 行。 

系统已更改。 

SQL> SELECT SEQUENCE#, FIRST_TIME,                               NEXT_TIME,APPLIED          FROM

V$ARCHIVED_LOG ORDER BY SEQUENCE#

 SEQUENCE# FIRST_TIME                        NEXT_TIME       APP

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

             1 15-3 月 -07             15-3 月 -09    NO 

                              。。。 

            24 15-3 月 -07             15-3 月 -09    YES 

            25 15-3 月 -07             15-3 月 -09     YES 

            26 15-3 月 -07             15-3 月 -09    YES

已选择 18 行。

至此创建成功

八、下面进行主备数据库的切换测试。

1、查看主库上有没有设置 standby_archive_dest/standby_file_management 如果没有的话就需 

要设置

SQL> alter system set

standby_archive_dest='D:\oracle\product\10.2.0\oradata\orcl\standbyarchive' scope=both;

SQL> alter system set standby_file_management='auto' scope=both; 

SQL> show parameter standby

NAME                                                 TYPE        VALUE 

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

standby_archive_dest string                                          D:\oracle\product\10.2.0\orada

                                                                          ta\orcl\standbyarchive

standby_file_management                               string           AUTO 

2、查看切换状态,正常应该是 TO STANDBY

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS

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

SESSIONS ACTIVE

此时需要进行一些处理 

查看都有那些 session 处于 active

SQL> SELECT SID, PROCESS, PROGRAM FROM V$SESSION WHERE TYPE = 'USER'

AND SID <>

(SELECT DISTINCT SID FROM V$MYSTAT);

 SID PROCESS               PROGRAM

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

 148 2660:2244          plsqldev.exe

 154 2660:2244          plsqldev.exe

 158 2660:2244          plsqldev.exe

1)、由于是 plsql 连接的,我们可以将其关闭

未选定行

TO STANDBY

此时就可以进行切换了。

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; 

2)、其它方法 

更改 job_queue_processes 为 0

SQL> show parameter job_queue_processes 

NAME                                                       TYPE                 VALUE

job_queue_processes integer 10

SQL> alter system set job_queue_processes=0;

通常会影响切换的进程有

进程名             描述                                解决方法

CJQ0               job 队列进程                        将 JOB_QUEUE_PROCESSES 动态改为 0, 

                                                     但是不要改 spfile

QMN0               高级队列时间管理器                  将 AQ_TM_PROCESSES 动态改为 0,但是 

                                                     不要改 spfile

DBSNMP             oem 的代理                          执行 emctl stop agent 停止代理

此时必须执行以下语句切换。

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH

SESSION SHUTDOWN; 

3、将主数据切换为备用数据库

SESSION SHUTDOWN;

4、关闭数据库并以 mount 模式启动数据库

SQL> shutdown immediate 

ORA-01507: 未装载数据库 

ORACLE 例程已经关闭。

Total System Global Area           167772160 bytes

Fixed Size                              1247900 bytes

Variable Size                         75498852 bytes

Database Buffers                      88080384 bytes

Redo Buffers                            2945024 bytes 

数据库装载完毕。 

5、查看数据库切换后的状态

SQL> select t.PROTECTION_MODE,t.DATABASE_ROLE from v$database t;

PROTECTION_MODE                        DATABASE_ROLE

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

MAXIMUM PERFORMANCE PHYSICAL STANDBY

6、将备用数据切换到主数据库

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 

数据库已更改。

SQL> ALTER DATABASE OPEN;

SQL>       select t.PROTECTION_MODE,t.DATABASE_ROLE from v$database t;

MAXIMUM PERFORMANCE PRIMARY

至此主备数据库的切换已经成功。

九、从 MAXIMUM PERFORMANCE 到 MAXIMUM PROTECTION 的切换。

SQL>select protection_mode from v$database;

PROTECTION_MODE

MAXIMUM PERFORMANCE

SQL>shutdown immediate;

SQL>startup mount

SQL> alter system set log_archive_dest_2='SERVICE=aux LGWR SYNC                       AFFIRM

VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=auxdb'

scope=both;

SQL>alter database set standby database to maximize protection;

SQL>alter database open; 

SQL> select protection_mode from v$database;

MAXIMUM PROTECTION 

模式切换的完全的语法如下:

ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {PROTECTION |

AVAILABILITY | PERFORMANCE}

在切换测试中经常遇到问题:

ARC0 started with pid=15, OS id=2596

LGWR: Primary database is in MAXIMUM PROTECTION mode

LGWR: Destination LOG_ARCHIVE_DEST_2 is using asynchronous network I/O

LGWR: Destination LOG_ARCHIVE_DEST_1 is not standby database serviced by LGWR

LGWR: Minimum of 1 synchronous standby database required

Thu Mar 22 15:01:48 2007

Errors in file d:\oracle\product\10.2.0\admin\orcl\bdump\orcl_lgwr_2392.trc:

ORA-16072: a minimum of one standby database destination is required

ORA-16086: standby database does not contain available standby log files

出现该错误原因是: 

1、primary database 的模式是 MAXIMUM PROTECTION 

将其改为 maximum performance 即可 

2、standby 缺少 standby redo 

3、LOG_ARCHIVE_DEST_2 参数设置不正确

*.log_archive_dest_2='service=aux OPTIONAL LGWR                              SYNC   AFFIRM

VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=auxdb' 

尤其要注意是 SYNC 还是 ASYNC,这两个完全不同,一个是同步一个是不同步。

MAXIMUM PROTECTION 模式下 primary、standby 库的相互切换

1、查看 orcl 库的相关信息 

orcl 库:

SQL> startup 

Total System Global Area      167772160 bytes

Fixed Size                         1247900 bytes

Variable Size                    75498852 bytes

Database Buffers                 88080384 bytes

Redo Buffers                       2945024 bytes 

数据库已经打开。

SQL> select protection_mode from v$database; 

MAXIMUM PROTECTION

SQL> alter database commit to switchover to physical standby;

alter database commit to switchover to physical standby

第 1 行出现错误: 

ORA-01093: ALTER DATABASE CLOSE 仅允许在没有连接会话时使用 

错误原因:此时 orcl 库有连接的会话,将其关闭即可。

SELECT SWITCHOVER_STATUS FROM V$DATABASE

                                          * 

ORA-01507: 未装载数据库

Fixed Size                             1247900 bytes

Variable Size                         79693156 bytes

Database Buffers                      83886080 bytes

查看 orcl 库的状态,已经成功的切换到备库。

PROTECTION_MODE                       DATABASE_ROLE

MAXIMUM PROTECTION                     PHYSICAL STANDBY

2、查看 auxdb 库的相关信息 

auxdb 库: 

准备将其切换到主库状态。

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY

ORA-16139: 需要介质恢复

SQL> alter database recover managed standby database;

SQL>       ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

成功切换到主库状态。

MAXIMUM PROTECTION                     PRIMARY 

打开数据库出错

SQL> alter database open;

alter database open

ORA-03113: 通信通道的文件结束 

修改参数 log_archive_dest_2

*.log_archive_dest_2='SERVICE=orcl                OPTIONAL   LGWR   SYNC   AFFIRM

SQL> conn /as sysdba 

已连接到空闲例程。

Total System Global Area           251658240 bytes

Fixed Size                             1248380 bytes

Variable Size                         83886980 bytes 

仍然出错,错误如下:

alert_auxdb.log

Errors in file d:\bak\bdump\auxdb_lgwr_2040.trc:

Thu Mar 22 16:37:37 2007

LGWR: Error 16086 verifying archivelog destination LOG_ARCHIVE_DEST_2

Destination LOG_ARCHIVE_DEST_2 is UNSYNCHRONIZED

LGWR: Error 16086 disconnecting from destination LOG_ARCHIVE_DEST_2 standby host

'orcl'

LGWR: Continuing...

LGWR: Minimum of 1 applicable standby database required

Thu Mar 22 16:37:41 2007

由于以上的经验可以确定是从库没有 standby redo

3、在 orcl 库中创建 standby redo 

SQL> alter database add standby logfile 'd:\oracle\product\10.2.0\oradata\orcl\r

edo04.log' size 50m; 

edo05.log' size 50m; 

edo06.log' size 50m; 

edo07.log' size 50m; 

SQL>

4、打开 auxdb 库 

auxdb 库:

Variable Size                         83886980 bytes

Database Buffers                    163577856 bytes

SQL> select instance_name from v$instance;

INSTANCE_NAME

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

auxdb

MAXIMUM PROTECTION                     PRIMARY

至此切换已经成功。

十、参数说明: 

COMPATIBLE='10.2.0.1.0':数据库版本号,主库与从库要统一,否则有可能 redo 的数据不能 

从主库传送到从库。 

DB_FILE_NAME_CONVERT=主库数据文件地址,从库数据文件地址:用于主从库在同一台 

机器上或主从库数据文件的路径不一致的情况下 

DB_UNIQUE_NAME=: 数 据 库 的 唯 一 名 称 。 推 荐 使 用 , 如 果 使 用 了 

LOG_ARCHIVE_CONFIG,那么就必须有改参数。 

FAL_CLIENT=,指向从库的服务名,本例为 aux 

FAL_SERVER 指向主库的服务名,本例为 orcl 

LOG_ARCHIVE_CONFIG='DG_CONFIG=(主库的 db_unique_name,从库的 db_unique_name)' 

LOG_ARCHIVE_DEST_n:日志归档的地址,最少需要两个,一个指向主库,另一个指向从 

库 

LOG_ARCHIVE_DEST_STATE_n ={ENABLE|DEFER|ALTERNATE|RESET} 指定:enable or 

disable 来决定是否传输 redo 的数据到从库中。 

LOG_FILE_NAME_CONVERT:同 DB_FILE_NAME_CONVERT 

STANDBY_ARCHIVE_DEST:指定路径存放接收从主库传输过来的归档日志。 

STANDBY_FILE_MANAGEMENT={AUTO|MANUAL} :AUTO 当主库添加或减少数据文件 

时会自动同步从库而不需要手动干预。

十一、经常遇到错误: 

错误 1: 

ORA-16057: DGID from server not in Data Guard configuration 

原因:主库没有设置参数 log_archive_config 

解决方法*.log_archive_config='dg_config=(orcl,auxdb)'

 alter system set log_archive_config='dg_config=(orcl,auxdb)' scope=both;

错误 2:

PING[ARC0]: Heartbeat failed to connect to standby 'aux'. Error is 1031.

ORA-01031: insufficient privileges 

解决问题思路:1、检查 sys 密码是否正确,大部分是这个原因。 

 2、Oracle 用户有写 standby_archive_dest 的权限 

错误 3:

ORA-16025: parameter LOG_ARCHIVE_DEST_2 contains repeated or conflicting attributes 

出 现 该 错 误 的 原 因 是 LOG_ARCHIVE_DEST_2='SERVICE=orcl LGWR ASYNC

VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl' 

db_unique_name 前少了一个空格导致的

十二、维护故障解决: 

故障 1 

由于网络等原因导致归档日志没有全部传输到从库中,这些需要我们手动干预。 

常见因素:从库关闭、网络故障、从库空间不足等。 

维护的通常步骤;关闭:先关主库后关从库,启动:先启动从库然后启动主库。 

关于日志传输的控制可以通过 MANDATORY、REOPEN、MAX_FAILURE 来控制 

MANDATORY REOPEN=5 MAX_FAILURE=3 每 5 秒重试一次,最大允许错误次数为 3 次, 

如果重试 3 次仍然不能成功,那么主库的日志传输服务就会停止。

*.log_archive_dest_2='service=AUX VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)

MANDATORY REOPEN=5 MAX_FAILURE=3 DB_UNIQUE_NAME=auxdb'

1、查找不在 standby 的日志。

SQL> SELECT MAX(R.SEQUENCE#) LAST_SEQ_RECD, MAX(L.SEQUENCE#)

LAST_SEQ_SENT FROM

2> V$ARCHIVED_LOG R, V$LOG L WHERE

3> R.DEST_ID=2 AND L.ARCHIVED='YES';

LAST_SEQ_RECD LAST_SEQ_SENT

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

7 10 

2、查找 primary 的所在路径

SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1

AND

2> SEQUENCE# BETWEEN 7 AND 10;

NAME

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

/primary/thread1_dest/arcr_1_7.arc

/primary/thread1_dest/arcr_1_8.arc

/primary/thread1_dest/arcr_1_9.arc 

3 、 将 日 志               copy      到 standby 的 STANDBY_ARCHIVE_DEST 下 , 将 

STANDBY_ARCHIVE_DEST 的日志 copy 到 LOG_ARCHIVE_DEST 下 

4、

SQL> STARTUP MOUNT

SQL> ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE;

至此恢复成功。

故障 2: 

归档日志之间经常产生 gap,还没有理解与故障 1 的区别,如有谁知道请告知。Mail:

1、确认归档日志之间有无遗漏

SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE#                            FROM

V$ARCHIVE_GAP;

THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#

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

1 90 92 

2、将遗漏的归档日志 copy 到备库的 standby_archive_dest 下 

然后对其分别注册

ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1'; 

3、恢复归档日志

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; 

4、然后就可以按切换步骤进行切换了。

本文转自 jxwpx 51CTO博客,原文链接:http://blog.51cto.com/jxwpx/196961,如需转载请自行联系原作者