oracle??邏輯DG同步卡住,session等待row cache lock的處理過程

gxlineji發表於2016-12-27

問題描述:
ORACLE 邏輯同步卡住了,日誌應用的程式還在。
日誌應用程式顯示“ORA-16121: 正在透過提交 SCN 0x0a7d.6adf4c69 應用事務處理

處理過程:
(1)檢視DG 日誌應用程式
 select t.sid,t.* from V$LOGSTDBY_PROCESS t ;
ORA-16121: 正在透過提交 SCN 0x0a7d.6adf4c69 應用事務處理

(2)檢視DG日誌應用程式的SESSION,看看在執行什麼語句,在等待什麼
select t.SQL_ID,t.PREV_SQL_ID,t.EVENT,t.* from v$session t where t.sid in ( 1144 );

EVENT:row cache lock

(3) 檢視執行的SQL
select * from v$sqlarea t where t.sql_id in ('4m7m0t6fjcs5x');

可以查到,當前日誌應用程式在執行更新序列SQL:
   update seq$ set increment$=:2,minvalue=:3, maxvalue=:4,cycle#=:5,order$=:6,cache=:7,highwater=:8,audit$=:9,flags=:10 where obj#=:1

(4)上一步無法確定是哪個序列,需要進一步查上一步繫結變數(:1)的值

SELECT SQL_ID,NAME, POSITION, value_string, ANYDATA.accesstimestamp(value_anydata),A.*
  From gV$sql_Bind_Capture A     Where sql_id='4m7m0t6fjcs5x' and name=':1';

(5) 第四步可以得到(:1)的繫結變數的值,即為“value_string”列的值,根據查到的值,查詢dba_objects
   select * from dba_objects t where t.object_id in ('1890586');
   備註:怎麼知道(:1)=seq$.obj#= dba_objects .object_id ,可以看看 dba_sequences的定義。;

(6)對比主庫、從庫的當前序列值,發現 主庫的start with 的值是220000329100,而備庫是1055697702   。
  DG卡住的原因就清晰了。 是因為從庫要同步主庫的SEQ,要從1055697702   加到220000329100。差了N個數量級,這樣同步肯定會卡死了。
  處理辦法:在從庫刪除序列,重建成跟主庫一樣。
        

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10995764/viewspace-2131466/,如需轉載,請註明出處,否則將追究法律責任。

相關文章