ITPub博客

首页 > 数据库 > Oracle > oracle??逻辑DG同步卡住,session等待row cache lock的处理过程

oracle??逻辑DG同步卡住,session等待row cache lock的处理过程

原创 Oracle 作者:gxlineji 时间:2016-12-27 15:39:28 0 删除 编辑

问题描述:
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博客 ” ,链接:https://blog.itpub.net/10995764/viewspace-2131466/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-09-11

  • 博文量
    48
  • 访问量
    76656