認識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這張表作實驗。
源端和目標端數據同樣:
在目標端刪除一條數據:
源端和目標端執行info all ,主程序和子程序都是正常的。沒有問題。
下面咱們在源端刪除id爲2的數據:
此時兩邊再次執行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」,此時應該去查查目標庫中此數據是否被刪除了(我這裏固然是刪除了)
咱們再往源端添加幾條數據:
不用多說。目標庫中確定是沒有這些數的,由於已經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,下一條事務。
下面進行看圖講故事環節:
紅色橫線標註的,是此事務進行的操做
黃色橫線標註的,是此事務的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才能進入到目標庫中
但是出乎我意料,我在目標端插入數據:
以後執行:
Alter replicat repfpzx,extrba 1383
目標端並無出現我想要的這種狀況:
而是依然只有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中一次提交的緣由呢?我要是一條一條地提交,不知道是否是會出現我想要的那種結果?
回頭再作實驗吧。