暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

OGG 12.3集成抽取模式归档丢失ORA-01291处理

原创 你好我是李白 2022-05-07
3802

本文章不讨论归档可恢复情况,讨论归档已经完全丢失,无法找回的情况下,恢复集成模式OGG Extract抽取的情况。

通过本文你可以获取如下信息:

  1. 集成模式抽取本身为什么无法跳过归档。
  2. 集成模式抽取跳过归档可以采用的两种办法。
  3. 避免集成模式抽取归档丢失无法跳过可以采用的方法。

1. 模拟归档丢失

由于本文档基于测试环境,所以需要模拟归档丢失,如果维护的OGG归档已经丢失,报错ORA-01291: missing logfile,且归档无法恢复,则直接跳转到第二章查看本文档即可。

1.1 停止extract

GGSCI (single as ogg@honor1) 55> stop ex_re Sending STOP request to EXTRACT EX_RE ... Request processed. GGSCI (single as ogg@honor1) 56> info ex_re EXTRACT EX_RE Last Started 2022-05-06 23:08 Status STOPPED Checkpoint Lag unknown (updated 00:00:54 ago) Log Read Checkpoint Oracle Integrated Redo Logs 2022-05-07 10:31:31 SCN 5.15113672 (21489950152)

1.2 切几次归档并模拟删除extract捕获需要归档日志

# 切换几次归档日志 SYS@honor1 > alter system archive log current; System altered. SYS@honor1 > / System altered. SYS@honor1 > / System altered. # 根据上述SCN查询当前捕获所在的Oracle Redo Log sequence# SYS@honor1 > SELECT THREAD#, SEQUENCE#, NAME, FIRST_CHANGE#, NEXT_CHANGE#, STATUS 2 FROM V$ARCHIVED_LOG 3 WHERE FIRST_CHANGE# <= 21489950152 4 AND NEXT_CHANGE# >= 21489950152 5 AND STATUS = 'A'; THREAD# SEQUENCE# NAME FIRST_CHANGE# NEXT_CHANGE# STATUS ------- --------- ---------------------------------------- ---------------- ---------------- ---------- 1 377 +FRADG/honor/archivelog/2022_05_07/threa 21489950070 21489950244 A d_1_seq_377.390.1104057109 # 删除归档,由于Integrated Capture需要该归档,所以不加force无法删除,删除连续三个归档,确保extract丢失需要的归档文件 RMAN> delete force noprompt archivelog sequence 377 thread 1; RMAN> delete force noprompt archivelog sequence 378 thread 1; RMAN> delete force noprompt archivelog sequence 379 thread 1;

1.3 启动extract,查看报错

GGSCI (single as ogg@honor1) 50> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING EXTRACT STOPPED EX_RE unknown 00:14:18 GGSCI (single as ogg@honor1) 51> start ex_re Sending START request to MANAGER ... EXTRACT EX_RE starting # tail -200f ggserr.log 2022-05-06T23:16:24.066+0800 ERROR OGG-00868 Oracle GoldenGate Capture for Oracle, ex_re.prm: Error code 1291, error message: ORA-01291: missing logfile (Missing Log File WAITING FOR DICTIONARY REDO. Read Position SCN: 5.15113672 (21489950152)). 2022-05-06T23:16:24.066+0800 ERROR OGG-01668 Oracle GoldenGate Capture for Oracle, ex_re.prm: PROCESS ABENDING. # 通过查询删除状态归档日志,确定被删除归档的sequence# SYS@honor1 > SELECT THREAD#, SEQUENCE#, NAME, FIRST_CHANGE#, NEXT_CHANGE#, STATUS 2 FROM V$ARCHIVED_LOG 3 WHERE FIRST_CHANGE# <= 21489950152 4 AND NEXT_CHANGE# >= 21489950152 5 AND STATUS = 'D'; THREAD# SEQUENCE# NAME FIRST_CHANGE# NEXT_CHANGE# STATUS ------- --------- ---------------------------------------- ---------------- ---------------- ---------- 1 377 21489950070 21489950244 D

2. 集成模式跳过归档

集成模式不同于经典模式,集成模式对于跳过归档有限制,所以当集成模式丢失归档时,如果没有事先定期重新build logmnr dictionary,则无法在不切换模式情况下跳过归档,集成模式跳过归档有如下前提条件:

  1. 如果是新register的extract,则register extract到当前redo log之间不能有归档断档,所以即使要跳过的归档也必须存在。
  2. 如果是运行了很久的extract,需要跳过归档的前提是当前捕获的SCN之后所有归档必须物理存在。

综上:如果集成模式跳过归档,在生产环境如果不切换为经典模式情况下,基本不可能实现,所以我们通过如下两种方式可以换个方式在丢失归档情况下,集成模式抽取实现跳过归档。

2.1 查看register extract时归档日志

# 由于一般情况下,生产环境删除归档一般是归档日志所在空间无法保留太多需要删除,所以register extract时的归档日志肯定不复存在。 # 集成模式重新register extract以及add extract..scn或alter extract...scn需要保证register时dictionary存在的归档到指定的scn之间归档连续,不能断档,才可以在register时到当前redo之间任意选取scn开始抽取,只要有断档,将无法继续 # 下面测试环境由于我只删除了extract捕获所在位置的三个归档文件,所以register时所在归档还存在,这点需要注意。 SYS@honor1 > SELECT thread#,sequence#,first_change#,status FROM v$archived_log 3 WHERE dictionary_begin = 'YES' AND 4 standby_dest = 'NO' AND 5 name IS NOT NULL AND 6 status = 'A'; THREAD# SEQUENCE# FIRST_CHANGE# STATUS ------- --------- ---------------- ---------- 1 359 21489879344 A # 上面status为A代表Available,一般环境中该状态均为D,即归档已经被删掉,这是可预期的。

2.2 查询当前存在的归档日志

SYS@honor1 > SELECT thread#,sequence#,first_change#,status 2 FROM v$archived_log 3 WHERE dest_id = 1 AND 4 name IS NOT NULL AND 5 status = 'A' AND 6 sequence# > 377; THREAD# SEQUENCE# FIRST_CHANGE# STATUS ------- --------- ---------------- ---------- 1 380 21489950257 A 1 381 21489950264 A 1 382 21489950268 A 1 383 21489950274 A 1 384 21489950278 A 1 385 21489950285 A 1 386 21489950290 A 1 387 21489950296 A 1 388 21489950301 A 1 389 21489950306 A 1 390 21489950313 A 1 391 21489950318 A 1 392 21489966190 A

2.3 重新建立logmnr dictionary

集成模式如果想从任意时间抽取或跳过任意归档,需要logmnr dictionary建立时所在归档的first_scn到当前scn之间不能有归档断档,才能跳过这两个scn之间任意的归档。

建立logmnr dictionary两种方法:

  1. register extract会自动建立。
  2. DBMS_LOGMNR_D.BUILD

2.3.1 重新register方式说明

# 1. register extract,默认不指定scn时,会自动从发出register extract时所在scn建立logmnr dictionary并为extract capture注册,如果指定scn的话,需要与下面SQL语句查出的logmnr dictionary所在归档的first_scn一致,不能随便指定scn。 SELECT first_change# FROM v$archived_log WHERE dictionary_begin = 'YES' AND standby_dest = 'NO' AND name IS NOT NULL AND status = 'A'; SYS@honor1 > SELECT thread#,sequence#,first_change#,status 2 FROM v$archived_log 3 WHERE dictionary_begin = 'YES' AND 4 standby_dest = 'NO' AND 5 name IS NOT NULL AND 6 status = 'A'; THREAD# SEQUENCE# FIRST_CHANGE# STATUS ------- --------- ---------------- ---------- 1 359 21489879344 A # 重新register需要建立在logmnr dictionary所在的redo log到当前redo log不能有断档,而我们一般不会设定定时任务执行unregister/register建立logmnr dictionary,所以我们的logmnr dictionary一般只有最开始register extract的建立的,而最开始建立的logmnr dictionary所在的归档日志早已随着清理空间或备份而被删除而发生归档断档,一旦发生断档,则集成模式将无法跳过logmnr dictionary建立时的first_scn到当前scn之间任何归档。 # 我们测试环境中看到下面其实是有断档的,所以我们重新register再alter extract或add extract指定scn跳过特定归档方式无法实现,所以集成模式中,重新register无法进行。 SYS@honor1 > SELECT thread#,sequence#,first_change#,status FROM v$archived_log WHERE dest_id = 1 AND name IS NOT NULL AND 5 status = 'A'; THREAD# SEQUENCE# FIRST_CHANGE# STATUS ------- --------- ---------------- ---------- 1 352 21489872002 A .. 1 369 21489935694 A # 后面丢失了370 1 371 21489949150 A .. 1 376 21489950049 A # 后面丢失了377,378,379 1 380 21489950257 A ..

