oracle 长事务 逻辑日志,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
oracle 长事务 逻辑日志,goldengate中长事务引起的问题相关推荐
- 【ogg】goldengate中长事务引起的问题
goldengate中长事务引起的问题 原创 Oracle 作者:datapeng 时间:2016-03-24 09:15:51 10046 0 一.问题描述: 2013年4月14日中午12点左右 ...
- mysql的事务隔离级别与锁的关系、sql日志、Spring事务的特性
文章目录 数据库事务介绍 什么是事务的隔离级别? 脏读幻读不可重复读的示例? mysql默认的隔离级别 Mysql锁有哪些 for update 什么是间隙锁?(Next-Key) mysql的日志 ...
- mysql事物日志工具,数据库事务日志 active
Active Directory的脱机碎片整理,Active Directory系列之七 Active Directory的脱机碎片整理 Active Directory是一个被设计用于查询的非关系型 ...
- 《MySQL实战45讲》——学习笔记01-03 “MySQL基本架构、日志系统、事务隔离“
最近有新闻说"丁奇"炒股失败欠债,赶紧去极客时间买了他的<MySQL 实战 45 讲>以防下架,顺带重新系统的复习下MYSQL相关知识,记录下学习笔记: 本篇介绍: M ...
- mysql 活跃事务_MySQL日志与事务
整体架构 事务的基本概念 事务就是一组原子性的sql查询,或者是一个独立的工作单元 事务内的语句,要么全部执行成功,要么全部执行失败 ACID标识原子性(atomicity).一致性(consiste ...
- mysql 事物状态有几种_mysql第三章 事务以及日志
mysql第三章 事务以及日志 一. 事物简介 每条DDL DCL语句都是事务. 每个begin 到coomit语句是一个事务 二. 事物特性ACID以及开启方式 1. 原子性(A),部成功执行或全部 ...
- mysql备份时候事务日志_SQLSERVER备份事务日志的作用
SQLSERVER备份事务日志的作用 事务日志备份有以下3种类型 (1)纯日志备份:仅包含相隔一段时间的事务日志记录,而不包含任何大容量更改 (2)大容量操作日志备份.包括由大容量操作更改的日志和数据 ...
- Oracle总结【视图、索引、事务、用户权限、批量操作】
前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了-那么本篇主要总结关于Oralce视图.序列.事务的一些内容- 在数据库中,我们可以把各种的SQL语句分为四大类- (1 ...
- MySQL日志/索引/锁/事务特性的理解
文章目录 前言 关于日志 Redo Undo 关于索引 分页查询的优化方式&原理 子查询优化 根据某个字段排序后分页 先选出主键,再通过主键查询 位置计算优化 索引对关联查询的影响 关于锁 乐 ...
最新文章
- 暑期集训1:C++STL 练习题A:POJ-1833
- 无需用户输入,Adobe提出自动生成高质量合成图像新方法
- pandas使用rename函数重命名dataframe中数据列的名称、从而创建一个包含重复列名称的dataframe数据集
- day3_python学习笔记_chapter5_数字
- caffe配置中的一些问题
- java 分层领域模型_Java领域模型 | 学步园
- eclipse package explorer视图中怎么让default package不显示?
- 手写一个promise用法_手写一个Promise
- 2.tcpdump(2)
- sql 数据库恢复挂起
- 15套前端经典实战项目大合集,小白练手必备实战项目
- 二分、冒泡、快速、插入排序
- win7 双屏 双工具栏_Win7双屏复制/双屏扩展设置教程
- Dubbo(二):Dubbo和ZooKeeper的协同工作原理
- w7计算机的工具栏爱那里,win7系统底下任务栏不见了的解决方法
- 十分钟开发出神经网络五子棋
- UI设计中按钮如何设计,常见的按钮设计类型
- Armbian : sudo must be owned by uid 0 and have the setuid bit set错误处理
- dubbo源码分析25 -- 序列化与反序列化
- 中小学不得在校内设置食品经营场所,量子摩尔定律问世,美团运营摩拜亏45亿,英伟达史上最大手笔收购,这就是今天的大新闻。...
热门文章
- 如何处理UI5一般性错误Cannot read property md of undefined
- 第三方应用如何在SAP Kyma上进行服务注册
- UDO compare ABAP代码的实现
- 如何使用puttygen基于pem文件生成可供登录的ppk文件
- OpenFOAM计算时,同时将结果输出到:计算窗口+文件
- python识别人脸多种属性_OpenCV-Python(3)训练一个人脸识别器
- 学python对数学要求高吗_人工智能的小男孩 大专学历的人没有数学基础想学习python技术未来能往大数据或人工智能方向进行职业发展吗?...
- 用python的五种方式_Python加载数据的5种不同方式(收藏)
- 最大正方形Python解法
- github服务器停止响应,如何解决“git pull,致命:无法访问'https://github.com ... \':服务器空回复”...