01, 使用LGWR 进程的SYNC 方式
1)Primary Database 产生的Redo 日志要同时写到日志文件和网络。也就是说LGWR进程把日志写到本地日志文件的同时还要发送给本地的LNSn进程(Network Server Process),再由LNSn(LGWR Network Server process)进程把日志通过网络发送给远程的目的地,每个远程目的地对应一个LNS进程,多个LNS进程能够并行工作。
2)LGWR 必须等待写入本地日志文件操作和通过LNSn进程的网络传送都成功,Primary Database 上的事务才能提交,这也是SYNC的含义所在。
3)Standby Database的RFS进程把接收到的日志写入到Standby Redo Log日志中。
4)Primary Database的日志切换也会触发Standby Database 上的日志切换,即Standby Database 对Standby Redo Log的归档,然后触发Standby Database 的MRP或者LSP 进程恢复归档日志。
因为Primary Database 的Redo 是实时传递的,于是Standby Database 端可以使用两种恢复方法:
实时恢复(Real-Time Apply): 只要RFS把日志写入Standby Redo Log 就会立即进行恢复;
归档恢复: 在完成对Standby Redo Log 归档才触发恢复。
Primary Database默认使用ARCH进程,如果使用LGWR进程必须明确指定。使用LGWR SYNC方式时,可以同时使用NET_TIMEOUT参数,这个参数单位是秒,代表如果多长时间内网络发送没有响应,LGWR 进程会抛出错误。 示例如下:
alter system set log_archive_dest_2 = 'SERVICE=ST LGWR SYNC NET_TIMEOUT=30' scope=both;
02, 使用LGWR进程的ASYNC 方式
使用LGWR SYNC方法的可能问题在于,如果日志发送给Standby Database过程失败,LGWR进程就会报错。也就是说Primary Database的LGWR 进程依赖于网络状况,有时这种要求可能过于苛刻,这时就可以使用LGWR ASYNC方式。 它的工作机制如下:
1) Primary Database 一端产生Redo 日志后,LGWR 把日志同时提交给日志文件和本地LNS 进程,但是LGWR进程只需成功写入日志文件就可以,不必等待LNSn进程的网络传送成功。
2) LNSn进程异步地把日志内容发送到Standby Database。多个LNSn进程可以并发发送。
3) Primary Database的Online Redo Log 写满后发生Log Switch,触发归档操作,也触发Standby Database对Standby Database对Standby Redo Log 的归档;然后触发MRP或者LSP 进程恢复归档日志。
因为LGWR进程不会等待LNSn进程的响应结果,所以配置LGWR ASYNC方式时不需要NET_TIMEOUT参数。示例如下:
alter system set log_archive_dest_2 = 'SERVICE=ST LGWR ASYNC ' scope=both;
二,理解DG三大保护模式
| Maximum Availability | Maximum Performance | Maximum Protection |
| AFFIRM | NOAFFIRM | AFFIRM |
| SYNC | ASYNC | SYNC |
1.最大可用性模式(Maximum Availability)
1)该模式提供了仅次于“最大保护模式”的数据保护能力;
2)要求至少一个物理备库收到重做日志后,主库的事务才能够提交;
3)主库找不到合适的备库写入时,主库不会关闭,而是临时降低到“最大性能模式”模式,直到问题得到处理;
4)优点:该模式可以在没有问题出现的情况下,保证备库没有数据丢失,是一种折中的方法;
5)缺点:在正常运行的过程中缺点是主库的性能受到诸多因素的影响。
2.最大性能模式(Maximum Performance)
1)该模式是默认模式,可以保证主数据库的最高可用性;
2)保证主库运行过程中不受备库的影响,主库事务正常提交,不因备库的任何问题影响到主库的运行;
3)优点:避免了备库对主数据库的性能和可用性影响;
4)缺点:如果与主库提交的事务相关的恢复数据没有发送到备库,这些事务数据将被丢失,不能保证数据无损失。
3.最大保护模式(Maximum Protection)
1)这种模式提供了最高级别的数据保护能力;
2)要求至少一个物理备库收到重做日志后,主库的事务才能够提交;
3)主库找不到合适的备库写入时,主库会自动关闭,防止未受保护的数据出现;
4)优点:该模式可以保证备库没有数据丢失;
5)缺点:主库的自动关闭会影响到主库的可用性,同时需要备库恢复后才能提交,对网络等客观条件要求非常的高,主库的性能会因此受到非常大的冲击。
三,了解FAR SYNC
Active Data Guard Far Sync是Oracle 12c的新功能(也称为Far Sync Standby),Far Sync功能的实现是通过在距离主库(Primary Database)相对较近的地点配置Far Sync实例,主库(Primary Database) 同步(synchronous)传输redo到Far Sync实例,然后Far Sync实例再将redo异步(asynchronous)传输到终端备库(Standby Database)。这样既可以保证零数据丢失又可以降低主库压力。Far Sync实例只有密码文件,init参数文件和控制文件,而没有数据文件。
如果redo 传输采用Maximum Availability模式,我们可以在距离生产中心(Primary
Database)相对较近的地点配置Far Sync实例,主库(Primary
Database)同步(synchronous)传输redo到Far Sync实例,保证零数据丢失(zero data
loss),同时主库和Far Sync距离较近,网络延时很小,因此对主库性能影响很小。然后Far
Sync实例再将redo异步(asynchronous)发送到终端备库(Standby
Database)。
如果redo 传输采用Maximum Performance模式,我们可以在距离生产中心(Primary
Database)相对较近的地点配置Far Sync实例,主库(Primary Database) 异步传输redo到Far
Sync实例,然后Far Sync实例再负责传输redo到其他多个终端备库(Standby
Database)。这样可以减少主库向多个终端备库(Standby
Database)传输redo的压力(offload)。
Far Sync配置对于Data Guard 角色转换(role
transitions)是透明的,即switchover/failover命令方式与12c之前相同。
考虑到可能发生Data Guard 角色转换,即switchover/failover,可以在距离备库较近的地方也配置Far
Sync实例,这个Far Sync实例只有在当前的备库切换为主库后才启用。
考虑到Far Sync实例的单点故障,可以在距离主库较近的地点配置2个Far
Sync实例,起到备用的作用
理论图:主传给FS1 节点再由FS1节点传给备库然后备库写到磁盘,F1宕机后由F2接管,完成一个高可用架构
图:
四,配置FAR SYNC
01, 系统描述
| 角色 | 主库 | 备库 | far sync节点一 | far sync节点二 |
| IP地址 | 192.168.0.31 | 192.168.0.32 | 192.168.0.33 | 192.168.0.34 |
| hostsname | node12c01 | node12c02 | node12c03 | node12c04 |
| DB_unique_name | node12c01 | node12c02 | node12c03 | node12c04 |
| 实例名 | orcl | orcl | orcl | orcl |
| 监听服务 | 见下 | 见下 | 见下 | 见下 |
| 控制文件 |
/orcl/app/oracle/oradata/orcl/control01.ctl, /orcl/app/oracle/fast_recovery_area/ orcl/control02.ctl |
见左 | 见左 |
见左 |
主库监听:
1 [oracle@node12c01 admin]$ cat listener.ora --- 主库与备库DG状态,这个是不需要更改的 2 # listener.ora Network Configuration File: /orcl/app/oracle/product/12.1.0/db_1/network/admin/listener.ora 3 # Generated by Oracle configuration tools. 4 5 SID_LIST_LISTENER = 6 (SID_LIST = 7 (SID_DESC = 8 (SID_NAME = PLSExtProc) 9 (ORACLE_HOME = /orcl/app/oracle/product/12.1.0/db_1/) 10 (PROGRAM = extproc) 11 ) 12 (SID_DESC = 13 (GLOBAL_DBNAME = NODE12C01) 14 (ORACLE_HOME = /orcl/app/oracle/product/12.1.0/db_1) 15 (SID_NAME = orcl) 16 ) 17 (SID_DESC = 18 (GLOBAL_DBNAME = NODE12C01_DGMGRL) 19 (ORACLE_HOME = /orcl/app/oracle/product/12.1.0/db_1) 20 (SID_NAME = orcl) 21 ) 22 (SID_DESC = 23 (GLOBAL_DBNAME = node12c) 24 (ORACLE_HOME = /orcl/app/oracle/product/12.1.0/db_1) 25 (SID_NAME = ORCL) 26 ) 27 ) 28 29 LISTENER = 30 (DESCRIPTION_LIST = 31 (DESCRIPTION = 32 (ADDRESS = (PROTOCOL = TCP)(HOST = node12c01)(PORT = 1521)) 33 ) 34 (DESCRIPTION = 35 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) 36 ) 37 ) 38 39 ADR_BASE_LISTENER = /orcl/app/oracle/