Oracle 11g Dataguard参数详解

注:本文译自《oracle data guard 11g handbook》 page 78 – page 88

就data guard(后面都写成dg)来说,我们只关注如下三种参数:

1.独立于数据库角色的参数
2.数据库角色为primary时的参数
3.数据库角色为standby时的参数

虽然dg有着非常多的配置参数,我们实际使用的只有其中很少的部分,而且因为现在许多的dg功能被集成到了代码中,最近的dg版本中很多配置参数已经被弃用了。需要注意的是,为了便于完成数据库的角色转换(role transition),与tns names,listener,srl(standby redo log)文件有关的参数需要在所有数据库中配置。那么现在我们来看看这些参数吧:

一、与角色无关的参数

db_unique_name    该参数定义了数据库的唯一名称。因为db_name参数需要满足与物理备用数据库(physical standby)名称保持一致,和逻辑备用数据库(logical standby)名称不相同的条件,所以在10g中该参数被引入用来区分dg配置中的每一个数据库角色。这个参数需要在所有的数据库中配置,同时需要重启数据库才能生效。如果不配置这个参数,那么默认会使用db_name参数,这就意味着我们不需要关闭生产库来完成备用数据库的配置工作,我们可以在之后进行配置。

复制代码 代码如下: db_unique_name=’matrix’

log_archive_config    该参数定义了dg配置中可用的db_unique_name参数值列表。与目标参数(稍后讨论)db_unique_name的值结合使用时,dg以它们来实现两个数据库之间连接的安全性检查工作。只要不指定send和receive属性,这个参数就是动态的,这两个属性是旧参数remote_archive_enable遗留下来的,已经不再需要,因此就不要再使用了。

在实际使用时,你只需要将其他数据库的唯一名称添加到配置就可以了,当前数据库的唯一名会根据场景自动添加;不过为了清晰期间,并且在所有的数据库中保持该参数的一致性,还是会将当前数据库的唯一名称明确的添加上去。对于名称的配置顺序没有要求,该参数在有rac的环境中是必须要配置的,应该始终使用该参数。

复制代码 代码如下: log_archive_config=’dg_config=(matrix,matrix_dr0)’

control_files    大家都知道这个参数的用途啦(注:当前数据库控制文件的位置),要记住对于备用数据库,它指向的是备用控制文件(standby control file)的位置。这个控制文件是自动创建的,或者手动创建,取决于你创建备用数据库的方法。(注:自动创建通常发生在使用rman功能产生备用数据库过程中,如果你是用的是手工方法,控制文件需要手动的从主库copy过来)

复制代码 代码如下: control_files=’/oracle/oradata/matrix/control01.ctl’

log_archive_max_processes    提到这个参数是因为它的默认值仍然是2,太小了。在主库中,归档进程负责归档已经写满的在线日志文件(online redo log)并作为重做流(redo steam)传输到备用数据库来完成间隔处理(gap);在备库中,归档进程则是负责归档备库日志文件(standby redo log)并且将其转发到它的级联备用数据库中。(注:级联备用数据库是指当前备用数据库的下一级备库,即standby的standby,从这里可以看出不管什么数据库角色,归档进程的工作的内容都是一样的:1,归档日志文件;2,转发日志文件到standby)

在主库中,有一个归档进程仅限于对在线日志文件提供服务,无权与备库进行通信,这个特殊的arch进程被称为“专用arch进程”,而其他归档进程是可以完成这两样功能的。当归档进程向备库发送归档日志文件,就无法协助归档orl文件了;尽管归档进程的主要指令是“先归档在线日志文件,再处理主备库的间隔,”但是在最坏的情况下,仍然可能只有一个归档进程在进行归档任务。如果没有足够的归档进程,在慢速网络,主备库间出现大的日志间隔的时候,你可能就只有那么一个进程在处理日志文件。这里就会有个非常棘手的问题,那就是如果这个时候你所有的日志文件都已经写满,生产库就停滞了,直到其中的一个文件被归档。在10g中引入了多线程间隔处理特性(max_connections),它允许dg使用多个归档进程向备用数据库发送单个日志文件,这就意味这我们会使用更多的归档日志进程;因此,这个参数至少要设置4,最大值为30。

复制代码 代码如下: log_archive_max_processes=’4′

备库专用arch进程

需要注意的是,备用数据库中也有一个“备库专用arch进程”,不过这仅仅意味着在备库中少了一个可以归档srl文件归档进程而已,在物理备用中,这个专用arch进程是没有归档srl文件功能的。

使用多个归档进程时需要注意一点,虽然增加归档进程可以减少生产环境中断的可能,但是大量的归档进程会增加主备切换(switchover)的时间,因为这需要唤醒所有的归档进程并使他们退出。我们可以通过在执行切换前将该参数调低来避免这种情况。此外,在11g中引入了新的流式功能(streaming capability),如果正好主备库间的日志间隔非常大,过多的归档进程传输会把整个网络带宽充满。

db_create_file_dest    虽然这不是dg特有的参数,不过还是需要介绍一下的,因为如果你在备库中使用了asm,这个参数是要定义的。

复制代码 代码如下:

db_create_file_dest=+data

二、主库角色参数

log_archive_dest_n    这个是dg重做日志传输的主要参数,通常都是在主库中起作用,当然也会有例外,比如处理级联备库的场景;该参数也可用来指定由在线重做日志(orl)或备库重做日志(srl)产生的归档日志文件的传输目的地,不过随着10gr1版本中闪回恢复区的引入,本地归档的日志文件默认会放在闪回恢复区,所以在这种情况下就不需要再设置本地归档了;我们将会讨论一下本地归档和location属性,不过应该你已经使用了闪回恢复区,所以不需要再进行log_archive_dest_n参数的设置了。

这个参数有17个属性,所有这些属性都是用来设置主库到备库的重做日志传输的;其实你只需要设置其中的7个就可以让日志传输工作正常了;下面我们会先来介绍一下这7个属性并且用一些例子来展示一下它们的用法,然后我们再探讨一下其余的10个属性以及它们的使用场景和使用原因,我们建议不要设置其中的6个属性。

下面是必须的属性:

service    指定已经创建的备库的tnsnames描述符,早期的网络调整就是从这里开始的。(注:这是dg设置中会较早碰到的与网络相关的属性)

sync    指定使用同步方法传送重做数据,即客户端事务的提交会发生在lgwr进程收到备库lns发来的确认信息之后;对于”最大可用模式“和”最大保护模式“,这需要至少一个备库(standby)。

async    默认值;如果没有指定日志传输类型的话就会使用异步方式发生重做数据;这是”最大性能模式“下的日志传输方法。

net_timeout    指定lgwr进程等待lns进程响应的时间,如果这期间没有收到响应,则认为备库发生故障(failed),默认值是30秒,不过10-15可能会是更恰当的值,这取决于你的网络可靠性。不要将这个值设置为10一下,不然你可能会在备库恢复正常后还是无法建立连接,这是因为重新连接备库的操作也会耗费几秒的时间;因此在这之前,我们需要做:
 
1.停止旧的lns进程
2.启动新的lns进程
3.与备库建立连接
4.检测并停止旧的rfs进程
5.启动新的rfs进程
6.选择并打开新的srl
7.初始化sr头(注:即备库的重做日志数据)
8.响应lns进程告知已经完成准备工作

所有这些操作完成后,lns进程才会告诉lgwr进程备库已连接成功;如果这个过程耗费的时间超过了net_timeout的值,那么lgwr会再次放弃备库;每次发生日志切换时都会进行这个重新连接动作。

reopen    该属性控制主库尝试重新连接已经发生故障的备库的等待时间,默认值是300(5分钟),这通常是大家抱怨在停止备库后主库不重连的原因。一般来说,测试的时候都会比较快;先shutdown abort备库,观察主库的alert日志看是否与备库断开连接,再启动备库,在主库中切换日志观察是否发生重连,这些操作会在5分钟内完成,所以如果你手法快,dg不会在第一次(或者更多次)日志切换时进行重连。这个属性旨在避免这种情况,即如果备库发生故障以后主库立即切换日志,这个时候的重连很有可能就会失败,因此你可以考虑将这个属性设置成30秒甚至是15秒,这样dg会尽快的完成重连工作。

db_unique_name    要在参数log_archive_dest_n参数中使用这个属性需要同时设置log_archive_config参数,否则dg将拒绝连接这个目标库;这个service目标(远端)名称是你用来连接另一端的数据库(也就是备用数据库)的唯一名称。

你必须同时在两端的数据库中将该唯一名称添加log_archive_config参数中。当主库向备库发起连接时,它将会发送自己的数据库唯一名称到备库,同时要求备库返回唯一名称。在备库中将会检查log_archive_config参数,以确保主库的唯一名确实存在,如果不存在,连接请求将会被拒绝;如果存在,备库会把自己的唯一名返送回主库的lns进程,如果返送的值和主库中该属性的值不匹配,连接就会被终止。

和log_archive_config参数一样,这个属性在rac环境下是必须要配置的。

valid_for    这是最后一个必须配置的属性了。尽管你认为不配置这个属性dg也能正常的工作(确实是这样),不过还是建议你使用它。该参数的主要功能是定义何时使用目标参数log_archive_dest_n以及它作用于哪种类型的日志文件。

下面是日志文件的合法值:

1.online_logfile 仅在归档orl文件时有效
2.standby_logfile 仅在归档srl文件时有效
3.all_logfiles 无论是那种重做日志文件类型都有效

下面是角色的合法值:

1.primary_role 仅在主库中生效
2.standby_role 仅在备库中生效
3.all_roles 主备角色都有效

如果这两个参数的答复都是true,valid_for就会允许使用目标参数。(注:这里意思是目标参数会在valid_for的上述两个子项都是true的时候被使用。比如设置为valid_for=(online_logfiles,primary_role)那么如果当前数据库满足是主库并且归档orl文件的条件,log_archive_dest_n内的属性设置就会生效。)有了这个参数,我们就可以预定义dg中所有数据库的所有目标参数了,并其它们仅在valid_for属性都是true的时候生效,这样就没必要再在角色转换时启用和禁用目标了。

那么log_archive_dest_n到底会是什么样子呢?最多可以设置9个目标,这就是说我们可以最多拥有9个备库。其实可以使用10个,不过一个是保留用做默认的本地归档目标的,这个我们稍后会讨论。这里我们使用2号参数来添加一个位于曼彻斯特的最高可用的备库。(为了便于显示进行了修改)

复制代码 代码如下:

log_archive_dest_2=’service=matrix_dr0

                    sync reopen=15 net_timeout=15

                    valid_for=(online_logfiles,primary_role)

                    db_unique_name=matrix_dr0′

现在再添加一个位于纽瓦克市的备库作为3号参数,它的网络延迟比sync长,所以这里以异步模式来传输:

复制代码 代码如下:

log_archive_dest_3=’service=matrix_dr1

                    async reopen=15

                    valid_for=(online_logfiles,primary_role)

                    db_unique_name=matrix_dr1′

当然我们使用了适当的db_unique_name属性,所以我们还要配置log_archive_config参数:

复制代码 代码如下:

log_archive_config=’dg_config=(matrix,matrix_dr0,matrix_dr1)’

下面是可选属性:

affirm    这是使用sync方式目标的默认值。要求lns进程等待rfs进程完成对srl文件的直接i/o再返回成功消息,还要求是“最高可用”或”最大保护“模式;因为这个属性是基于目标的默认值,所以不需要设置它;尽管在10g中可以为async方式的目标指定这个属性,不过依然是没有理由的。实际上,它会拖慢lns进程。在11g中,affirm属性会被async目标忽略掉。

noaffirm    如果没有特别指定,它会是async目标的默认值。用于“最大性能”模式;再次声明,因为它是async的默认值,所以没有必要去指定它;并且如果你对sync目标设置noaffirm属性,你的保护模式将违反规定,被标记为“已重新同步”状态。如果这是你唯一的sync备库,并且处于最大可用模式,那么你将无法进行零数据丢失的故障转移(failover);如果这是你唯一的sync目标,并且处于最大保护模式,那么设置affirm属性会让你的主库崩溃。

compression    这个属性将启用对备用目标的高级压缩功能。默认情况下,这就意味着任何一个向该目标发送间隔日志的归档进程都会在发送时压缩归档。如果你设置了这个隐藏属性,那么它也会压缩当前发送的重做日志流。举个例子,假如设置这个隐藏参数,我们来对当前的两个目标库来添加compression属性:

复制代码 代码如下:

log_archive_dest_2=’service=matrix_dr0

                    lgwr sync reopen=15 net_timeout=15

                    compression=enable

                    valid_for=(online_logfiles,primary_role)

                    db_unique_name=matrix_dr0′

log_archive_dest_3=’service=matrix_dr1
                    lgwr async reopen=15
                    compression=enable
                    valid_for=(online_logfiles,primary_role)
                    db_unique_name=matrix_dr1′

matrix_dr0目标库仅在arch进程发送用于间隔处理的归档日志的时候才会使用压缩功能(并非用于同步sync的归档日志),而matrix_dr1库自始至终都会压缩重做日志。这里说明日志并不会在磁盘也保持压缩状态,因为只会在传输过程中压缩日志,所以这些传输到备库的数据会被解压缩,然后再写入到srl文件中。

max_connections    该属性在10gr2中被引入,它允许你指定用于备库间隔处理的归档进程的数量,在11g中已经弃用。不过如果你的版本是10g,你可以为它指定值1-5(默认值1);如果你设置的值大于1时,每当备库需要进行间隔处理的时候,主库将分配对应数量的归档进程用来发送归档日志文件,这些文件会被分片给这些归档进程,同时在网络中以并行流的形式传送,并在传送到备库时重新装配。

复制代码 代码如下:

log_archive_dest_2=’service=matrix_dr0

                    lgwr sync reopen=15 net_timeout=15

                    max_connections=5

                    valid_for=(online_logfiles,primary_role)

                    db_unique_name=matrix_dr0′

现在当matrix_dr0库与主库断开连接的时候,主库的间隔处理进程将会对每一个确实的归档日志文件使用多个重做流。

注意:

不要在11g数据库中使用max_connections属性,这会降低日志传输的性能。

delay    这个属性并不是像大多数想象的那样延迟重做数据的传输,它只是用来指示备库目标的日志应用进程在delay属性设置的时间(秒)后应用重做数据。有了闪回数据库,这个属性几乎被弃用,尤其在自从我们建议在主备库中一直启用闪回数据库功能后。 如果你倾向于完成一些闪回数据库无法处理的任务量,则可能需要设置这个延迟时间。第8章将讨论闪回数据库和data guard。

alternate    替代(alternate)目标最初的目的是,当正在归档orl日志文件的磁盘空间已满时,保持数据库的持续运行。使用替代目标,你可以将归档日志文件重定向到一个备用磁盘中。有了闪回恢复区(自动管理空间),这个问题基本上消失了。

如果你有多个指向备库的网络路径,也可以为远程备用目标使用该属性。显然,你会在rac环境中使用多个备库网络路径,但是这并不是alternate属性设计的初衷。对于有着多网卡的单实例或者rac的环境,在备库的tns描述符中使用connect-time failover会更简便。(注:参见connect-time failover )

建议不要使用以下的属性:

location    在10gr2之前,该属性必须指定一个文件位置用于归档进程存储归档日志文件,并且这在主库(对于orl文件)和备库(对于srl文件)确实是正确的。不过随着闪回恢复区和默认本地归档的使用,这个属性已经不再需要设置了。编号为10的目标将自动设置成闪回恢复区。

复制代码 代码如下:

sql> select destination from v$archive_dest where dest_id=10;

use_db_recovery_file_dest

sql> archive log list
database log mode archive mode
automatic archival enabled
archive destination use_db_recovery_file_dest
oldest online log sequence 19
next log sequence to archive 21
current log sequence 2

