1.Redo传输服务介绍
Redo传输服务在Oracle Data Guard配置的成员和其他数据库之间进行自动redo数据传输。
Redo传输目标支持Oracle Data Guard备数据库,归档日志库,Oracle Streams下游捕获数据库,Far sync实例和Zero Data Loss Recovery Appliance等。
每个redo传输目标被分别配置成通过以下两种传输模式接收redo数据:
1)同步传输模式,与事务提交同步地传输redo数据。事务不能够提交直到所有事务产生的redo已经成功地发送到每个启用的使用同步传输模式的redo传输目标为止。
虽然在主数据库和SYNC redo传输目标之间没有距离限制,当主数据库和SYNC redo传输目标之间的网络延时增加时,事务提交延时也会增加。
最大安全保护模式和最大可用模式使用这种传输模式。
2)异步传输模式,与事务提交异步地传输redo数据。不用等待事务产生的redo已经成功地发送到任何使用异步传输模式的redo传输目标,事务就可以提交。
最大性能模式使用这种传输模式。
2.Redo传输服务配置
2.1. 配置数据库来发送redo数据
使用LOG_ARCHIVE_DEST_n(n是从1到31的整数)数据库初始化参数来指定redo传输目标。
数据库初始化参数LOG_ARCHIVE_DEST_STATE_n相对应于LOG_ARCHIVE_DEST_n参数,这个参数用来启用或禁用相应的redo目标。
LOG_ARCHIVE_DEST_STATE值 | 描述 |
---|---|
ENABLE | Redo传输服务可以传输redo数据到该目标,缺省值。 |
DEFER | Redo传输服务不传输redo数据到该目标。 |
ALTERNATE | 如果与目标属于同一个组的其他目标通讯失败,将启用此目标。 |
LOG_ARCHIVE_DEST_n初始化参数的属性列表:
属性 | 描述 |
---|---|
SERVICE | 这是redo传输目标的属性列表中必须首先配置的属性。SERVICE属性用来指定连接到redo传输目标的Oracle Net服务名称。服务名称必须 是通过Oracle Net命名方法可以解析成一个匹配redo传输目标上的Oracle Net监听的Oracle NET连接描述符。连接描述符必须指定使用一个专用服务器连接,除非这是redo传输目标的默认的连接类型。 |
SYNC | 指定使用同步redo传输模式来发送redo数据到redo传输目标。 |
ASYNC | 指定使用异步redo传输模式来发送redo数据到redo传输目标。如果没有指定SYNC或ASYNC属性,将会使用异步redo传输模式。 |
NET_TIMEOUT | 指定LGWR进程等待redo数据已经被使用同步redo传输模式的目标成功接收确认的时间。如果确认没有在NET_TIMEOUT指定的时间(秒)内收到,redo传输连接将会中止,并将错误写入日志。Oracle建议不论是否使用同步redo传输模式都设置NET_TIMEOUT属性,这样redo传输错误导致的redo源数据库停顿的最大持续时间才可以被精确地控制。 注:也可以设置数据库初始化参数DATA_GUARD_SYNC_LATENCY,这是针对所有同步传输目标的全局参数,参数定义了主数据库在至少一个同步备数据库确认收到redo之后中断后面的传输目标之前等待的最长时间。 |
AFFIRM/NOAFFIRM | AFFIRM属性指定从源数据库接收的redo在写入备redo日志后才进行确认。NOAFFIRM属性用来指定redo不需要等待接收到的redo写入备redo日志就可以确认。 |
DB_UNIQUE_NAME | 用来指定redo传输目标的DB_UNIQUE_NAME。如果已经定义了LOG_ARCHIVE_CONFIG数据库初始化参数,它的值中包含DG_CONFIG列表,那么必须指定DB_UNIQUE_NAME属性。 |
VALID_FOR | 指定在什么情况下redo传输服务会传输redo数据到一个redo传输目标。Oracle建议为Oracle Data Guard配置中的每个站点的每个redo传输目标设置VALID_FOR属性,这样redo传输服务在角色转换后将继续发送redo数据到所有的备数据库,不管哪个备数据库获得了主数据库角色。 |
REOPE | 指定尝试自动重新连接到一个由于之前的错误而不活动的redo传输目标的最短的时间(秒) |
COMPRESSION | 指定使用压缩格式传输redo数据到一个redo传输目标 |
示例:
DB_UNIQUE_NAME=BOSTON
LOG_ARCHIVE_CONFIG=‘DG_CONFIG=(BOSTON,CHICAGO,HARTFORD)’
LOG_ARCHIVE_DEST_2=‘SERVICE=CHICAGO ASYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILE,
PRIMARY_ROLE) REOPEN=60 COMPRESSION=ENABLE DB_UNIQUE_NAME=CHICAGO’
LOG_ARCHIVE_DEST_STATE_2=‘ENABLE’
LOG_ARCHIVE_DEST_3=‘SERVICE=HARTFORD SYNC AFFIRM NET_TIMEOUT=30
VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) REOPEN=60 COMPRESSION=ENABLE
DB_UNIQUE_NAME=HARTFORD’
LOG_ARCHIVE_DEST_STATE_3=‘ENABLE’
查询视图V$ARCHIVE_DEST来查看每个redo传输目标的当前配置和状态。
col dest_name format a20
col destination format a20
col target format a10
col alternate format a20
col db_unique_name format a15
col dependency format a10
col remote_template format a10
select dest_id,dest_name,status,target,destination,valid_type,valid_now,valid_role,db_unique_name,transmit_mode from v$archive_dest;
DEST_NAME STATUS TARGET DESTINATIO VALID_TYPE VALID_NOW VALID_ROLE DB_UNIQUE TRANSMIT_MOD
-------------------- ------- -------- ---------- --------------- ---------------- ------------ --------- ------------
LOG_ARCHIVE_DEST_1 VALID PRIMARY USE_DB_REC ONLINE_LOGFILE YES ALL_ROLES orcl SYNCHRONOUS
OVERY_FILE
_DEST
LOG_ARCHIVE_DEST_2 VALID STANDBY lxorcl2 ONLINE_LOGFILE YES PRIMARY_ROLE lxorcl2 PARALLELSYNC
LOG_ARCHIVE_DEST_3 VALID STANDBY lxorcl ONLINE_LOGFILE YES PRIMARY_ROLE lxorcl PARALLELSYNC
LOG_ARCHIVE_DEST_4 VALID PRIMARY +RECO/orcl STANDBY_LOGFILE WRONG VALID_ROLE STANDBY_ROLE orcl SYNCHRONOUS
/standby_a
rchivelog
2.2. 配置数据库来接收redo数据
Redo传输目标必须配置来接收和归档来自源数据库的redo数据。
2.2.1. 管理备redo日志
同步和异步redo传输模式要求一个redo传输目标有一个备redo日志。备redo日志用来存储从另外一个数据库接收的redo数据。备redo日志在结构上与redo日志相同,使用与创建和管理redo日志相同的SQL语句来创建和管理。
通过redo传输从其他数据库接收到的redo数据被远程文件服务器(remote file server,RFS)前台进程写到当前备redo日志组。当redo源数据库进行日志切换时,接收到的redo将会写到下一个备redo日志组,之前使用的备redo日志组会被ARCn后台进程进行归档。
Redo源数据库的按顺序进行写入和归档redo日志文件组的过程会在每个redo传输目标上通过按顺序写入和归档备redo日志组的过程来进行镜像。
每个备日志文件的大小必须至少与redo源数据库的最大的redo日志文件一样大,为了管理方便,Oracle建议redo源数据库的所有redo日志文件与redo传输目标的的备redo日志文件的大小保持一致。
**对于redo源数据库的每个redo线程,备redo日志必须至少比redo源数据库的redo日志多包含一个redo日志组。**在redo源数据库上,查询视图V$LOG来确认redo源数据库含有几个redo日志组,然后查询视图V$THREAD来确认redo源数据库含有几个redo线程。
SQL> SELECT GROUP#, BYTES FROM V$LOG;
在redo目标数据库上确认备redo日志组的数量和文件大小:
SQL> SELECT GROUP#, BYTES FROM V$STANDBY_LOG;
非RAC环境增加备日志文件:
SQL> ALTER DATABASE ADD STANDBY LOGFILE(‘+DATA/ORCL/STANDBYLOG/SLOG1.redo’, ‘+RECO/ORCL/STANDBYLOG/SLOG1.redo’) SIZE 128M;
SQL> SELECT GROUP#, BYTES/1024/1024 M FROM V$STANDBY_LOG;
RAC环境增加备日志文件:
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 5 (‘+DATA/ORCL/STANDBYLOG/SLOG11.redo’,‘+RECO/ORCL/STANDBYLOG/SLOG12.redo’) SIZE 200M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 GROUP 6 (‘+DATA/ORCL/STANDBYLOG/SLOG21.redo’,‘+RECO/ORCL/STANDBYLOG/SLOG22.redo’) SIZE 200M;
查看备日志信息
SQL> SELECT group#,sequence#,thread#,archived,status FROM V$STANDBY_LOG;
GROUP# SEQUENCE# THREAD# ARC STATUS
---------- ---------- ---------- --- ----------
5 68 1 YES ACTIVE
6 0 1 NO UNASSIGNED
7 0 2 YES UNASSIGNED
8 0 2 YES UNASSIGNED
9 0 1 YES UNASSIGNED
10 0 2 YES UNASSIGNED
2.2.2. redo直接写入归档redo日志文件的情况
如果备redo日志组不存在或者发送redo来解决redo gap,在备数据库上接收到的redo数据将会直接写入到归档日志文件。当发生这种情况时,redo会写入参数LOG_ARCHIVE_DEST_n的属性LOCATION定义的位置。
3. 验证配置
查询V$DATAGUARD_CONFIG视图来验证Oracle Data Guard配置。
SQL> col db_unique_name format a15
SQL> col parent_dbun format a15
SQL> select * from v$DATAGUARD_CONFIG;
DB_UNIQUE PARENT_DBUN DEST_ROLE CURRENT_SCN CON_ID
--------- ------------------------------ ----------------- ----------- ----------
orcl NONE PRIMARY DATABASE 102113946 0
lxorcl2 orcl LOGICAL STANDBY 102113913 0
lxorcl orcl PHYSICAL STANDBY 102113919 0
4. 监控redo传输服务
4.1. 监控redo传输状态
在redo源数据库上执行以下步骤来监控redo传输状态:
1)确认每个线程最近的归档序号
SQL> SELECT MAX(SEQUENCE#), THREAD# FROM V$ARCHIVED_LOG WHERE RESETLOGS_CHANGE# = (SELECT MAX(RESETLOGS_CHANGE#) FROM V$ARCHIVED_LOG ) GROUP BY THREAD#;
MAX(SEQUENCE#) THREAD#
-------------- ----------
625 1
612 2
2)确认每个redo传输目标最近的归档redo日志文件
SQL> SELECT DESTINATION, STATUS, ARCHIVED_THREAD#, ARCHIVED_SEQ# FROM V$ARCHIVE_DEST_STATUS WHERE STATUS <> ‘DEFERRED’ AND STATUS <> ‘INACTIVE’;
DESTINATION STATUS ARCHIVED_THREAD# ARCHIVED_SEQ#
------------------------------ ------- ---------------- -------------
VALID 1 625
lxorcl2 VALID 2 4
lxorcl VALID 2 612
+RECO/orcl/standby_archivelog VALID 1 625
3) 检查redo传输目标是否已经接收到归档redo日志文件。每个目标都有一个关联的ID号,可以查询V$ARCHIVE_DEST视图来鉴别每个目标的ID号。以下假设目标1指向本地归档redo日志,目标2指向redo传输目标。执行以下查询来确认redo传输目标是否遗失日志文件:
SQL> SELECT LOCAL.THREAD#, LOCAL.SEQUENCE# FROM
(SELECT THREAD#, SEQUENCE# FROM V$ARCHIVED_LOG WHERE DEST_ID=1)
LOCAL WHERE LOCAL.SEQUENCE# NOT IN
(SELECT SEQUENCE# FROM V$ARCHIVED_LOG WHERE DEST_ID=2 AND THREAD# = LOCAL.THREAD#);
4) 设置redo源数据库和redo传输目标的LOG_ARCHIVE_TRACE数据库初始化参数来跟踪redo传输过程。
4.2. 监控redo同步传输响应时间
视图V$REDO_DEST_RESP_HISTOGRAM包含了每个redo传输目标的响应时间。
每个传输目标的数据包含一序列的行,每行代表一个响应时间。为了简化记录保存,响应时间在300秒以内会取整为秒,大于300秒的响应时间分类为600,1200,2400,4800或9600秒。
每行包含4列:FREQUENCY, DURATION, DEST_ID和TIME。
FREQUENCY列,包含某个特定的响应时间观察到的次数。
DURATION列,对应响应时间。
DEST_ID列,用于区别传输目标。
TIME列,包含上次行更新的时间戳。
列出传输目标2的响应时间:
SQL> SELECT FREQUENCY, DURATION FROM V$REDO_DEST_RESP_HISTOGRAM WHERE DEST_ID=2 AND FREQUENCY>1;
列出传输目标2的最慢响应时间:
SQL> SELECT max(DURATION) FROM V$REDO_DEST_RESP_HISTOGRAM WHERE DEST_ID=2 AND FREQUENCY>1;
列出传输目标2的最快响应时间:
SQL> SELECT min(DURATION) FROM V$REDO_DEST_RESP_HISTOGRAM WHERE DEST_ID=2 AND FREQUENCY>1;
注:传输目标最长的观察响应时间不能超过NET_TIMEOUT参数定义的最大值,因为如果redo传输目标在NET_TIMEOUT定义的时间内没有响应redo传输信息,redo同步传输模式会话将会被中止。
4.3. 发现和解决redo gap
redo传输中断时会产生redo gap,当redo传输恢复时,redo传输服务自动检测redo gap,发送缺失的redo数据到传输目标来解决redo gap。
解决redo gap需要的时间直接与redo gap的大小成正比,与redo源数据库和redo传输目标之间的网络带宽成反比。可以使用redo传输压缩(参数LOG_ARCHIVE_DEST_n的COMPRESSION属性)来减少redo gap的处理时间。
4.3.1.手工处理redo gap
在某些不能自动执行redo gap处理的情况中,需要手工处理。例如,当主数据库不可使用时,逻辑备数据库上的redo gap需要手工处理。
4.3.1.1. 物理备数据库手工处理redo gap
在物理备数据库上执行以下查询来确认是当前是否存在阻塞Redo Apply的redo gap:
SQL> select * from v$archive_gap;
THREAD# LOW_SEQUENCE# HIGH_SEQUENCE#
----------- ------------- --------------
1 7 10
上面的示例中,物理备数据库目前缺失线程1的从序列7到序列10的日志文件。
在主数据库上执行以下查询来定位归档redo日志文件:
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 10;
NAME
------------------------------------------------------
/primary/thread1_dest/arcr_1_7.arc
/primary/thread1_dest/arcr_1_8.arc
/primary/thread1_dest/arcr_1_9.arc
将这些日志文件复制到物理备数据库,然后进行注册。
SQL> ALTER DATABASE REGISTER LOGFILE ‘/physical_standby1/thread1_dest/arcr_1_7.arc’;
SQL> ALTER DATABASE REGISTER LOGFILE ‘/physical_standby1/thread1_dest/arcr_1_8.arc’;
SQL> ALTER DATABASE REGISTER LOGFILE ‘/physical_standby1/thread1_dest/arcr_1_9.arc’;
4.3.1.2. 逻辑备数据库手工处理redo gap
在逻辑备数据库上查询视图DBA_LOGSTDBY_LOG来确认当前是否存在阻塞SQL Apply的redo gap。
在下面的示例中,线程1显示了2个文件,因此归档redo日志文件的序列存在gap(如果不存在gap,每个线程只显示1个文件)。
SQL> COLUMN FILE_NAME FORMAT a55
SQL> SELECT THREAD#, SEQUENCE#, FILE_NAME FROM DBA_LOGSTDBY_LOG L WHERE NEXT_CHANGE# NOT IN (SELECT FIRST_CHANGE# FROM DBA_LOGSTDBY_LOG WHERE L.THREAD# = THREAD#) ORDER BY THREAD#, SEQUENCE#;
THREAD# SEQUENCE# FILE_NAME
---------- ---------- -----------------------------------------------
1 6 /disk1/oracle/dbs/log-1292880008_6.arc
1 10 /disk1/oracle/dbs/log-1292880008_10.arc
复制缺失的日志文件(序列7,8和9)到逻辑备数据库,然后进行注册。
SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE ‘/disk1/oracle/dbs/log-1292880008_7.arc’;
SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE ‘/disk1/oracle/dbs/log-1292880008_8.arc’;
SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE ‘/disk1/oracle/dbs/log-1292880008_9.arc’;
4.4. redo传输服务等待事件
可以使用Oracle等待事件在redo源数据库上跟踪redo传输等待时间。下表列出V$SYSTEM_EVENT动态性能视图的几个等待事件:
等待事件 | 描述 |
---|---|
LNS wait on ATTACH | 等待创建到所有ASYNC和SYNC redo传输目标的redo传输会话花费的总时间 |
LNS wait on SENDREQ | 等待redo数据写到所有ASYNC和SYNC redo传输目标花费的总时间 |
LNS wait on DETACH | 等待中止到所有ASYNC和SYNC redo传输目标的redo传输连接花费的总时间 |
4.5. 调整redo传输
Data Guard会自动调整redo传输来优化性能。然而,如果你想更好地控制参数,可以调整redo传输使用的以下方面:
1) 网络配置
2) 存储配置
3) 快速恢复区域
4) redo 传输配置
来源:《Oracle Data Guard Concepts and Administration, 19c》