Question & Answer
Question
发生了一个事务日志满,但在db2diag.log中应用程序句柄未知。 我应该怎么做?
MESSAGE : ADM1823E The active log is full and is held by application handle “”.
Terminate this application by COMMIT, ROLLBACK or FORCE APPLICATION.
Cause
未确认的事务的存在可能会因为当前不存在的应用程序而导致锁超时或日志满。
SQL0911N デッドロックまたはタイムアウトのため、現在のトランザクションがロールバックされました。理由コード"68"。SQLSTATE=40001
SQL0964C データベースのトランザクション・ログがいっぱいです。 SQLSTATE=57011
未确认的事务是指一直处于未确认状态的全局事务。当两阶段提交协议的第一阶段(即prepare阶段)成功完成后,事务管理器(TM)或至少一个资源管理器(RM)变得不可用时,就会发生这种情况。
在RM日志再次可用之前,RM将无法识别是否提交或回滚一个事务分支,TM可以整合日志从RM中获取未确认的状态信息。
Answer
通过对当前连接的数据库运行LIST INDOUBT TRANSACTIONS命令,可以找到有关待处理事务的信息。
$ db2 list indoubt transactions
- originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930013422
sequence_no: 0001 status: i
timestamp: 2011-09-30 10:34:57 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000AF0D - originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930021847
sequence_no: 0001 status: i
timestamp: 2011-09-30 11:18:46 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000B05A - originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930014048
sequence_no: 0001 status: i
timestamp: 2011-09-30 10:41:36 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000AFA1 - originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930014752
sequence_no: 0001 status: i
timestamp: 2011-09-30 10:48:30 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000B03E - originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930080254
sequence_no: 0001 status: i
timestamp: 2011-09-30 17:02:54 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000C60B0B
要处理未确认的事务,请执行带有 WITH PROMPTING 选项的 LIST INDOUBT TRANSACTIONS 命令。
这将启动一个交互式对话模式,允许你提交、回滚或销毁待处理的事务。
$ db2 list indoubt transactions with prompting
- originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930013422
sequence_no: 0001 status: i
timestamp: 2011-09-30 10:34:57 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000AF0D - originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930021847
sequence_no: 0001 status: i
timestamp: 2011-09-30 11:18:46 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000B05A - originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930014048
sequence_no: 0001 status: i
timestamp: 2011-09-30 10:41:36 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000AFA1 - originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930014752
sequence_no: 0001 status: i
timestamp: 2011-09-30 10:48:30 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000B03E - originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930080254
sequence_no: 0001 status: i
timestamp: 2011-09-30 17:02:54 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000C60B
c/r/f/l/q:
在交互式对话模式下,您可以进行以下操作
- 显示所有待处理的事务列表(输入l)。
- 列出待处理的事务号x(在有效事务号后输入l)。
- 终止(输入q)
- 提交事务号x(在有效事务号后输入c)
- 回滚事务号x(在有效的事务号后输入r)。
- 销毁事务号x(在字母f后面输入有效的事务号)
命令字符和参数必须用空格隔开。
在这种情况下,它是 “c/r/f/l/q:”,但它可能是 “c/r/l/q:”,这取决于待处理事务的状态。
要处理未确认的事务,要分两步确认。
1)最终完成事务(根据事务的状态,可以是r/c),释放资源。
回滚未确认的事务------R号
回滚未确认的事务------C号
在上面的例子输出中,状态:i(未设置),所以你可以提交或回滚。
'c 1’以启发式方式提交事务1。
c/r/f/l/q: c 1
- originator: DB2 Enterprise Server Edition
appl_id: *N0.e97q3ac.110930013422
sequence_no: 0001 status: i
timestamp: 2011-09-30 10:34:57 auth_id: E97Q3AC
log_full: n type: RM
xid: 00001D3400000008 0000000000000000 0000AF0D
この未確定トランザクションをヒューリスティックに COMMIT しますか? (y/n) y
在提交、回滚或销毁事务之前,当显示事务数据并提示你确认操作时,输入y。
这就是你如何提交或回滚一个事务。
2) 在以下情况下,你应该放弃(f)而不是提交或回滚。
从待处理的事务列表中丢弃(FORGET)已提交或回滚的事务------f号
- 如果由于使用启发式方法提交或回滚的事务而出现日志满的情况(如LIST INDOUBT TRANSACTIONS命令的输出所示)。
- 如果执行脱机备份
运用方面的考虑
-
对于分区数据库,你必须连接到每个分区,然后执行list indoubt事务命令。
例
export DB2NODE=3
db2 terminate
db2 connect to
db2 list indoubt transactions -
如果在崩溃恢复过程中检测到未确认事务的存在,db2diag.log中会记录一个类似于以下的条目。
2011-11-30-16.25.25.062152+540 I857382A463 LEVEL: Warning
PID : 835832 TID : 3086 PROC : db2sysc 2
INSTANCE: e97q3ac NODE : 002 DB : TEST
APPHDL : 1-51 APPID: *N1.e97q3ac.111130072521
AUTHID : E97Q3AC
EDUID : 3086 EDUNAME: db2agntp (TEST) 2
FUNCTION: DB2 UDB, recovery manager, sqlpresr, probe:3280
MESSAGE : In-doubt transaction(s) exists at the end of crash recovery. -
在提交、回滚或销毁事务之前,将显示事务数据,并提示您确认该操作。
-
您只能提交状态为未定义(i)、缺少提交确认(m)或缺少联合提交确认(d)的事务。
-
只有状态未定义(i)、缺少联合回滚确认(b)或终止(e)的事务才能回滚。
-
只有状态为提交( c )、回滚( r )、缺少联合提交确认(d)或缺少联合回滚确认(b)的事务才能被中止。
-
一个挂起的事务失败,并出现 “SQL0998N トランザクションまたはヒューリスティック処理中に、エラーが発生しました。 理由コード =36。”,执行RESTART DATABASE命令,然后再次执行LIST INDOUBT TRANSACTIONS命令,确认没有待处理的事务。
$ db2 list indoubt transactions with prompting
SQL1251W No data returned for heuristic query. SQLSTATE=00000
db2diag.log中会记录以下信息。
2011-11-30-16.58.09.561284+540 E860889A491 LEVEL: Warning
PID : 835832 TID : 3086 PROC : db2sysc 2
INSTANCE: e97q3ac NODE : 002 DB : TEST
APPHDL : 2-89 APPID: *N2.e97q3ac.111130075809
AUTHID : E97Q3AC
EDUID : 3086 EDUNAME: db2agent (TEST) 2
FUNCTION: DB2 UDB, recovery manager, sqlpssdw, probe:5000
MESSAGE : Indoubt transaction processing completed.
DATA #1 : ZRC, PD_TYPE_ZRC, 4 bytes
0x00000000