如果你正在使用闪回恢复区,并且你想定义一个本地目标,那么应该使用相同的语法:

复制代码 代码如下:

log_archive_dest_1=’location=use_db_recovery_file_dest

                    valid_for=(online_logfiles,primary_role)

                    db_unique_name=matrix’

如果你还是不使用闪回恢复区,也可以使用旧的磁盘路径写法:

复制代码 代码如下:

log_archive_dest_1=’location=/u03/oradata/matrix/arch/

                    valid_for=(online_logfiles,primary_role)

                    db_unique_name=matrix’

注意在如上的两种情况下,db_unique_name都是指向你在其上定义了目标(注:也就是归档的存放位置)的数据库,而并非远程的备库。在上面的例子中,归档位置目标在matrix库上,因此如果你要在这里使用db_unique_name属性,就需要指定matrix为db_unique_name的值。

注意:

如果使用闪回恢复区,就不要使用location属性来指定本地归档位置了。

mandatory    这是备库上最危险的属性之一。基本上,它规定orl文件中的redo信息必须发送到该备库。如果redo信息无法发送到备库,那么主库中包含redo信息的这个orl文件在成功发送到备库之前将无法被重用(reuse)。试想当备库无法访问并且主库中所有可用的日志文件都被遍历完了,那么生产系统就会停滞。当然,有一个本地目标是mandatory的以使文件存放在磁盘上,不过没有必要再设置另一个了。默认情况下,本地归档中的一个目标会被设置成mandatory。

注意:

不要设置mandatory属性。

max_failure    这个属性是所有属性中最遭人误解的一个。人们都倾向与认为这个属性表示lgwr进程在放弃发生故障的备库并继续产生日志之前,重新连接备库的次数。事实并非如此,如果你设置了该属性,实际是定义了lgwr尝试重连有故障的备库时,日志组切换的次数(注:原文写的更加让人容易误解,这里的意思就是切换一次日志,重连一次备库)。举例来说,如果将max_failure的值设置成5,那么lgwr将会在它循环切换日志期间对故障备库总共发起5次连接请求,如果切换了5次还是无法连接到故障备库,那么lgwr将放弃重连,之后你要么等手动重新启用它或者等主库重启重新生效该属性。

注意:

不要设置max_failure属性。

noregister    这是我们讨论的log_archive_dest_n参数的最后一个属性。默认情况下,dg要求任何发送到备库的redo数据都需要在归档至磁盘的时候完成对备库的注册。对于一个物理备库来说,意味着数据会被注册到备库的控制文件中;而对于逻辑备库来说,它意味着sql apply会在元数据中注册日志文件。dg不需要这个属性,它可以用在使用downstream特性的streams目标库中。

注意:

不要设置noregister属性。

log_archive_dest_state_n    这是和log_archive_dest_n配套使用的参数。在过去,有两个原因我们需要配置它。一是启用备库中主角色log_archive_dest_n参数的预定义,以使得该参数被启用后归档进程可以使用log_archive_dest_n来工作;另一个原因是配置一个如前面所述的alternate目标。第一个原因已经没有作用了(现在使用了valid_for),并且除非你使用alternate属性,否则第二个原因也不成立了,因为现在这个参数默认就是enable的了,你不再需要为你的目标库设置它了。

复制代码 代码如下:

log_archive_dest_state_1=enable

三、备用角色参数

db_file_name_convert    在备库中,该参数允许你逻辑上将数据文件从主库迁移到备库上,如果你使用的是基于磁盘的存储结构并且存储路径在两个系统上并不相同,那么就有必要配置它。只有在备库切换为主库这期间,该转换才会执行。一旦进行主备切换或者故障切换到备库,这些值就会被写入到控制文件和数据文件头。通过简单的字符替换就可以实现功能。

复制代码 代码如下:

db_file_name_convert=’/matrix/’,’/matrix_dr0/’

上面的命令会将如下数据文件名:


复制代码 代码如下:

‘/u03/oradata/matrix/sysaux.dbf’

转换为:


