文章来源于网络整理
DG
通过提供冗余数据来提供数据保护
1.常用于异地容灾和小企业的高可用解决方案
2.虽然可以在Standby
机器上执行只读查询,从而分散Primary
数据库的性能压力,但是绝不是性能解决方案
DataGuard
介绍
在DG
环境中,至少会有两个数据库,一个数据库处于Open
状态,对外提供服务,这个数据库叫做Primary Database
。第二个数据库处于恢复状态,叫做Standby Database
。
运行时Primay Database
对外提供服务,用户在Primary Database
上进行操作,操作被记录在日志文件中。这些日志通过网络传送到Standby Database
。这些日志会在Standby Database
上重演,从而实现了数据的同步。
Standby Database
和Primary Database
可以互相转化,继续对外提供服务
Data Guard
结构
有三个点需要我们注意
1、在Primary Database
上产生日志
2、产生的日志传送给Standby Database
数据库
3、Standby Database
重演这些日志
分别对应着
日志发送
日志接收
日志应用
日志发送(Redo Send
)
Primary Database
运行过程中,会源源不断的产生Redo
日志,这些日志需要发送到Standby Database
。
这个发送动作可以由Primary Database
的LGWR
或者ARCH
进程完成。
选择哪个进程对数据保护能力和系统可用性有很大的不同。
1、
Primary Database
不断的产生Redo Log
,这些日志被LGWR
进程写到联机日志
2、联机日志写满以后,发生日志切换,触发ARC0
完成本地归档,归档位置采用LOG_ARCHIVE_DEST_1='LOCATION=/path'
3、完成本地归档以后,联机日志可以被覆盖重用
4、ARCH1
进程通过Net
把归档日志发送给Standby Database
的RFS
进程
5、Standby Database
端的RFS
进程把接收到的日志写入到归档日志
6、Standby Database
端的MRP
进程(Redo Apply
)或者LSP
进程(SQL Apply
)在Standby Database
上应用这些日志,进而同步数据
这种方式最大的问题是:
Primary Database
只有在发生归档时才会发送日志到Standby Database
,如果Primary Database
异常宕机,联机日志中的Redo
内容会丢失,因此这种方式没法避免数据丢失的问题。
要想避免数据丢失,就必须使用LGWR
,而使用LGWR
又有SYNC
和ASYNC
两种方式。 缺省Primary Database
使用的就是ARCH
进程,不需要特别的指定
1、
Primary Database
产生的Redo
日志要同时写到日志文件和网络。也就是说LGWR
进程把日志写到本地日志文件的同时还要发给本地的LNSn
进程(Network Server Process
),再由LNSn
进程把日志通过网络发送到远程目的地,每个远程目的地对应一个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
归档才触发恢复
使用LGWR
进程的ASYNC
方式
使用LGWR SYNC
方法的最大问题在于,如果日志发送给Standby Database
过程失败,LGWR
进程就会出错,也就是说Primary Database
进程依赖于网络状况。
使用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 Redo Log
的归档,然后触发MRP
或LSP
进程恢复归档日志
因为LGWR
进程不会等待LNSn
进程的响应结果,所以配置LGWR ASYNC
方式时不需要NET_TIMEOUT
参数
日志接收(Redo Receive
)
Standby Database
的RFS
进程接收到日志后,就把日志写到Standby Redo Log
或者Archived Log
文件中,具体写入哪种文件,取决于Primary
的日志传送方式和Standby Database
的配置。
如果是写到Standby Redo Log
文件中,则当Primary Database
发生日志切换时,也会触发Standby Database
上的Standby Redo Log
的日志切换,并把这个Standby Redo Log
归档。
日志应用(Redo Apply
)
日志应用服务,就是在Standby Database
上重演Primary Database
的日志,从而实现两个数据库的数据同步。
Standby Database
重演日志方式有两种类型:
1
Physical Standby
使用的是Media Recovery
技术,在数据块级别上进行恢复,这种方式没有数据类型的限制,可以保证两个数据库完全一致。Physical Standby
数据库只能在Mount
状态下进行恢复,也可以打开,但是只能以只读方式打开,并且打开时不能进行恢复操作。
2Logical Standby
使用的是Logminer
技术,通过把日志内容还原成SQL
语句,然后SQL
引擎执行这些语句,Logical Standby
不支持所有数据类型,可以在视图dba_logstdby_unsupported
中查看不支持的数据类型。如果使用了这种数据类型,则不能保证数据完全一致。Logical Standby
数据库可以在恢复的同时进行读写操作。
Redo Apply
发生的时间分为两种
1.实时应用(
Real-Time Apply
),这种方式必须使用Standby Redo Log
。每当日志被写入到Standby Redo Log
时,就会触发恢复,使用这种方式的好处在于可以减少数据库切换的时间(Switchover
或Failover
),因为切换时间主要用在剩余日志内容的恢复上。
2.归档应用,这种方式是在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;
自动裂隙检测解决
当Primary Database
的某些日志没有成功发送到Standby Database
,这时就发生了归档裂隙(Archive Gap
),缺失的这些日志就是裂隙(Gap
)。
Dataguard
能够自动检测、解决归档裂隙,不需要DBA
的介入。
这需要配置FAL_CLIENT
、FAL_SERVER
两个参数(FAL
是Fetch Archive Log
的首字母缩写)。
从FAL
名称就可以看出,这个过程是Standby Database
主动发起的“取”日志的过程,Standby Database
是FAL_CLIENT
,但是Standby Database
从哪里取这些日志呢?这个哪里就是FAL_SERVER
。
参数FAL_SERVER
是用来定义要从哪些数据库获得缺少的日志。这个参数值是Oracle Net Name
。
参数FAL_CLIENT
也是一个Oracle Net Name
。
FAL_CLIENT
通过网络发送请求, FAL_SERVER
通过网络向FAL_CLIENT
发送缺失的日志。
但是这不一定是一个连接。
因为FAL_CLIENT
向FAL_SERVER
发送请求的时候,会携带FAL_CLIENT
参数值,用来告诉FAL_SERVER
应该向哪里发送缺少的日志,这个参数也是一个Oracle Net Name
,这个Name
是在FAL_SERVER
上定义的,用来指向FAL_CLIENT
。
除了自动的日志缺失解决,DBA
也可以手工解决,这需要作如下操作:
1、确认
Standby Database
上缺少的日志
2、把这些日志从Primary Database
拷贝到Standby Database
3、在Standby Database
使用命令手工注册这些日志
sql alter database register logfile 'logfilename';
DG
三种保护模式(级别递增):Maximum Performance
--> Maximum Availability
--> Maximum Protection
根据oracle
文档的解释,最高可用性数据保护模式需要先满足以下几个条件:
第二篇:
LGWR
还分为LGWR ASYNC
(异步)和LGWR SYNC
(同步)两种。
1.最大性能(
maximize performance
):这是data guard
默认的保护模式。primary
上的事务commit
前不需要从standby
上收到反馈信息(主数据库的提交操作不等待STANDBY
),该模式在primary
故障时可能丢失数据,但standby
对primary
的性能影响最小。
可以使用LGWR ASYNC
或者ARCH
两种传输模式。ARCH
传输模式:Primary DB
上的online redo log
写满或其他条件引起redo log
写归档的时候,redo log
生成的archived log file
写到本地归档目录的同时,写入了Standby
归档目录。只是Primary db
上的online redo log
切换不必等Standby
上的写归档动作结束。
2.最大可用(
maximize availability
):在正常情况下,最大可用模式和最大保护模式一样;在standby
不可用时,最大可用模式会自动降低成最大性能模式,所以standby
故障不会导致primary
不可用。在问题纠正之后,Standby
和主数据库进行再同步,至少有一个standby
可用的情况下,即使primary down
机,也能保证不丢失数据。(不过当问题修复,再同步之前有必要FAILOVER
,那么有些数据可能会丢失)。最大可用性模式Standby
必须配置Standby Redo log
,Oracle
推荐最大可用模式使用LGWR ASYNC
(异步)模式传输。 采用最大可用的data guard
模式,主库往备库传递在线日志(online redo log
)信息,在线日志信息写入备用库的standby redo log
,这些standby redo log
归档后,备用库应用归档日志。
3.最大保护(
maximize protection
):最高级别的保护模式。primary
上的事务在commit
前必须确认redo
已经传递到至少一个standby
上,如果所有standby
不可用,则primary
会挂起。该模式能保证零数据丢失。对于最大保护和最高可用性模式,Standby
数据库必须配置standby redo log
,并且oracle
推荐所有数据库都使用LGWR ASYNC
模式传输。 采用最大保护必须符合以下条件:
1.主库在LOG_ARCHIVE_DEST_n
的参数设置中必须用到LGWR SYNC AFFIRM
属性来归档到standby
数据库
2.standby
数据库必须配置standby redo
日志
3.至少有一个standby
数据库是可用的。
Physical standby
直接从主库接受archived log
,然后直接做基于block
的物理恢复(更新或调整变化的block
),所以physical standby
在物理文件一级完全都等同于主库。physical standby
恢复只是底层的block apply
, OS
层面的工作,数据库SCHEMA
,包括索引都是一样的。它是直接应用REDO
或归档实现同步的 。不会涉及temp ,undo
等。
物理STANDBY
的模式:只读模式(OPEN READONLY
)和恢复模式(MANANGED RECOVERY
)。
逻辑STANDBY
中,逻辑信息是相同的,但物理组织和数据结构可以不同,它和主库保持同步的方法是将接收的REDO
转换成SQL
语句,然后在STANDBY
上执行SQL
语句(SQL Apply
)。逻辑STANDBY
除灾难恢复外还有其它用途,比如用于用户进行查询和报表。
第三篇:
那么对于oracle dataguard
(简称DG
)有两种传输模式:async
(异步)和sync
(同步),在介绍这两种传输模式前,说一下dg
的重做传输进程架构。
在主库使用LNS
进程从sga
中的重做缓冲区中获得相应redo
数据,然后通过网络服务传送到备库,那么在备库通过RFS
进程接收redo
数据存在standby log file
中,然后在应用(sql apply
或是redo apply
)数据。
同步传输模式:
顾名思义同步含有实时确认的意思。见如下图
当用户在主库提交数据的时候,会在
sga
的redo
缓冲区中首先记录redo
信息,在提及操作的时候lgwr
会将redo
数据写入redo
数据文件中,那么这个时候lns
进程会实时的将redo
数据从主库的redo
缓冲区传送到备库,在备库使用rfs
接收数据,传入standby logfile
中,进而应用redo
数据(sql apply
)。在应用完成后rfs
将信息返回主库进程,告知该redo
条目已经在备库应用完毕,lgwr
收到lns
的确认消息,从而提示提交成功。
在最高可用性中,如果主库收不到备库应用的确认消息,那么会通过net_timeout
值超时,继续完成本次操作,那么lns
进程将不会在获得sga
中的重做数据,只有当下次日志switch
的时候才主动去尝试获得lns
数据,如果期间还是没有和备库完成通信,当超过net_timeout
参数的时候会继续停止,主机事务也继续完成,但当存在于最大保护模式下,那么必须等到备库应用redo
的确认消息,否则就会停止数据库的运行操作。
异步传输模式:
异步传输模式就是指主库不必要等待备库应用redo
的确认消息,就会完成提交工作(见下图),但是增加了数据丢失的风险性。
传输滞后:
主库和 备库因某种原因,导致lns
进程无法传送数据到备库,就会传输滞后
当数据库运行最高可用性下,当主库无法与备库进行通信,那么主库依然可以完成事务的提交,
lgwr
依然可以写入online redo
日志,在没法通信期间主库可能会产生很多归档日志,那么oracle
为了在备库和主库能够再次通信应用redo
日志的情况,会进行自动处理间隔操作。具体就是主库arch
进程会不停ping
备库,当和备库通信连接后,那么arch
进程通过备库的rfs
进程获得备库控制文件中最后应用的归档日志信息,将丢失的归档日志通过arch
进程传送与备库进行应用。当在主库进行redo
日志切换的时候,lns
进程会再次和备库的rfs
进程通信继续完成redo
条目的传送,arch
传送的归档日志在后台进行应用。当备库和主库redo
条目同步后arch
的任务随即完成。
ADG
随着Oracle ADG
的出现,Oracle
在读写分离的支持上又进一步了,可以在延迟很少的情况下提供读,而且不会出现复制错误或者数据不一致的问题。
Active Dataguard Reader Farm
架构至少存在以下优势:
- 管理维护简单,
DBA
只要熟悉Data guard
的管理即可,无需再额外学习其他方面的新知识;Active Dataguard Reader Farm
节点是灵活可扩展的,可以在线添加或者删除节点,并且可以线性扩展而不对生产系统造成影响;- 可以真正做到实时查询,不会应为大事务造成同步阻塞,性能有保障;
- 没有数据类型的限制;
- 高可用性,节点的宕机都不会影响到数据库的可用性。 但是同时也需要注意:
Active Dataguard
是11g
数据库单独的一个option
,需要单独付费的。- 无法在
Active Dataguard Reader Farm
节点单独创建索引进行查询优化。- 在所有
Active Dataguard Reader Farm
节点上sql
的执行计划最好保持一致。 以上仅仅只是对Active Dataguard
和Active Dataguard Reader Farm
做一个简单的介绍,以下是读写分离的架构图: