OGG問題 ORA-01403的處理辦法

 

認識logdump分析工具及經常使用命令:http://book.51cto.com/art/201202/319253.htm html

http://www.killdb.com/2012/09/01/goldengate-%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%974-logdump.html session

在OGG中,報ORA-01403: no data found,緣由通常就是源端要插入、更新一條數據,目標端已經存在,或者源端要刪除一條數據,目標端已經刪除了。目標端就會報錯,而後掛掉。通常咱們處理,就是先肯定是那些數據的問題,若是數量少,在目標端刪除或者增長這條數據便可,要是設計數量比較多,就跳過這一段的日誌應用(好比對一張表進行10條插入或刪除)直接進行下一段的應用。若是你沒法判斷該跳過多少日誌,或者嫌麻煩,就直接進行單表的初始化。 oracle

下面進行一個簡單的跳過日誌的實驗。 app

源端配置: 工具

GGSCI (db1) 6> info all 測試

Program Status Group Lag at Chkpt Time Since Chkpt ui

MANAGER RUNNING 設計

EXTRACT RUNNING EXTFPZX 00:00:00 00:00:03 日誌

GGSCI (db1) 7> view params EXTFPZX orm

extract extfpzx

userid ogg,password ogg

rmthost 192.168.25.101,mgrport 7809

rmttrail /u01/goldengate/dirdat/fp

ddl include mapped objname db_fpzx.*;

table db_fpzx.liuliu;

table db_fpzx.eee;

table db_fpzx.eee1;

GGSCI (db1) 8>

目標端配置:

GGSCI (db2) 4> info all

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING

REPLICAT RUNNING REPFPZX 00:00:00 00:00:00

GGSCI (db2) 5> view params repfpzx

REPLICAT repfpzx

USERID ogg,PASSWORD ogg

discardfile /u01/goldengate/discard/rep2_discard.dsc, append, megabytes 10

DDL INCLUDE MAPPED

DDLERROR DEFAULT IGNORE RETRYOP

ASSUMETARGETDEFS

map db_fpzx.liuliu, target db_fpzx.liuliu;

map db_fpzx.eee, target db_fpzx.eee;

map db_fpzx.eee1, target db_fpzx.eee1;

mapexclude db_fpzx.liu123,TABLEEXCLUDE db_fpzx.liu123;

GGSCI (db2) 6>

(很差意思,作測試的OGG,配置比較簡陋,嘿嘿。)

從配置能夠看出同步的幾張表,咱們就用liuliu這張表作實驗。

源端和目標端數據同樣:

clip_image002

在目標端刪除一條數據:

clip_image004

源端和目標端執行info all ,主程序和子程序都是正常的。沒有問題。

下面咱們在源端刪除id爲2的數據:

clip_image006

此時兩邊再次執行info all ,查詢狀態:

源端是沒有問題的,可是目標端變爲 ABENDED :

GGSCI (db2) 8> info all

Program Status Group Lag at Chkpt Time Since Chkpt

MANAGER RUNNING

REPLICAT ABENDED REPFPZX 00:00:04 00:00:35

下面是問題分析及處理過程

首先得查詢兩端的配置(我已經貼出)肯定錯誤日誌文件是

/u01/goldengate/discard/rep2_discard.dsc

進入到此目錄,查看日誌

[oracle@db2 discard]$ pwd

/u01/goldengate/discard

[oracle@db2 discard]$ more rep2_discard.dsc

Oracle GoldenGate Delivery for Oracle process started, group REPFPZX discard file opened: 2016-11-25 15:40:10

Current time: 2016-11-25 15:51:40

Discarded record from action ABEND on error 1403

OCI Error ORA-01403: no data found, SQL <DELETE FROM "DB_FPZX"."LIULIU" WHERE "ID" = :b0>

Aborting transaction on /u01/goldengate/dirdat/fp beginning at seqno 6 rba 1259

error at seqno 6 rba 1259

Problem replicating DB_FPZX.LIULIU to DB_FPZX.LIULIU

Record not found

Mapping problem with delete record (target format)...

*

ID = 2

*

Process Abending : 2016-11-25 15:51:40

日誌很清楚地指出了在刪除DB_FPZX.LIULIU表中ID爲2的數據的時候,出了錯「ORA-01403: no data found」,此時應該去查查目標庫中此數據是否被刪除了(我這裏固然是刪除了)

咱們再往源端添加幾條數據:

clip_image008

不用多說。目標庫中確定是沒有這些數的,由於已經ABENDED了。

下面分析dump文件:

目標端

GGSCI (db2) 10> info repfpzx

REPLICAT REPFPZX Last Started 2016-11-25 15:40 Status ABENDED

Checkpoint Lag 00:00:04 (updated 00:17:23 ago)

Log Read Checkpoint File /u01/goldengate/dirdat/fp000006

2016-11-25 15:51:36.385195 RBA 1259

查詢顯示repfpzx此時用的文件是/dirdat/fp000006,我們就用logdump工具打開這個文件看看

[oracle@db2 goldengate]$ ./logdump

Oracle GoldenGate Log File Dump Utility for Oracle

Version 11.2.1.0.1 OGGCORE_11.2.1.0.1_PLATFORMS_120423.0230

Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.

Logdump 36 >open ./dirdat/fp000006

Current LogTrail is /u01/goldengate/dirdat/fp000006

Logdump 37 >count