复制代码 代码如下:

‘/u03/oradata/matrix_dr0/sysaux.dbf’

同理,如下配置会将数据文件指向到+recovery磁盘组中而不是+data;


复制代码 代码如下:

db_file_name_convert=’+data’,’+recovery’

路径的其他部分将保持相同,在本例中,使用了asm来创建备库,你不需要定义这个参数了。

log_file_name_convert    它的功能和db_file_name_convert参数相同,只不过这里转换的是日志文件,包括orl文件和任何srl文件。

复制代码 代码如下:

log_file_name_convert=’/matrix/’,’/matrix_dr0/’


fal_server        fal(fetch archive log)功能相比9ir1时的dg已经有了很大的进步。它只用于物理备库,配置它能够使得物理备库在发现问题时,从dg配置中的一个数据库(主库或备库)中获取缺失的归档日志文件,有时我们又成它为被动间隔处理(reactive gap resolution),不过fal技术在之前的三个版本中得到了极大的增强以至于现在几乎不需要再定义fal参数了。伴随着9ir2版本引入的主动间隔处理(proactive gap resolution)技术的使用,几乎物理或逻辑备库上任何类型的间隔请求都可以由主库上的ping进程来处理了。

在主库的正常工作过程中,归档进程(被指定为ping进程)会轮流查询所有的备库来寻找redo间隔,与此同时处理任何应用进程发来的未解决的间隔请求。当物理备库需要从主库之外的数据库中获得间隔文件时就可以使用fal技术。举个例子,比如物理备库现在需要进行间隔处理,但是主库无法访问,那么它需要去请求其他的备库来完成间隔处理,为此,你要将fal_server参数定义为指向主库或者任意备库的tns标识符列表。如在matrix_dr0库中加入主库(matrix)和其他备库(matrix_dr1):

复制代码 代码如下:

fal_server=’matrix, matrix_dr1′


fal_client    fal客户端就是发起间隔请求的数据库的tns名称,间隔请求的接收方(fal_server)需要这个tns名称以使得fal服务器上的数据库可以反向连接至请求方。在备库matrix_dr0上,我们发送matrix_dr0作为客户端名称以便matrix和matrix_dr1库可以连接回matrix_dr0库发送缺失的归档日志文件。

复制代码 代码如下:

fal_client=’matrix_dr0′

‘matrix_dr0′必须要在fal服务器的tns文件中定义以使得dg能够成功连接备库;因为我们将会在所有这些数据库中设置redo传输参数,所以我们也要为它们配置tns名称。如果你在fal参数中使用相同的tns名称,那么这些tns名称就是定义好的了。如果你选择了一个不同的名称,你就需要在所有系统的tns文件中添加这个名称。和fal_server参数一样,fal_client参数只对物理备库有效。

standby_file_management    这是本章节讨论的最后一个参数了。这个简单的参数只用于物理备库。该参数设置成auto的时候,主库中添加和删除数据文件的同时,备库中也会自动的进行相应的更改。只要备库中顶级目录存在或能够借助于db_

file_name_convert参数找到,那么dg将会执行ddl语句在备库中创建数据文件。它甚至会尽可能的创建缺失的子目录。默认情况下,这个参数的值为manual,这意味着备库上的应用进程不会创建新的数据文件,你需要手动创建它们。

复制代码 代码如下:

standby_file_management=’auto’

只有当需要对物理备库上的orl文件执行定义操作的时候,我们才可能会将该参数设置成manual。srl文件能够在不改这个参数的情况下添加。如果你真要在物理备库上添加或删除在线日志文件(比如因为主库上发生了更改),你也可以将这个参数动态的设置成manual,执行ddl操作,然后再还原成auto值,无需重启备库。

参数与属性小结

在了解上面的所有参数和属性之后,你应该对它们的功能和特性有了深刻的理解并且可以正确的配置使用了。

希望你不要对这些感到头疼,因为有一点你或许会感到诧异:如果你使用data guard broker(即使不用grid control),就没必要亲自配置这些参数了,dg broker会为你做好一切。

end

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