2.3.2 手工创建logmnr dictionary说明

# 1. 手工提前创建dictionary,使用下面命令 # 手工建立logmnr dictionary之后,即可从logmnr dictionary所在redo的first_scn开始重新register extract,重新开始抽取。 SQL> execute DBMS_LOGMNR_D.BUILD( options => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS); SQL> SELECT first_change# FROM v$archived_log WHERE dictionary_begin = 'YES' AND standby_dest = 'NO' AND name IS NOT NULL AND status = 'A'; THREAD# SEQUENCE# FIRST_CHANGE# STATUS ------- --------- ---------------- ---------- 1 359 21489879344 A 1 398 21489984293 A

2.4 重新register,添加extract恢复

通过上述几个小节可以看出,集成模式如果想跳过归档,在不切换为经典模式情况下,几乎不可能实现,所以只能通过下面方式,重新register,重新添加extract。

# register extract会收集logmnr一些基表统计信息,会造成数据库压力,需要谨慎 alert日志如下: LOGMINER: Gathering statistics on logminer dictionary. (107) # 集成模式register时如果指定scn,则必须为1.6.2小节中查询出来存在logmnr dictionary的归档的first_scn,不能任意指定,如果不指定scn,则会自动在当前redo中建立logmnr dictionary GGSCI (single as ogg@honor1) 104> register extract ex_re database scn 21489984293 2022-05-07 00:54:49 INFO OGG-02003 Extract EX_RE successfully registered with database at SCN 21489984293. # 集成模式添加时如果指定scn,则必须为上面register的scn之后的到当前归档的任意scn,从register到extract指定的scn中间不能存在归档日志断档,否则无法正常抽取,这点一定要注意,如果后续创建replicat比较缓慢,可以在register之后,直接开始抽取,抽取尽量早点抽取,否则一旦register之后,未开始抽取,而中间归档日志删除无法恢复,则需要再次重新register或build logmnr dictionary,重新开始配置抽取,否则无法正常抽取。 GGSCI (single as ogg@honor1) 105> add extract ex_re integrated tranlog scn 21489984293 EXTRACT (Integrated) added. GGSCI (single as ogg@honor1) 106> add exttrail ./dirdat/ex,extract ex_re,megabytes 100 EXTTRAIL added. GGSCI (single as ogg@honor1) 107> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING EXTRACT STOPPED EX_RE 00:00:00 00:00:27 GGSCI (single as ogg@honor1) 108> start ex_re Sending START request to MANAGER ... EXTRACT EX_RE starting GGSCI (single as ogg@honor1) 109> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING EXTRACT RUNNING EX_RE 00:00:00 00:01:03 GGSCI (single as ogg@honor1) 111> info ex_re EXTRACT EX_RE Initialized 2022-05-07 00:55 Status RUNNING Checkpoint Lag 00:00:00 (updated 00:01:07 ago) Process ID 50669 Log Read Checkpoint Oracle Integrated Redo Logs First Record SCN 5.15147813 (21489984293) GGSCI (single as ogg@honor1) 122> send ex_re,status Sending STATUS request to EXTRACT EX_RE ... EXTRACT EX_RE (PID 50669) Current status: Recovery complete: Processing data Current read position: Redo thread #: 1 Sequence #: 402 RBA: 20295304 Timestamp: 2022-05-07 12:09:39.000000 SCN: 5.15176900 (21490013380) Current write position: Sequence #: 8 RBA: 1444 Timestamp: 2022-05-07 00:57:47.920815 Extract Trail: ./dirdat/ex # 可以看到已经恢复正常 # extract参数设置 extract ex_re setenv (NLS_LANG="AMERICAN_AMERICA.AL32UTF8") USERIDALIAS oggsrc exttrail ./dirdat/ex GETUPDATEBEFORES GETTRUNCATES DDL & INCLUDE MAPPED OBJTYPE 'TABLE' & INCLUDE MAPPED OBJTYPE 'INDEX' & INCLUDE MAPPED OBJTYPE 'SEQUENCE' & INCLUDE MAPPED OBJTYPE 'VIEW' & INCLUDE MAPPED OBJTYPE 'PROCEDURE' & INCLUDE MAPPED OBJTYPE 'FUNCTION' & INCLUDE MAPPED OBJTYPE 'PACKAGE' & INCLUDE MAPPED OBJTYPE 'MATERIALIZED VIEW' & EXCLUDE OPTYPE COMMENT DDLOPTIONS ADDTRANDATA REPORT BR BRINTERVAL 2H CACHEMGR CACHESIZE 500MB WARNLONGTRANS 2H,CHECKINTERVAL 5M NUMFILES 4000 EOFDELAYCSECS 10 LOGALLSUPCOLS TRANLOGOPTIONS INTEGRATEDPARAMS (parallelism 1) discardfile ./dirrpt/ex_re.dsc,append, megabytes 200 TABLE hr.*;

