??DG全称Data Guard,官方给出的定义是“Oracle Data Guard ensures high availability, data protection, and disaster recovery for enterprise data.”DG保证了数据库的高可用,数据保护以及灾备。DG通过冗余数据来提供数据保护,通过日志同步机制保证冗余数据和主数据之前的同步,这种同步可以是实时,延时,同步,异步多种形式。DG常用于异地容灾和小企业高可用方案。DG中可以在Standby database上执行只读查询,从而分散Primary database的性能压力,但是这并不是用来解决性能问题的方案。
??在DG环境中,至少有两个数据库,一个处于开启状态面向应用提供服务称之为Primary Database。 第二个处于恢复状态,叫作Standby Database。 运行时primary Database 对外提供服务,用户在Primary Database 上进行操作,操作被记录在联机日志和归档日志中,这些日志通过网络传递给Standby Database。 这个日志会在Standby Database 上重演,从而实现Primary Database 和Standby Database 的数据同步。生产环境中往往一个主库多个备库。
备库的类型:
相关服务按功能区分:
这是默认Primary database的发送日志的方式。
1)Primary database被应用使用时会不断产生redo log,这些日志由LGWR进程写入到联机日志。
2)日志被写满后,发生日志切换从而触发检查点开始日志本地归档。
3)日志归档完成后,联机日志就可以被覆盖重用。
4)这个时候ARCH进程会把归档日志通过Net发送给standby database的RFS(Remote File Server)进程。
5)standby database端的RFS进程把接收的归档日志写入本地。
6)standby database端的MRP(Managed Recovery Process)进程(执行redo apply)或者LSP进程(执行sql apply)在standby database应用这些日志,进而实现数据的同步。
关于这两种应用日志的区别:
物理Standby接收完Primary数据库生成的REDO数据后,以介质恢复的方式实现同步,这种方式也叫Redo Apply。
逻辑Standby接收后将其转换成SQL语句,在Standby数据库上执行SQL语句实现同步,这种方式叫SQL Apply。
使用ARCH进程的缺点:
Primary Database 只有在发生归档时才会发送日志到Standby Database。 如果Primary Database 异常宕机,联机日志中的Redo 内容就会丢失,因此使用ARCH 进程无法避免数据丢失的问题,要想避免数据丢失,就必须使用LGWR。
为了避免数据丢失,使用LGWR进程,LGWR进程又分为了SYNC(同步)和ASYNC(异步)两种方式。
alter system set log_archive_dest_2 = ‘SERVICE=ST LGWR SYNC NET_TIMEOUT=30‘ scope=both;
alter system set log_archive_dest_2 = ‘SERVICE=ST LGWR ASYNC ‘ scope=both;
在日志接收中,需要注意的是归档日志会被放在什么位置:
1) 如果配置了STANDBY_ARCHIVE_DEST 参数,则使用该参数指定的目录。
2) 如果某个LOG_ARCHIVE_DEST_n 参数明确定义了VALID_FOR=(STANDBY_LOGFILE,*)选项,则使用这个参数指定的目录。
3) 如果数据库的COMPATIBLE参数大于等于10.0,则选取任意一个LOG_ARCHIVE_DEST_n的值。
4) 如果STANDBY_ARCHIVE_DEST 和 LOG_ARCHIVE_DEST_n 参数都没有配置,使用缺省的STANDBY_ARCHIVE_DEST参数值,这个缺省值是$ORACLE_HOME/dbs/arc.
Physical Standby 使用的是Media Recovery 技术,在数据块级别进行恢复,这种方式没有数据类型的限制,可以保证两个数据库完全一致。 Physical Standby数据库只能在Mount 状态下进行恢复,也可以是打开,但只能已只读方式打开,并且打开时不能执行恢复操作。
Logical Standby 使用的是Logminer 技术,通过把日志内容还原成SQL 语句,然后SQL引擎执行这些语句,Logminer Standby不支持所有数据类型,可以在视图DBA_LOGSTDBY_UNSUPPORTED 中查看不支持的数据类型,如果使用了这种数据类型,则不能保证数据库完全一致。 Logical Standby数据库可以在恢复的同时进行读写操作。
Standby数据库的相关进程读取接收到的REDO数据(可能来自于Standby端的归档文件,也可能来自于Standby Redologs),再将其写入Standby数据库。保存之后数据又是怎么生成的呢?两种方式:物理Standby通过REDO应用,逻辑Standby通过SQL应用。
根据Redo Apply发生的时间可以分成两种:
一种是实时应用(Real-Time Apply), 这种方式必须Standby Redo Log,每当日志被写入Standby Redo Log时,就会触发恢复,使用这种方式的好处在与可以减少数据库切换(Switchover 或者Failover)的时间,因为切换时间主要用在剩余日志的恢复上。
另一种是归档时应用,这种方式在Primary Database发生日志切换,触发Standby Database 归档操作,归档完成后触发恢复。 这也是默认的恢复方式。
如果是Physical Standby,可以使用下面命令启用Real-Time:
Alter database recover managed standby database using current logfile;
如果是Logical Standby,可以使用下面命令启用Real-Time:
Alter database start logical standby apply immediate;
查看是否使用Real-Time apply:
Select recovery_mode from v$archive_dest_status;
具体请参考:
http://blog.csdn.net/tianlesoftware/article/details/5514082
修改保护模式的方法:
1)关闭数据库,重启到Mount 状态,如果是RAC,需要关闭所有实例,然后只启动一个实例到mount状态。
2)修改模式:
语法:ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {PROTECTION | AVAILABILITY | PERFORMANCE};
如:SQL>ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
3)打开数据库: alter database open;
4)确认修改数据保护模式:
SQL>select protection_mode,protection_level from v$database;
原文:https://www.cnblogs.com/plutozzl/p/13356565.html