您的位置:首页 > 其它

dataguard 三种保护模式

2014-05-27 10:18 176 查看
1、最大保护

这种保护模式在主库出现问题时不会有数据的丢失,为了提供这种保护模式,一个事物必须同时写本地的online redo log,和至少一个备库的redo log同步,才能commit;

为了确保数据不会丢失,如果备库至少有一个日志不能写入,那么主库不会继续处理其他事物,而是关闭。

在主库上的事物会尽快写入到备库上的日志后,会立刻通知主库,继续处理其他的事物,最大可能的减小主库同步的吞吐和响应时间。为了在备库上通过完整的验证,最好用real time apply

这样备库在接受到日志后,会尽可能快的应用日志,dataguard会通知他所遇到的损坏,并快速处理

这种数据保护模式比最高可用的数据保护模式要优先一些,oracle推荐最少有两个备库保护主库在最大保护模式,来阻止单备库故障,导致主库关闭

2、最大可用

这种保护模式提供了最高模式,不会影响主库的可用性,但是事物在主库写本地的online redo log和至少一个备库的redo log同步才会commit;如果主库的日志不能同步到至少一个备库,为了最大可用,那么就会转换成最大性能,

直到主库可以同步日志到至少一个备库,那么会恢复到最大可用

这种模式,确定没有数据丢失,如果主库的出的故障,但是几秒的故障不会阻止主库完全的数据集发送的备库去

3、最大性能

这种模式提供了最高级别的数据保护,他不会影响主库的性能,他是通过事物提交后快速写日志,这些日志会通过异步传输到一个多个备库中去,所以主库的性能是不会受到影响

最大性能保护模式比最大可用在数据保护略显不足,可能会有数据丢失,但是不会影响主库的性能,这是默认的保护模式

三种保护模式的不同:

日志同步方式不同:

maximum AvailabilityMaximum Performance
Maximum Protection

磁盘写操作 AFFIRM NOAFFIRM
AFFIRM

SYNC ASYNC
SYNC

DB_UNIQUE_NAMEDB_UNIQUE_NAME
DB_UNIQUE_NAME

standby log 无 ,推荐最好有 standby log

commit条件不同:

最大保护:Primary Database上的每个事务的Redo日志必须在本地和Standby Database上都写入日志文件后才能提交(如果不能写入STANDBY DATABASE,PRIMARY DATABASE 自动挂起,防止丢数据)

最高可用:Primary Database每个事务的Redo日志要写到本地和Standby Database中才能提交(与最大保护不同的是:写入STANDBY DATABASE失败,PRIMARY DATABASE不会挂起,会自动转成最大性能模式,等待问题解决后自动转成最大可用模式)

最大性能:Primary Database上的事务的Redo日志只要写到本地日志文件就可以提交,不必等待到Standby Database的传递完成

数据一致性不同:

最大保护:完全一致

最高可用:尽可能的避免数据的丢失,但不能绝对保证数据完全一致

最大性能:可以异步同步日志,可能有数据的丢失

默认是最大性能是模式保护模式

日志的传输模式:

arch:这是默认的传输日志的模式,主库在日志切换后,完成归档,才能通过arch进程传输给standby的RFS进程,这种传输日志的模式只能在最大性能模式使用

lgwr:使用lgwr方式即时传输日志给standby,主库产生事物后,会通过lgwr进程去写本地的redo和本地的lns进程,通过本地的lns进程传输日志给standby的lns进程,然后通过RFS进程写standby redo,MPR进程应用日志。

这种方式不需要等到归档才传输日志,减少了数据的丢失,这种日志传输方式适合三种模式,但是备库必须有standby redo log

主库查看使用哪种方式进行日志传输:

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

LOG_ARCHIVE_DEST_11 ARCH

LOG_ARCHIVE_DEST_12 ARCH

LOG_ARCHIVE_DEST_13 ARCH

LOG_ARCHIVE_DEST_14 ARCH

LOG_ARCHIVE_DEST_15 ARCH

LOG_ARCHIVE_DEST_16 ARCH

LOG_ARCHIVE_DEST_17 ARCH

LOG_ARCHIVE_DEST_18 ARCH

LOG_ARCHIVE_DEST_19 ARCH

LOG_ARCHIVE_DEST_20 ARCH

LOG_ARCHIVE_DEST_21 ARCH

LOG_ARCHIVE_DEST_22 ARCH

LOG_ARCHIVE_DEST_23 ARCH

LOG_ARCHIVE_DEST_24 ARCH

LOG_ARCHIVE_DEST_25 ARCH

LOG_ARCHIVE_DEST_26 ARCH

LOG_ARCHIVE_DEST_27 ARCH

LOG_ARCHIVE_DEST_28 ARCH

LOG_ARCHIVE_DEST_29 ARCH

LOG_ARCHIVE_DEST_30 ARCH

LOG_ARCHIVE_DEST_31 ARCH

31 rows selected.

一般而言,standby redo 日志文件组数要比primary 数据库的online redo 日志文件组数至少多一个。推荐standby redo 日志组数量基于primary 数据库的线程数(这里的线程数可以理解为rac 结构中的rac节点数)。

有一个推荐的公式可以做参考:(每线程的日志组数+1)*最大线程数

备库添加standby log:

SQL> alter database drop standby logfile '/archive/1_0_815224926.arc';

Database altered.

SQL> select * from v$logfile;

GROUP# STATUS TYPE MEMBER IS_

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

3 ONLINE /u01/app/oracle/oradata/redo03.log NO

2 ONLINE /u01/app/oracle/oradata/redo02.log NO

1 ONLINE /u01/app/oracle/oradata/redo01.log NO

SQL> alter database add standby logfile '/u01/app/oracle/oradata/standby01.log' size 50M;

Database altered.