2. 切换经典模式跳过归档

可以利用经典模式可以指定scn,将集成模式抽取切换为经典模式后,从指定位置开始重新抽取即可。

2.1 模拟丢失归档

GGSCI (single as ogg@honor1) 130> stop ex_re Sending STOP request to EXTRACT EX_RE ... Request processed. SYS@honor1 > alter system archive log current; RMAN> delete force archivelog all; GGSCI (single as ogg@honor1) 134> start ex_re Sending START request to MANAGER ... EXTRACT EX_RE starting # ggserr.log报错 2022-05-07T03:56:23.254+0800 ERROR OGG-00868 Oracle GoldenGate Capture for Oracle, ex_re.prm: Error code 1291, error message: ORA-01291: missing logfile (Missing Log File WAITING FOR DICTIONARY REDO. Read Position SCN: 5.15223324 (21490059804)). 2022-05-07T03:56:23.254+0800 ERROR OGG-01668 Oracle GoldenGate Capture for Oracle, ex_re.prm: PROCESS ABENDING.

2.2 切换为经典模式

GGSCI (single) 135> info all Program Status Group Lag at Chkpt Time Since Chkpt MANAGER RUNNING EXTRACT STOPPED EX_RE unknown 00:18:53 GGSCI (single) 136> info extract ex_re downgrade Extract EX_RE is ready to be downgraded from integrated capture. Archive logs corresponding to SCN 21490028815 and higher must be accessible by the downgraded extract. GGSCI (single) 137> dblogin useridalias oggsrc Successfully logged into database. # 如果为RAC环境,则需要指定后面threads n。 GGSCI (single as ogg@honor1) 77> ALTER EXTRACT ex_re, DOWNGRADE INTEGRATED TRANLOG [THREADS 2] Extract EX_RE successfully downgraded from integrated capture. GGSCI (single as ogg@honor1) 79> unregister extract ex_re database 2022-05-07 04:11:41 INFO OGG-01750 Successfully unregistered EXTRACT EX_RE from database.

2.3 注释掉集成模式参数

