之前搭建了rac到单实例的dg环境,最近又在windows下搭建了dg,这一篇关于dg的一些理论知识回顾

官方文档

https://docs.oracle.com/cd/E11882_01/nav/portal_14.htm

data guard服务
1 redo传输服务 (redo transport services)
redo传输服务不仅控制传输redo数据到指定归档路径下,同时还管理解决由于网络中断造成的归档文件未接收的过程

--1 如何发送数据
在primary数据库中,dg使用归档进程ARCn或者日志写进程(LGWR)收集redo数据并传输到standby数据库,这2个
进程都由一个核心参数来控制,LOG_ARCHIVE_DEST_n
LOG_ARCHIVE_DEST_n(n值1~10)定义发送redo的目的地,通过location或service关键字指明归档文件的路径(同时
只能设置一个属性),其中指定location时表示归档路径为本地路径,指定service时,则指向一个net service name,
即接收redo数据的standby数据库。
对于每一个LOG_ARCHIVE_DEST_n都有一个对应的LOG_ARCHIVE_DEST_STATE_n参数来指定是否生效
--ENABLE,默认值,表示允许传输服务
--DEFER,指定对应的LOG_ARCHIVE_DEST_n参数有效,但暂时不使用该归档路径
--ALTERNATE:禁止传输,但是如果其他相关的目的地都连接失败,它将边长ENABLE
--RESET:功能与defer类型,不过如果传输目的地之前有过错误,会清除其所有错误信息

*.log_archive_dest_1='location=C:\app\Administrator\fast_recovery_area\orclbk\ARCHIVELOG'
*.log_archive_dest_2='service=orcl_192.168.19.197'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'

可以使用视图V$ARCHIVE_DEST查看参数配置

standby > select dest_name,db_unique_name,destination from v$archive_dest
LOG_ARCHIVE_DEST_1 orclbk C:\app\Administrator\fast_recovery_area\orclbk\ARCHIVELOG
LOG_ARCHIVE_DEST_2 orcl orcl_192.168.19.197

2 使用ARCn进程发送redo数据
默认情况,redo传输服务使用ARCn进程发送redo数据,不过ARCn归档进程只支持最高性能保护模式,如果standby数据库处于
其他类型的保护模式,必须使用LGWR传输redo数据
--初始化参数控制ARCn进程归档行为
ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=N;
0<N<=30
--ARCn的归档过程
主库日志发送切换时就会启用归档过程,其中归档操作可以分在主库端和备库端
--1在primary数据库(假设有2个归档进程)端操作,一旦ARC0进程完成online redologs的归档,ARC1进程即开始传输该归档中的redo
数据到standby数据库指定的路径
--2在standby数据库端操作,RFS(remote file server)进程将redo数据写入standby redologs(如果创建了standby redologs的话),再有
standby数据库中的ARCn进程将其写入归档,然后通过redo应用或者sql应用将数据应用到standby数据库。

oracle data guard --理论知识回顾01-LMLPHP

3 使用LGWR归档redo数据
使用LGWR进程与使用ARCn进程有明显的的不同,LGWR进程并不需要等待online redologs完成切换归档
standby数据库的LGWR进程会先选择一个standby redologs文件映射primary数据库中当前活动的online redologs;
如果standby数据库没有创建standby redologs文件,则standby数据库会自动在默认的location归档路径下创建一个归档文件,替代
standby redologs的功能,一旦primary数据库有redo数据产生,视log_archive_dest_n初始化参数中SYNC或ASYNC属性设置,以
同步或者非同步方式传输到standby数据库
--如果选择lgwr传输redo,log_archive_dest_1中指定server和lgwr两个属性,SYNC(同步-默认)/ASYNC(异步)方式传输
--指定ASYNC,primary数据库的操作会先记录在本地的redo log,然后在传输到standby数据库。
--SYNC,primary数据库任何会产生redo数据的操作都会同步触发网络I/O,并且等到网络I/O全部完成才会继续下面的提交。
--1 LGWR同步归档的流程

*.log_archive_dest_1='location=C:\app\Administrator\fast_recovery_area\orclbk\ARCHIVELOG'
*.log_archive_dest_2='service=orcl_192.168.19.197 LGWR SYNC NET_TIMEOUT=30'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'

LGWR进程以同步模式传输redo
primary库LGWR写online redologs的同时,同步传输redo到standby数据库,解读:
--在primary端,LGWR提交的redo数据由LNSn(LGWR network server process,n>0)进程,发送至远端的standby数据库
--standby端的RFS(remote file server)进程将接受到的redo 数据写入standby redologs。特别注意,在此期间,primary数据库
的事务会一直保持,知道含LGWR SYNC属性的log_archive_dest_n指定路径完成接收。
如果由于某些原因导致standby端无法正常接收redo数据(网络闪断),那么连primary数据库也会受到影响,提交的事务一直等待,
正因如此,前面提到SYNC方式传输redo时,建议同时设置NET_TIMEOUT属性

oracle data guard --理论知识回顾01-LMLPHP

--2 LGWR异步归档流程

*.log_archive_dest_1='location=C:\app\Administrator\fast_recovery_area\orclbk\ARCHIVELOG'
*.log_archive_dest_2='service=orcl_192.168.19.197 LGWR ASYNC'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'

oracle data guard --理论知识回顾01-LMLPHP

ASYNC方式归档就不再需要指定NET_TIMEOUTl ,因为LGWR和LNSn之间没有关联。