LogTrail /u01/goldengate/dirdat/fp000006 has 9 records

Total Data Bytes 1347

Avg Bytes/Record 149

Delete 1

Insert 6

RestartOK 1

Others 1

Before Images 1

After Images 7

Average of 5 Transactions

Bytes/Trans ..... 355

Records/Trans ... 1

Files/Trans ..... 1

Count命令顯示信息。因爲這個文件操做比較少,能夠看見裏面的記錄包括一次刪除,6次插入。一次刪除就是刪除id爲2的記錄。6次插入就是我除了插入2,3,4,5,6之外還有一次插入(我以前插入id爲2的記錄)。固然了,這些數據沒啥用,時間久了這裏面的delete和insert計數太多了,根本不可能也不必去搞清楚都是誰。

下面我們看細節:

Logdump 38 >pos 1259 ----pos + RBA號,直接跳到這個記錄上,這裏爲何跳到1259呢?由於info repfpzx 命令查詢出來的結果告訴咱們,1259是他當前正在處理的事務。

Reading forward from RBA 1259

Logdump 39 >sfh ----尋找此號碼以後,最近的一個有效記錄。N表示next,下一條事務。

clip_image010

下面進行看圖講故事環節:

紅色橫線標註的,是此事務進行的操做

黃色橫線標註的,是此事務的BRA,因而可知,BRA並非每一個都+1的,而是跳着的!

紅色箭頭標註的,還用我說嗎?就是關鍵數據啊2,3,4,不都是ID嘛!

因而可知,RBA爲1259的事務是個刪除操做,它涉及到的是db_fpzx.liuliu表中id爲2的數據。和咱們看dsc文件是同樣的結果。(廢話~~~)

注:關於logdump工具的一些關鍵命令:

Pos 跳到某一個RBA,這個RBA不須要必定存在,須要配合sfh使用

Sfh 跳到當前RBA的下一個有效RBA

pos eof 跳到文件末尾

Pos reverse 反向讀取

咱們目標端數據既然已經刪除此數據了,咱們就須要跳過1259,直接從1383開始恢復就能夠了。

(另外一種就是手工添加這條數據,啓動進程,日誌天然會刪除它,而後就進行到下一步了)

命令是:

Alter replicat repfpzx(進程名),extrba 1383

執行完以後,進程會變爲STOPPED狀態,start它就好了。

PS:我原本覺得在執行以上命令以前,先往目標庫中插入ID爲4的數據,OGG會把我在源庫中插入的

insert into liuliu (id,name,www) values (2,'liu','liuliu222');

insert into liuliu (id,name,www) values (3,'liu','liuliu333');

先「復原」到目標庫,而後在

insert into liuliu (id,name,www) values (4,'liu','liuliu444');

這一句上再次ABENDED,而後此時目標庫中的數據應該是有一、二、三、4,沒有五、6。

我再執行Alter replicat repfpzx(進程名),extrba (ID爲5的RBA號),重啓進程,五、6才能進入到目標庫中

但是出乎我意料,我在目標端插入數據:

clip_image012

以後執行:

Alter replicat repfpzx,extrba 1383

目標端並無出現我想要的這種狀況:

clip_image014

而是依然只有1和4 兩條數據,並且進程沒有起來。

查看dsc文件顯示:

……省略……

Current time: 2016-11-25 16:44:17

Discarded record from action ABEND on error 1

OCI Error ORA-00001: unique constraint (DB_FPZX.SYS_C0010982) violated (status = 1). INSERT INTO "DB_FPZX"."LIULIU" ("ID","AGE","NAME","EEE","WWW") V

ALUES (:a0,:a1,:a2,:a3,:a4)

Aborting transaction on /u01/goldengate/dirdat/fp beginning at seqno 6 rba 1383

error at seqno 6 rba 1697

Problem replicating DB_FPZX.LIULIU to DB_FPZX.LIULIU

Mapping problem with insert record (target format)...

*

ID = 4

AGE = NULL

NAME = liu

EEE = NULL

WWW = liuliu444

*

Continuing to discard records up to the last discarded record from action ABEND

Operation discarded from seqno 6 rba 1383

Aborted insert from DB_FPZX.LIULIU to DB_FPZX.LIULIU (target format)...

*

ID = 2

AGE = NULL

NAME = liu

EEE = NULL

WWW = liuliu222

*

Operation discarded from seqno 6 rba 1551

Aborted insert from DB_FPZX.LIULIU to DB_FPZX.LIULIU (target format)...

*

ID = 3

AGE = NULL

NAME = liu

EEE = NULL

WWW = liuliu333

*

Process Abending : 2016-11-25 16:44:17

Oracle GoldenGate Delivery for Oracle process started, group REPFPZX discard file opened: 2016-11-25 16:52:14

感受OGG將這些插入語句

insert into liuliu (id,name,www) values (2,'liu','liuliu222');

insert into liuliu (id,name,www) values (3,'liu','liuliu333');

insert into liuliu (id,name,www) values (4,'liu','liuliu444');

insert into liuliu (id,name,www) values (5,'liu','liuliu555');

insert into liuliu (id,name,www) values (6,'liu','liuliu666');

當成一個總體執行了,只要有一條沒過去,其餘的也就夠不去。

是否是由於我是同一個session中一次提交的緣由呢?我要是一條一條地提交,不知道是否是會出現我想要的那種結果?

回頭再作實驗吧。

相關文章
相關標籤/搜索