goldengate中長事務引起的問題
一、問題描述:
2013年4月14日中午12點左右生產環境執行資料庫版本升級期間根據需要停止XX1庫和XX2庫OGG 同步抽取程式時遇長事務,無法用正常命令停止,執行 forcestop 後重啟程式報 OGG-00446 錯誤,無法啟動。錯誤如下:
2013-04-14 19:30:28 ERROR OGG-00446 Opening ASM file+FRA/bjschxsb/1_7125_796652962.dbf in DBLOGREADER mode: (308) ORA-00308: cannot open archived log'+FRA/bjschxsb/1_7125_796652962.dbf'
ORA-17503: ksfdopn:2 Failed toopen file +FRA/bjschxsb/1_7125_796652962.dbf
ORA-15173: entry'1_7125_796652962.dbf' does not exist in directory 'bjschxsb' Not able to establish initial position for sequence 7125, rba 339291664.
2013-04-14 19:30:28 ERROR OGG-01668 PROCESS ABENDING.
二、問題原因:
XX1庫和XX2庫的 Extract 程式在執行 forcestop 停止前(瞬間)正在處理既未提交也未回滾的長時間執行事務,重新啟動 Extract 程式後需要執行 Extract 程式恢復。
1、XX1庫
停止 XX1庫 Extract 程式時,正在處理的長事務為:
2013-04-14 11:51:46 WARNING OGG-01027 Oracle GoldenGate Capture for Oracle,esb_cx7.prm: Long Running Transaction:XID 561.10.31284,Items 0, Extract ESB_CX7, Redo Thread 1, SCN 3098.1568409621 (13307377092629),Redo Seq #7125, Redo RBA 339291664.
截止目前該事務在資料庫中仍在進行:
SQL> select t.addr,t.XIDUSN,t.XIDSLOT,t.XIDSQN,t.START_DATEfrom gv$transaction t;
ADDR XIDUSN XIDSLOT XIDSQN START_DATE
---------------- ---------- ---------- ----------------------------
070000084724BB90 561 10 31284 09-APR-13
SQL> select t.PREV_SQL_ID,t.SQL_ID from gv$session t wheret addr='070000084724BB90';
PREV_SQL_ID SQL_ID
------------- -------------
9m7787camwh4m
SQL> select sql_text from gv$sqltext t where t.SQL_ID = '9m7787camwh4m';
SQL_TEXT
----------------------------------------------------------------
begin :id := sys.dbms_transaction.local_transaction_id; end;
begin :id := sys.dbms_transaction.local_transaction_id; end;
begin :id := sys.dbms_transaction.local_transaction_id; end;
begin :id := sys.dbms_transaction.local_transaction_id; end;
該事務是由一臺 IP 地址為 162.16.220.70 的機器,透過 PL/SQL dev 工具於 2013 年 4 月 9 日發起,使用資料庫使用者是HX_SJZ,該事務至今未提交也未回滾。需要注意的是 HX_SJZ 使用者許可權已於 2013 年4月1日開始收回,該主機使用該使用者從3月28日用該使用者建立的 session 至今未斷開。
selectt.SID,t.SERIAL#,t.SCHEMA#,t.SCHEMANAME,t.OSUSER,t.MACHINE,t.PORT,t.TERMINAL,t.PROGRAM from gv$session t where taddr='070000084724BB90';
SID SERIAL# SCHEMA# SCHEMANAMEOSUSER MACHINE PORT TERMINAL PROGRAM
---------- -------------------- ---------- ---------- -------------------- ---------- ----------------------------------------
3351 107 77 HX_SJZ css5 WORKGROUP\CSS-PC 53796CSS-PC plsqldev.exe
bjschxdbsb01:/u01/app/grid/diag/tnslsnr/bjschxdbsb01/listener/trace$catlistener.log | grep css5 | grep 162.16.220.70 > /home/grid/listener.bak_20130414 sqldev.exe)(HOST=CSS-PC)(USER=css5)))* (ADDRESS=(PROTOCOL=tcp)(HOST=162.16.220.70)(PORT=53313)) * establish *bjschxsb * 0
28-MAR-2013 23:26:06 *(CONNECT_DATA=(SERVICE_NAME=bjschxsb)(GLOBAL_NAME=bjschxsb)(CID=(PROGRAM=D:\Program?Files\PLSQL?Developer\plsqldev.exe)(HOST=CSS-PC)(USER=css5)))* (ADDRESS=(PROTOCOL=tcp)(HOST=162.16.220.70)(PORT=53796)) * establish *bjschxsb * 0
28-MAR-2013 23:34:51 *(CONNECT_DATA=(SERVICE_NAME=bjschxsb)(GLOBAL_NAME=bjschxsb)(CID=(PROGRAM=D:\Program?Files\PLSQL?Developer\plsqldev.exe)(HOST=CSS-PC)(USER=css5)))* (ADDRESS=(PROTOCOL=tcp)(HOST=162.16.220.70)(PORT=53920)) * establish *bjschxsb * 0
28-MAR-2013 23:36:37 *(CONNECT_DATA=(SERVICE_NAME=bjschxsb)(GLOBAL_NAME=bjschxsb)(CID=(PROGRAM=D:\Program?Files\PLSQL?Developer\plsqldev.exe)(HOST=CSS-PC)(USER=css5)))* (ADDRESS=(PROTOCOL=tcp)(HOST=162.16.220.70)(PORT=53944)) * establish *bjschxsb * 0
重啟 XX1庫 上的 Extract 程式後,需要使用thread 1, seq 7125-7152 歸檔日誌,而 seq 7125 歸檔正好已被刪除,這就是報錯的原因。
Recovery Checkpoint (position of oldestunprocessed transaction in the data source):
Thread #: 1
Sequence #: 7125
RBA: 339291664
Timestamp: 2013-04-09 15:18:13.000000
SCN: 3098.1568409621 (13307377092629)
Redo File: Not Available
Current Checkpoint (position of last recordread in the data source):
Thread #: 1
Sequence #: 7152
RBA: 253142788
Timestamp: 2013-04-14 11:59:29.000000
SCN: 3099.705644312 (13310809294616)
Redo File: +DATA/bjschxsb/onlinelog/redo01b
2 、 XX2庫 分析
停止 XX2庫 Extract 程式時正在處理的長事務為
select t.addr,t.XIDUSN,t.XIDSLOT,t.XIDSQN,t.START_DATE from gv$transaction t;
ADDR XIDUSN XIDSLOT XIDSQN START_DAT
---------------- ---------- ---------- ---------- ---------
0700000405B10488 173 30 6643 10-APR-13
截止目前該事務在資料庫中仍在進行:
SQL> selectt.SID,t.SERIAL#,t.SCHEMA#,t.SCHEMANAME,t.OSUSER,t.MACHINE,t.PORT,t.TERMINAL,t.PROGRAMfrom gv$session t where taddr='0700000405B10488';
SID SERIAL# SCHEMA# SCHEMANAMEOSUSER MACHINE PORT TERMINAL PROGRAM
---------- -------------------- ---------- ---------- -------------------- ---------------------------------------- ------------------------------
2520 19683 98 SJCK oracle bjschxdbcx03 0 UNKNOWN )
透過該事務正在進行的 sql 以及上一個 sql語句推測,該事務可能由於 Oracle 自動重新整理物化檢視的內部job發起,不會帶來業務資料變化。
SQL> selectt.PREV_SQL_ID,t.SQL_ID from gv$session t where taddr='0700000405B10488';
PREV_SQL_ID SQL_ID
--------------------------
76cckj4yysvua 6x5246x8jk7wj
SQL> select sql_textfrom gv$sqltext t where t.SQL_ID = '76cckj4yysvua' order by t.PIECE;
SQL_TEXT
----------------------------------------------------------------
select time_mp, scn,num_mappings, tim_scn_map from smon_scn_time where scn = (select max(scn) from smon_scn_time wherescn <= :1)
select time_mp, scn,num_mappings, tim_scn_map from smon_scn_time where scn = (select max(scn) from smon_scn_time wherescn <= :1)
select time_mp, scn,num_mappings, tim_scn_map from smon_scn_time where scn = (select max(scn) from smon_scn_time wherescn <= :1)
select time_mp, scn,num_mappings, tim_scn_map from smon_scn_time where scn = (select max(scn) from smon_scn_time wherescn <= :1)
SQL> select sql_text fromgv$sqltext t where t.SQL_ID = '6x5246x8jk7wj' order by t.PIECE;
/* MV_REFRESH (MRG) */MERGE INTO "SJCK"."SE_GES_NSDSEWYYS2" "SN
A$" USING ( WITH"TMPDLT$_SE_GES_NSDSEWYYS1" AS ( SELECT /*+ RE
SULT_CACHE(LIFETIME=SESSION)*/ "MAS$"."RID$" "RID$" ,"MAS$"."N
SDEHJ","MAS$"."SDNF", "MAS$"."ZRRDZDAH", DECODE("MAS$".
"OLD_NEW$$",'N', 'I', 'D') "DML$$", "MAS$"."OLD_NEW$$"
"OLD_NEW$$","MAS$"."TIME$$" "TIME$$","MAS$"."DMLTYPE$$" "DMLTY
PE$$" FROM (SELECT "MAS$".*, MIN("MAS$"."SEQ$$") OVER(PARTIT
ION BY"MAS$"."RID$") "MINSEQ$$", MAX("MAS$"."SEQ$$") OVER(PA
RTITION BY"MAS$"."RID$") "MAXSEQ$$" FROM (SELECT CHARTOROWID
("MAS$"."M_ROW$$")RID$ , "MAS$"."NSDEHJ", "MAS$"."SDNF","MAS
$"."ZRRDZDAH" , DECODE("MAS$".OLD_NEW$$, 'N','I', 'D') DML$$,
"MAS$"."DMLTYPE$$""DMLTYPE$$", "MAS$"."SEQUENCE$$" "SEQ$$","MA
S$"."OLD_NEW$$""OLD_NEW$$", "MAS$"."SNAPTIME$$""TIME$$" FROM
"SJCK"."MLOG$_SE_GES_NSDSEWYYS1""MAS$" WHERE"MAS$".SNAPTIME$
恢復該資料庫上的 Extract 程式需要用到歸檔日誌 thread 3, seq 5862-6105,從 5862 開始的相當一部分歸檔日誌已被刪除,因此會報找不到歸檔。
Recovery Checkpoint (position of oldest unprocessed transaction in thedata source):
Thread #: 3
Sequence #: 5862
RBA: 18504720
Timestamp: 2013-04-10 01:00:18.000000
SCN: 3098.1717076309 (13307525759317)
Redo File: Not Available
Current Checkpoint (position of last recordread in the data source):
Thread #: 3
Sequence #: 6105
RBA: 39127568
Timestamp: 2013-04-14 11:58:38.000000
SCN: 3099.2202080974 (13312305731278)
Redo File: +DATA/bjschxcx/onlinelog/redo12b
問題原因總結:
目前生產環境所有資料庫的 Extract 程式已經按照 Oracle 的建議統一關閉 Bounded Recovery 功能,關閉該功能的後果是,每當 Extract 程式強制停止時,如果程式正在處理既未提交也未回滾的長時間執行事務(無論事務長短),則重啟 Extract 程式後,都必須進行 Normal Recovery,必須從這些既未提交也未回滾的事務中最早開始的事務在 Redo 或 Archived log 中的起點位置開始進行 Recovery。
如果未關閉Bounded Recovery,則 Extract 程式會對任何執行時間超過一個 BR 檢查點間隔(預設4小時)的事務每隔一個 BR 間隔執行一個檢查點,將事務相關的狀態和資料寫入 BR 檢查點檔案,這樣當 Extract 程式強行終止重啟後就會從上一個有效的 BR 檢查點或上個 BR 間隔內最早的既未提交也未回滾的事務的起點在日誌檔案中開始進行 Recovery,透過該功能可以保證 Extract 程式恢復的時間永遠不會超過 2 倍的 BR 間隔。
因此,導致本次問題的原因有:
1、GoldenGateExtract 的 Bounded Recovery 功能關閉,該功能官方的 Reference 推薦在未經Oracle Support 推薦情況下,不應對該功能做任何改動。
2、版本升級時在停止 Extract 程式時存在長事務,執行了 forcestop 操作
3、歸檔日誌被刪除
4、資料庫中存在不正常的長事務
5、資料運維不規範
三、解決方案:
1、重新初始化,能夠徹底解決問題,但是存在業務停機時間不可控風險。
2、恢復歸檔,能夠徹底解決問題,存在一定的同步延遲等待。
3、按照抽取時間點跳過該事務,可能存在丟失事務的風險,機率很低但卻是存在。
四、處理過程:
對於 XX2庫 因找不到歸檔掛起的 Extract 程式,透過恢復歸檔日誌,重啟 Extract 程式,等待延遲解決。
對於 XX1庫 因找不到歸檔掛起的 Extract 程式,經備份廠商核實不存在 Extract 程式執行恢復所需的歸檔的有效備份,無法恢復歸檔日誌,採取重置Extract 程式按照對 Extract 程式執行 forcestop 操作的時間點重新開始抽取,跳過該長事務。
Forcestop 時間點:
2013-04-1411:59:55 INFO OGG-00987 Oracle GoldenGate Command Interpreter for Oracle: GGSCI command (oracle): send ESB_CX7forcestop.
2013-04-1411:59:56 INFO OGG-01021 Oracle GoldenGate Capture for Oracle, esb_cx7.prm: Command received from GGSCI: FORCESTOP.
2013-04-1411:59:30 INFO OGG-00987 Oracle GoldenGate Command Interpreter for Oracle: GGSCI command (oracle): send ESB_ZJ4forcestop.
2013-04-1411:59:30 INFO OGG-01021 Oracle GoldenGate Capture for Oracle, esb_zj4.prm: Command received from GGSCI: FORCESTOP.
重置時間點:
alter ESB_ZJ4 ,begin 2013-04-14 11:59:30
start ESB_ZJ4
alter ESB_CX7 ,begin 2013-04-14 11:59:56
start ESB_CX7
五、後續建議:
1、讓 Oracle 確認 Bounded Recovery 功能的合理性
2、規範歸檔日誌管理
3、規範資料運維
4、加強資料庫長事務監控和最佳化
5、規範資料庫版本升級流程,嚴格遵循 Oracle 推薦的 OGG 運維規範
本文乃作者原創,轉載請註明作者出處及原文連結,否則將追究法律責任:
作者:xiangsir
原文連結:http://blog.csdn.net/xiangsir/article/details/8806027
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29371470/viewspace-2062914/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- open session in view引起的事務問題SessionView
- JDBC中事務的問題JDBC
- JDBC中事務的問題之二JDBC
- 分散式系統中的事務問題分散式
- 大家如何解決長事務併發控制的問題?
- 軟體中事務處理問題!
- [求助]Hibernate自增長主鍵的設定問題和事務問題
- web service 的事務問題Web
- 關於spring框架中的事務問題(急)Spring框架
- 事務槽引起的 ORA-600 事件事件
- 主鍵,唯一性約束,不同session間未提交事務中的爭議性資料引起的問題。Session
- GoldenGate--大事務拆分成小事務定位問題Go
- 專案中Spring事務失效的場景問題排查Spring
- 關於日誌事務的問題
- Oracle GoldenGate 系列:Extract 程式遇長事務執行 Forcestop 引發的慘案OracleGo
- MySQL關於事務常見的問題MySql
- mysql併發事務的常見問題MySql
- weblogic XA 事務配置問題Web
- Spring事務(Transaction)管理高階篇一棧式解決開發中遇到的事務問題Spring
- 事務註解(@Transactional)引起的資料覆蓋故障
- 一個java加密引起的問題Java加密
- 軟體防火牆引起的問題防火牆
- 微服務架構分散式事務管理問題微服務架構分散式
- 關於Spring事務回滾的問題Spring
- 異構環境的分散式事務問題分散式
- 一個RESOURCE MANAGER引起的問題分析
- 故障分析 | show processlist 引起的效能問題
- 記憶體洩露引起的問題記憶體洩露
- 單機硬碟跳線引起的問題.硬碟
- SQL Server 查出未提交事務(長事務)SQLSQLServer
- 使用Seata徹底解決Spring Cloud中的分散式事務問題!SpringCloud分散式
- 資料庫事務併發產生的問題以及事務的隔離級別資料庫
- goldengate跳過/提交一個未完成的事務Go
- 編輯 Java 中的事務 — JDBC 事務和 JTA 事務JavaJDBC
- 定時任務裡面事務不生效問題
- MongoDB 中的事務MongoDB
- MyBatis中的事務MyBatis
- Redis 中的事務Redis