4 安全传输redo数据
除了正确设置log_archive_dest_n等相关参数,确保redo数据传输到适当数据库外,dg还提供了密码验证的方式确保
redo数据不被错误的传输到其他机器,
redo传输服务在传输reod数据时,要使用认证的网络会话信息,经过认证的会话信息来自密钥文件,一定要确保primary
和standby的sys密码相同。

什么时候发送
1 valid_for属性指定传输及其接收对象
log_archive_dest_n参数中的valid_for属性,用来指定传输的内容
--redo_log_type:online_logfile,standby_logfile,all_logfiles
--database_role: primary_role,standby_role,all_roles
默认值valid_for(all_logfiles,all_roles)
通过db_unique_name属性指定数据库
db_unique_name是10g版本新增加的一个关键字,作用是指定唯一的oracle数据库名称

出错了这么办
对于归档失败的问题,log_archive_dest_n参数有几个属性,可以用来控制归档过程中出现故障时应该采取的措施
1 reopen指定时间后再次尝试归档
使用reopen=seconds(默认300秒),在指定时间重复尝试向归档目的地进程归档操作

log_archive_dest_2='SERVER=orcl_192.168.19.197 LGWR ASYNC REOPEN=100'

2 alternate指定替补的归档目的地

*.log_archive_dest_1='location=C:\app\Administrator\fast_recovery_area\orclbk\ARCHIVELOG'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_2='location=C:\app\Administrator\fast_recovery_area\orclbk\ARCHIVELOG_2'
*.log_archive_dest_state_2='ALTERNATE'

当log_archive_dest_1路径下无法归档时,自动尝试向log_archive_dest_2路径下归档文件
3 MAX_FAILURE控制失败尝试次数

log_archive_dest_2='SERVER=orcl_192.168.19.197 LGWR ASYNC REOPEN=100 MAX_FAILURE=3'

管理日志文件
1 指定临时归档路径
默认情况下,接收到的归档都是写到log_archive_dest_1中指定的location路径下,对于standby数据库,
还有另外一个用来指定standby接收到的归档路径standby_archive_dest

select dest_name,archived_thread#,archived_seq#,applied_thread#,applied_seq#,db_unique_name,destination from v$archive_dest_status where status='VALID';
STANDBY_ARCHIVE_DEST 1 1847 1 1847 NONE C:\app\Administrator\fast_recovery_area\cadbk\ARCHIVELOG

2 重用online redologs文件
对于standby下的online redologs能否重用不仅仅依赖归档是否完成,还受属性制约
log_archive_dest_2中可选的属性:OPTIONAL或者MANDATORY(表示日志文件必须成功归档到指定的路径下,否则该日志文件不能被重用)
OPTIONAL,表示无论是否成功归档到指定路径,要被归档的日志文件都可以重用,默认属性OPTIONAL

3 设置控制文件中记录重用及增长规则
归档文件产生的记录也会保存在控制文件中,控制文件的大小是有限的,一旦控制文件达到最大值,alert就会
产生krcpwnc:following controlfile record wirtten over
控制文件最大不超过20000个数据块,大小不超过320M

SYS@ orcl >select type,records_total,records_used from v$controlfile_record_section where type='ARCHIVED LOG';

TYPE                 RECORDS_TOTAL RECORDS_USED
---------------------------- ------------- ------------
ARCHIVED LOG 308 200

control_file_record_keep_time 默认7天,最大值不超过365

4 多个standby间共享文件路径
如,两个standby数据库orclbk1和orclbk2在同一台服务器上,primary数据端只要设置就能实现

*.log_archive_dest_2='service=orclbk1 LGWR ASYNC'
*.log_archive_dest_3='service=orclbk2 LGWR ASYNC DEPENDENCY=log_archive_dest_2'

那么primary在发送redo数据时,并不需要发送相同的数据到两个远端的归档路径,只要将相关数据发送到
log_archive_dest_2指定的路径下即可

log应用服务(log apply service)

默认情况下,log应用服务会等到单个归档文件全部接受成功后在启动应用,如果standby 数据库配置了standby redologs,
就可以打开实时应用(Real-Time Apply),这样dg就不需要等待接收完归档文件,只要RFS进程将redo写入standby redologs,
即可通过MRP/LSP实时写向standby数据库。
1 redo数据实时应用

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;

2 redo数据延迟应用

SQL> alter system set log_archive_dest_3='service=orcl_192.168.19.197  arch valid_for=(online_logfiles,primary_role) db_unique_name=orcl delay=15'   scope=both sid='*';
--delay=15 分钟

不过如果在启动redo指定了实时应用redo,即使指定了delay属性也会忽略

SQL> alter database recover manager standby database nodelay;---取消延时属性

应用redo数据到standby数据库
物理standby启动redo应用,数据库要处于mount或者open read only状态

SQL> alter database recover managed standby database disconnect;
停止redo应用
SQL> alter database recover managed standby database cancel;

选择保护模式

 最大保护 最大可用最高性能
redo写进程LGWRLGWRLGWR或ARCH
网络传输模式SYNCSYNCLGWR进程时SYNC或ASYNC,ARCH时SYNC
磁盘写操作AFFRIMAFFRIMAFFRIM或者NOAFFRIM
是否需要standby redologsYESYES可以没有,推荐有

1 查看当前的保护模式

select protection_mode,protection_level from v$database;
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

2 修改初始化参数

SQL> alter system set log_archive_dest_3='service=orcl_192.168.19.197  LGWR SYNC AFFRIM valid_for=(online_logfiles,primary_role) db_unique_name=orcl'   scope=both sid='*';

3 设置新的保护模式并重启数据库

SQL> alter database set standby database to MAXIMIZE AVAILABILITY;
shutdown immediate;
startup;
05-11 09:43