【前言】学习技术跟学习武功一样,之前整理了DataGuard的搭建和切换,这些都是武功招式,但是心法还没有学。本文档介绍DataGuard的重要心法,DataGuard的三种保护模式跟日志传输模式的关系,文章的主要内容来自于Oracle DataGuard 11G的参考手册。
【1】DataGuard日志传输模式的介绍
DataGuard的原理简单来说就是把ORL写入本地的同时,传送一份到备库上面进行执行,日志传输是整个DataGuard的核心,就很有必要对日志传输的几种模式进行介绍;
DATAGUARD所有的同步模式都可以简化成下面这张图:
1、主数据库的LGWR 进程将重做数据写入到自己的ORL 中,同时Log Network Server(LNS)进程从SGA的重做缓冲区中读取重做日志的信息,交由Oracle Net服务传输到备份数据库;
2、备用数据库由另一个Data Guard进程Remote File Server(RFS)接收。RFS 在备用数据库上接收重做数据,然后将其写入一个名为备用重做日志(StandbyRedo Log,SRL)文件的顺序文件中。
当了解了简单的原理之后,便可以深入的了解详细的三种传输模式了;
同步方式:同步传输(synchronous transport,SYNC)又称“零数据损失”方法,因为要等到LNS确认事务恢复所需的重做数据已被写入备用站点的磁盘上,才允许LGWR 认可提交操作成功。
(1) 用户提交一个事务,事务在SGA 中创建一个重做记录。LGWR从日志缓冲区中读取重做记录,写入ORL,然后等待LNS 的确认。
(2) LNS 从日志缓冲区中读取相同的重做记录,通过Oracle Net 服务传给备用数据库。备用数据库上的RFS 接收重做数据,然后将其写入备用重做日志文件中。
(3) 当RFS 从磁盘接收到一个写完消息时,会将一个确认消息传回给主数据库上的LNS进程,LNS 接着通知LGWR 传输完成。LGWR 接着向用户发送提交确认信息。
优点:保证了数据的安全;
缺点:影响主库的性能;
异步传输方式:(asynchronous transport,ASYNC)与SYNC 的不同之处在于,LGWR不必等待来自LNS 的确认消息,无论主数据库与备用数据库相距多远,都几乎不会影响到主数据库的性能。
原理图如上:
异步传输方式会根据场景的不同,调节读取日志的方式,所有的场景都在下面的原理图中,请细看
场景一:LNS的读取速度跟得上重做日志产生的速度(系统比较空闲或者网络带宽比较高),这种情况下异步传输的链路跟同步传输的情景是一样的。LNS进程从日志缓冲池中读取重做日志,然后通过Oracle Net服务传给备用数据库。
场景二:当LNS赶不上SGA重做日志的产生速度(可以联想到一个水池,其注水速度比排水速度快)。在将重做数据传给备用数据库前就回收了日志缓冲区,LNS 将自行转为从ORL 读取和发送重做数据(从Data Guard 11g 开始提供此项功能)。当LNS 赶上进度后,将自行转回到直接从日志缓冲区中读取/发送。
场景三:(这种情况比较复杂,这边也是摘录了Data Guard的完全参考手册整理而成)
在极少数情况下,(ORL产生的速率非常快,或者网络出现故障的情况下),LNS还在发送第一个ORL文件的时候,但是系统已经发生了多次日志切换,LNS发送的完当前的文件,下个要传送的文件已经被归档。
这时候Data Guard在主数据库上使用ARCH 进程连续ping备用数据库来确定其状态。当还原与备用数据库的通信后,ARCH ping 进程会查询备用控制文件(通过其RFS 进程),来确定备用数据库从主数据库收到的最后一个完整日志文件。Data Guard 确定需要哪些日志文件来重新同步备用数据库,然后立即开始使用其他ARCH 进程传输相应文件。
在接下来执行日志切换时,LNS 会试图连接备用数据库,成功后开始传输当前重做数据,而ARCH 进程在后台处理间隔。一旦备用应用进程能赶上当前重做记录的进度,应用进程就自行转换,不再读取归档重做日志,改而读取当前SRL(假定用户已经配置了Data Guard“实时应用”)。
最后需要注意的一点是,从Data Guard 10g 开始,主数据库的一个ARCH进程一直专门负责本地归档,从而确保在处理间隔期间,远程归档操作不影响主数据库回收;
为使备用数据库赶上进度,主数据库必须以远超平时生成重做数据的速度传输数据。Data Guard 架构允许使用多个后台ARCH 进程来快速处理间隔,与此同时,LNS 进程像通常一样执行当前日志流的SYNC 或者ASYNC 传输。
总结异步传输方式:
1、LNS首先会读取SGA中的重做日志缓存,这种情况下是最佳情况;
2、当LNS从第1个操作里面读取不到数据的情况下就去获取当前联机重做日志的数据;
3、当LNS从第1、2个操作里面均获取不到数据的情况下就要去查看备库上面日志的传输情况,查看完成后主库通过返回的信息进行传输数据;