OGG ora-01403錯誤的快捷處理方案
OGG運維中有一個經典錯誤-1403。現象是目標端複製update或者delete操作導致複製程式abended,原因是update或delete時找不到目標資料。至於該資料為什麼不在目標端有很多可能,比如人為刪除、trigger沒有禁用導致刪除、級聯外來鍵刪除沒有禁用導致刪除等等。通常我們的排查手段是確認目標端的trigger、級聯外來鍵刪除、job是否啟動了?如果啟動了禁用它。然後再排查源端表是否有主鍵,主鍵在trandata中是否生效。上述排查都沒有問題的話就開始做表級初始化吧,資料泵匯出匯入,同步變化...
但是有時候我們也可以不這麼折騰,可以採取“補缺”的方式讓複製程式迅速恢復。思路如下:
1. 透過目標端ggserr日誌和replcat.dsc檔案來定位丟失的資料
2. 在源端使用database link執行insert into 目標端 select * from 源表 where=(步驟一確認的條件)的方式來手工補缺。
3. 啟動複製程式,複製程式會重新操作abended之前失敗的操作。
下面透過一個實驗來演示上述過程
1. source插入第一條測試資料
Insert into FM_TAX_RATE_TEST (TEST_ID,COUNTRY, STATE, TAX_TYPE, TAX_RATE)
Values (1,'CN', '68', 'WT3', 0.0015);
commit;
2. target確認同步
select * from fm_tax_rate_test;
COUNTR STAT TAX_TY TAX_RATE TEST_ID
------ ---- ------ ---------- ----------
CN 68 WT3 .0015 1
3. target刪除複製記錄,人為製造1403錯誤
delete from fm_tax_rate_test where test_id=1;
commit;
4. source對第一條測記錄執行update操作會導致target複製程式中斷。中斷原因是update語句中的where字句定位的資料在target端不存在,因為我剛剛手工刪除了這條記錄。
update FM_TAX_RATE_TEST set country='US' where test_id=1;
commit;
此時target端已經中斷,在source增加資料變化,期待target重啟後會應用這些故障後產生的變化。
Insert into FM_TAX_RATE_TEST (TEST_ID,COUNTRY, STATE, TAX_TYPE, TAX_RATE)
Values (2,'TW', '68', 'WT3', 0.0015);
Insert into FM_TAX_RATE_TEST (TEST_ID,COUNTRY, STATE, TAX_TYPE, TAX_RATE)
Values (3,'JP', '68', 'WT3', 0.0015); 2
commit;
target複製程式中斷
GGSCI (cdbsym3) 6> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REPSYM 00:00:00 00:00:02
REPLICAT ABENDED REPSYM_T 00:10:20 00:00:01
target端ggserr.log中錯誤資訊片段
2015-03-31 13:50:26 WARNING OGG-01004 Oracle GoldenGate Delivery for Oracle, repsym_t.prm: Aborted grouped transaction on 'OGG_TEST.FM_TAX_RATE_TEST', Database error 1403 (OCI Error ORA-01403: no data found, SQL <UPDATE "OGG_TEST"."FM_TAX_RATE_TEST" SET "COUNTRY" = :a1,"STATE" = :a2,"TAX_TYPE" = :a3,"TAX_RATE" = :a4,"TEST_ID" = :a5 WHERE "TEST_ID" = :b0>).
2015-03-31 13:50:26 WARNING OGG-01003 Oracle GoldenGate Delivery for Oracle, repsym_t.prm: Repositioning to rba 170249512 in seqno 12.
2015-03-31 13:50:26 WARNING OGG-01154 Oracle GoldenGate Delivery for Oracle, repsym_t.prm: SQL error 1403 mapping OGG_TEST.FM_TAX_RATE_TEST to OGG_TEST.FM_TAX_RATE_TEST OCI Error ORA-01403: no data found, SQL .
2015-03-31 13:50:26 WARNING OGG-01003 Oracle GoldenGate Delivery for Oracle, repsym_t.prm: Repositioning to rba 170249512 in seqno 12.
2015-03-31 13:50:26 ERROR OGG-01296 Oracle GoldenGate Delivery for Oracle, repsym_t.prm: Error mapping from OGG_TEST.FM_TAX_RATE_TEST to OGG_TEST.FM_TAX_RATE_TEST.
2015-03-31 13:50:26 ERROR OGG-01668 Oracle GoldenGate Delivery for Oracle, repsym_t.prm: PROCESS ABENDING.
target端discard檔案中記錄了test_id=1的資料執行udpate失敗
more repsym_t.dsc
Oracle GoldenGate Delivery for Oracle process started, group REPSYM_T discard file opened: 2015-03-31 13:50:25
Current time: 2015-03-31 13:50:26
Discarded record from action ABEND on error 1403
OCI Error ORA-01403: no data found, SQL
RATE" = :a4,"TEST_ID" = :a5 WHERE "TEST_ID" = :b0>
Aborting transaction on ./dirdat/yt beginning at seqno 12 rba 170249512
error at seqno 12 rba 170249512
Problem replicating OGG_TEST.FM_TAX_RATE_TEST to OGG_TEST.FM_TAX_RATE_TEST
Record not found
Mapping problem with compressed key update record (target format)...
*
TEST_ID = 1
COUNTRY = US
STATE = 68
TAX_TYPE = WT3
TAX_RATE = .00150000
TEST_ID = 1
這時候很多運維人員最常用的就是按照csn一致性匯出source表,重新初始化target端資料不一致的表。在使用下面的方式來修改複製程式引數檔案,重啟複製程式追進度。
map schema.table, target schema.table, filter (@GETENV ("TRANSACTION", "CSN") > 9527);
如果同步的表比較大,這個過程會很漫長。
如果只是缺少那麼幾條資料,別人被認為誤刪除了造成的,也需要這麼大動干戈處理麼?其實可以用個簡單的方法來處理,在源庫建立一個database link,將target端缺少的資料手工insert過去補全這個漏洞,然後啟動複製程式。複製程式會再次嘗試失敗的update語句,where字句鎖定剛才手工插入的資料,修改成功。 複製程式繼續應用source端資料變化。
5. 源端建立database link。其中SERVICE_NAME = data為target資料庫的SID
5-1 在tnsnames.ora中新增target端資料庫的字串
to19 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.78.2.19)(PORT = 1553))
)
(CONNECT_DATA =
(SERVICE_NAME = data)
)
)
5-2 建立database link指向target資料庫; 其中ogg_test為target資料庫的schema。
create public databbase link to19 connect to ogg_test identified by ogg_test;
5-3 透過database link手工同步丟失語句。其中select語句是源表的資料,insert into是目標資料庫。
insert into ogg_test.fm_tax_rate_test@to19 select * from ogg_test.fm_tax_rate_test where test_id=1;
6. target啟動複製程式
GGSCI (cdbsym3) 4> start repsym
Sending START request to MANAGER ...
REPLICAT REPSYM starting
GGSCI (cdbsym3) 5> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REPSYM 00:00:00 00:00:00
REPLICAT RUNNING REPSYM_T 00:00:00 00:00:01
資料變化已經被應用到複製端了
GGSCI (cdbsym3) 8> stats repsym total table dbp.rb_restraints
Sending STATS request to REPLICAT REPSYM ...
Start of Statistics at 2015-03-31 11:09:14.
Replicating from SYMBOLS.RB_RESTRAINTS to DBP.RB_RESTRAINTS:
*** Total statistics since 2015-03-31 11:08:13 ***
Total inserts 1.00
Total updates 4.00
Total deletes 0.00
Total discards 0.00
Total operations 5.00
End of Statistics.
7. 在資料庫中檢視複製程式啟動後的資料變化
OGG_TEST@data> select * from ogg_test.fm_tax_rate_test;
COUNTR STAT TAX_TY TAX_RATE TEST_ID
------ ---- ------ ---------- ----------
US 68 WT3 .0015 1
TW 68 WT3 .0015 2
JP 68 WT3 .0015 3
其中第一條資料就是我們透過手工同步的資料,後面兩條資料是故障之後的資料變化。
注意:如果手工同步之前源表的資料也執行delete操作就無法透過isnert into select 的方式獲取並同步到target端了。祈禱吧
該方案在特定條件下還是很好用的,節省了很多時間。祝同學們好運
全文完
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29047826/viewspace-1480526/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- OGG 配置過程中的錯誤處理
- OGG-01028錯誤處理
- GOLANG錯誤處理最佳方案Golang
- OGG-00751錯誤處理一例
- OGG-01031錯誤處理一例
- 錯誤處理
- ogg複製程式報ORA-01438錯誤處理
- go的錯誤處理Go
- PHP 錯誤處理PHP
- php錯誤處理PHP
- Go 錯誤處理Go
- Swift錯誤處理Swift
- Zabbix錯誤處理
- mysqldump錯誤處理MySql
- Go語言(golang)的錯誤(error)處理的推薦方案GolangError
- axios 的錯誤處理iOS
- COM的錯誤處理 (轉)
- Spring boot/Spring 統一錯誤處理方案的使用Spring Boot
- 錯誤處理:如何通過 error、deferred、panic 等處理錯誤?Error
- PHP錯誤處理和異常處理PHP
- Python錯誤處理Python
- 請教 Element 的錯誤處理
- Restful API 中的錯誤處理RESTAPI
- 【譯】RxJava 中的錯誤處理RxJava
- grpc中的錯誤處理RPC
- JavaScript的錯誤簡易處理JavaScript
- 【故障處理】ORA-12162 錯誤的處理
- 前端的水平線,錯誤處理和除錯前端除錯
- GoldenGate投遞程式OGG-01416+OGG-01061錯誤處理一例Go
- 異常錯誤資訊處理
- PHP 核心特性 - 錯誤處理PHP
- 常用模組 PHP 錯誤處理PHP
- laravel9 錯誤處理Laravel
- 淺談前端錯誤處理前端
- Oracle異常錯誤處理Oracle
- ORACLE 異常錯誤處理Oracle
- 15-錯誤處理(Error)Error
- 學習Rust 錯誤處理Rust