# 下面参数可根据自己需要添加classic模式参数 # TRANLOGOPTIONS DBLOGREADER由于使用异地抽取方式,所以需要添加该参数才能正确读取到归档日志 GGSCI (single) 126> view param ex_re extract ex_re setenv (NLS_LANG="AMERICAN_AMERICA.AL32UTF8") USERIDALIAS oggsrc exttrail ./dirdat/ex GETUPDATEBEFORES GETTRUNCATES TRANLOGOPTIONS DBLOGREADER --DDL & --INCLUDE MAPPED OBJTYPE 'TABLE' & --INCLUDE MAPPED OBJTYPE 'INDEX' & --INCLUDE MAPPED OBJTYPE 'SEQUENCE' & --INCLUDE MAPPED OBJTYPE 'VIEW' & --INCLUDE MAPPED OBJTYPE 'PROCEDURE' & --INCLUDE MAPPED OBJTYPE 'FUNCTION' & --INCLUDE MAPPED OBJTYPE 'PACKAGE' & --INCLUDE MAPPED OBJTYPE 'MATERIALIZED VIEW' & --EXCLUDE OPTYPE COMMENT --DDLOPTIONS ADDTRANDATA REPORT BR BRINTERVAL 2H CACHEMGR CACHESIZE 500MB WARNLONGTRANS 2H,CHECKINTERVAL 5M NUMFILES 4000 EOFDELAYCSECS 10 LOGALLSUPCOLS --TRANLOGOPTIONS INTEGRATEDPARAMS (parallelism 1) discardfile ./dirrpt/ex_re.dsc,append, megabytes 200 TABLE hr.*;

2.3 从现存归档开始抽取

从现有归档开始抽取或重新添加extract从现存归档开始即可

# 1. 从指定位置开始 SYS@honor1 > SELECT thread#,sequence#,first_change#,status 2 FROM v$archived_log 3 WHERE standby_dest = 'NO' AND 4 name IS NOT NULL AND 5 status = 'A'; THREAD# SEQUENCE# FIRST_CHANGE# STATUS ------- --------- ---------------- ---------- 1 450 21490059909 A 1 451 21490065208 A 1 452 21490065214 A 1 453 21490065219 A GGSCI (single as ogg@honor1) 84> alter extract ex_re,scn 21490059909 EXTRACT altered. GGSCI (single as ogg@honor1) 86> start ex_re Sending START request to MANAGER ... EXTRACT EX_RE starting # 2. 第二种方法:重新添加classic extract GGSCI (single) 92> dblogin useridalias oggsrc GGSCI (single as ogg@honor1) 92> delete extract ex_re Deleted EXTRACT EX_RE. GGSCI (single as ogg@honor1) 96> add extract ex_re tranlog scn 21490059909 EXTRACT added. GGSCI (single as ogg@honor1) 98> add exttrail ./dirdat/ex,extract ex_re,megabytes 100 EXTTRAIL added. GGSCI (single as ogg@honor1) 99> start ex_re GGSCI (single as ogg@honor1) 100 > info ex_re EXTRACT EX_RE Last Started 2022-05-07 04:22 Status RUNNING Checkpoint Lag unknown (updated 00:00:02 ago) Process ID 59633 Log Read Checkpoint Oracle Redo Logs 2022-05-07 15:18:27 Seqno 454, RBA 625168 SCN 5.15229664 (21490066144) # 后续如有需要,切换回集成模式即可。

3. 下游进程以后后续数据处理

  1. 抽取启动之后可以rollover,生成新的trail文件。
  2. 修改投递extract pump进程从新文件开始投递。
  3. 修改应用replicat进程从新文件开始应用。
  4. 后续数据比对可以通过OGG Veridata工具进行比对修复。
  5. 如果断档数据量较大,可以重新初始化。

4. 集成模式任意跳过归档的方法

可以设置每日定时任务,在删除归档后立即执行下面语句,即可最大化跳过丢失归档,在不切换模式情况下重新register extract,跳过丢失归档,从现有归档重新抽取:

SQL> execute DBMS_LOGMNR_D.BUILD( options => DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
最后修改时间:2022-06-13 17:28:42
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论