早上应用那边反应前几天同步到备库的数据在备库查不到,怀疑dg不同步了。于是查看备库的告警日志,结果没有发现报错信息。
检查逻辑dg事件:
SELECT EVENT_TIME, STATUS, EVENT FROM DBA_LOGSTDBY_EVENTS ORDER BY EVENT_TIMESTAMP, COMMIT_SCN;
发现备库从24号开始一直出现同一个报错,这个报错涉及到三个索引,如下图。
继续查看告警日志,查看24号当天的信息,发现告警日志有以下报错:
于是在备库查看这个表上边的索引:
select * from dba_ind_columns where TABLE_NAME='T_INTERFACE_LOGS'
一共找到三个索引,三个索引分别在CONTRACTID,CREATETIME,BATCHID三个字段上边。
联系项目组那边,项目组之前做过一些操作,因为主库的T_INTERFACE_LOGS表太大,对T_INTERFACE_LOGS表rename之后,从新建立了T_INTERFACE_LOGS表,然后在这个表上边添加索引。
到此,原因已经找到,项目组在主库的表添加了三个索引,而这三个索引备库相同的表的相同字段已经存在,所以同步到这个操作的时候,出现报错。
解决方法是我把备库的那三个索引干掉了,让其自己同步。然后报错没有出现,开始同步之后我就后悔了,因为备库那张表真的很大(项目组提供信息说是有几千万条数据),在服务器性能如此差劲的情况系,这三个索引愣是同步了一天。
然而问题不是这么简单,接下来一天时间,备库不停的注册进归档,但是应用的速度却很慢(7个小时应用了一个归档),而已经应用的归档全部是current状态,大概有一百多个,还有一百多个归档没有应用。
查询备库当前进程信息:
select LOGSTDBY_ID,type,status process_status from v$logstdby_process;
查询结果显示只有一个进程在同步一个表,其他进程全部为等待状态。
查询备库会话信息:
select xid,START_TIME from v$transaction order by START_TIME;
会话信息显示这个会话从早上开始一直到下午都没有提交。
根据xid查询sid
select sid,status,last_call_et from v$session where taddr in (select addr from v$transaction where xid='00D50012000071B7');
SID SQL_ID
---------- -------------
1621
找不到相关的SQL
select prev_sql_id from v$session where sid=1621;
PREV_SQL_ID
-------------
7dvhfkrdn8bx6
该SQL目前是在更新一张表(咨询了项目组,也是一个大表)
查询死锁情况
select SESSION_ID,ORACLE_USERNAME,OS_USER_NAME from v$locked_object;
死锁确实存在,并且和当前没有提交的两个会话相吻合,由于这个时候不能杀掉死锁(会造成已经注册的归档重新注册),在我等待了一天一夜之后,几张大表同步完成之后,死锁释放,同步速度提高,应用完的归档也正常删除,问题解决。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30135314/viewspace-1849540/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30135314/viewspace-1849540/