SQL> alter database add standby logfile '/u01/app/oracle/oradata/standby02.log' size 50M;

Database altered.

SQL> alter database add standby logfile '/u01/app/oracle/oradata/standby03.log' size 50M;

Database altered.

SQL> alter database add standby logfile '/u01/app/oracle/oradata/standby04.log' size 50M;

Database altered.

SQL> select * From v$logfile;

GROUP# STATUS TYPE MEMBER IS_

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

3 ONLINE /u01/app/oracle/oradata/redo03.log NO

2 ONLINE /u01/app/oracle/oradata/redo02.log NO

1 ONLINE /u01/app/oracle/oradata/redo01.log NO

4 STANDBY /u01/app/oracle/oradata/standby01.log NO

5 STANDBY /u01/app/oracle/oradata/standby02.log NO

6 STANDBY /u01/app/oracle/oradata/standby03.log NO

7 STANDBY /u01/app/oracle/oradata/standby04.log NO

7 rows selected.

为了防止出现什么切换过程中的问题,所以开启了闪回

SQL> alter database FLASHBACK ON;

Database altered.

SQL> select FLASHBACK_ON from v$database;

FLASHBACK_ON

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

YES

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

2337163

从低到高:

最大性能----》 最大可用-----》最最大保护

需要在mount状态一步的切换,但是反过来不需要在mount下切换,open状态就可以

1、查看参数文件

*.DB_NAME=rac

*.DB_UNIQUE_NAME=rac

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(rac,orcl)'

*.LOG_ARCHIVE_DEST_1='LOCATION=/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=rac'

*.LOG_ARCHIVE_DEST_2='SERVICE=orcl lgwr ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl'

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE

*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE

*.LOG_ARCHIVE_FORMAT=%t_%s_%r.arc

*.LOG_ARCHIVE_MAX_PROCESSES=30

*.FAL_SERVER=rac

*.fal_client=orcl

*.DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/','/u01/app/oracle/oradata/rac/'

*.LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/','/u01/app/oracle/oradata/rac/'

*.STANDBY_FILE_MANAGEMENT=AUTO

*.STANDBY_ARCHIVE_DEST='/archive'

2、修改参数文件

*.LOG_ARCHIVE_DEST_2='SERVICE=orcl lgwr ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl'

参数没有问题,是lgwr async affirm或者lgwr sync affirm都可以

通过动态修改: 在主库

alter system set LOG_ARCHIVE_DEST_2='SERVICE=orcl lgwr SYNC affirm VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl' scope=both

三种保护模式的切换:

SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(rac,orcl)';

在主库执行:只需要在主库执行,备库就会跟这改变

SQL> ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {AVAILABILITY | PERFORMANCE | PROTECTION};

SQL> select open_mode, protection_mode,protection_level ,SWITCHOVER_STATUS from v$database;

OPEN_MODE
PROTECTION_MODE PROTECTION_LEVEL SWITCHOVER_STATUS

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

READ WRITE
MAXIMUM AVAILABILITY RESYNCHRONIZATION TO STANDBY

正常情况下 PROTECTION_LEVEL 是 MAXIMUM AVAILABILITY

出了点问题 , RESYNCHRONIZATION ,需要重新同步

SQL> select thread#, sequence#, status from v$log;

THREAD# SEQUENCE# STATUS

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

1 412 INACTIVE

1 413 ACTIVE

1 414 CURRENT

在备库执行:

SQL> select thread#, max(sequence#) from v$archived_log where applied='YES' group by thread#;

THREAD# MAX(SEQUENCE#)

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

1 410

SQL> alter database recover managed standby database disconnect from session;

Database altered.

最后发现参数文件让我给修改错误了,DB_UNIQUE_NAME是备库的名称

alter system set LOG_ARCHIVE_DEST_2='SERVICE=orcl lgwr SYNC affirm VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl' scope=both

SQL> select open_mode, protection_mode,protection_level ,SWITCHOVER_STATUS from v$database;

OPEN_MODE PROTECTION_MODE PROTECTION_LEVEL SWITCHOVER_STATUS

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

READ WRITE MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY TO STANDBY

查看备库:

SQL> select open_mode, protection_mode,protection_level ,SWITCHOVER_STATUS from v$database;

OPEN_MODE PROTECTION_MODE PROTECTION_LEVEL SWITCHOVER_STATUS

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

MOUNTED MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY NOT ALLOWED

主库查看产生的最大归档号:

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)

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

422

备库查看产生的归档:

SQL> select sequence#,thread#,resetlogs_id from v$archived_log;

SEQUENCE# THREAD# RESETLOGS_ID

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

403 1815224926

404 1815224926

405 1815224926

406 1815224926

407 1815224926

408 1815224926

409 1815224926

410 1815224926

411 1815224926

412 1815224926

413 1815224926

414 1815224926

415 1815224926

416 1815224926

417 1815224926

418 1815224926

419 1815224926

420 1815224926

421 1815224926

422 1815224926

20 rows selected.

SQL>

从高到低:

最大性能-《--- 最大可用《-----最最大保护

直接在主库进行切换,不用修改参数文件

在主库执行:

SQL> alter database set standby database to maximize availability;

Database altered.

SQL> select open_mode, protection_mode,protection_level ,SWITCHOVER_STATUS from v$database;

OPEN_MODE PROTECTION_MODE PROTECTION_LEVEL SWITCHOVER_STATUS

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

READ WRITE MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY TO STANDBY

SQL> alter database set standby database to maximize performance;

Database altered.

SQL> select open_mode, protection_mode,protection_level ,SWITCHOVER_STATUS from v$database;

OPEN_MODE PROTECTION_MODE PROTECTION_LEVEL SWITCHOVER_STATUS

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

READ WRITE MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE TO STANDBY
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: