故障现象描述:
执行 SQL 语句时,出现类似如下错误消息。
指令 SQL:insert into t_stat_file_temp
SQLSTATE:57011,供应商错误代码:-964
DB2 SQL 错误:SQLCODE:-964,SQLSTATE:57011,
SQLERRMC:空
故障原因说明:
数据库堆中没有足够的存储空间可用于处理该语句,此错误消息是事务日志中耗尽空间的结果。
故障处理方式:
1 方式一:扩展事务日志存储空间
通过类似如下语句调整主日志文件数,以及辅助日志文件数。
例如:分配八个主日志文件,同时最多分配 100 个辅助日志文件。注意:辅助日志文件将根据需要进行分配,并在不需要时删除。
db2 update db cfg for $DBNAME using logprimary 8
db2 update db cfg for $DBNAME using logsecond 100
2 方式二:处理异常事务
如果出现因事务异常导致事务日志存储空间不足的情况,则单纯扩展存储空间往往难以彻底解决问题,因此需要本方式提供了彻底排查的步骤。
注意:以下操作均在 db2 connect to $DBNAME
连接至数据库后执行。
2.1 定位异常的数据库节点
通过如下语句,查看各节点的日志空间使用情况,定位事务日志空间使用率(LOG_UTILIZATION_PERCENT)过高的节点。
db2 " select DB_NAME, LOG_UTILIZATION_PERCENT, TOTAL_LOG_USED_KB,TOTAL_LOG_AVAILABLE_KB,TOTAL_LOG_USED_TOP_KB, DBPARTITIONNUM
from SYSIBMADM.LOG_UTILIZATION order by DBPARTITIONNUM "
执行结果类似如下。
2.2 检查异常活动连接
在事务日志空间使用率过高的节点上,执行如下命令,定位是否存在事务日志使用量(UOW_LOG_SPACE_USED)过高的活动连接。
db2 "select APPLICATION_HANDLE,UOW_LOG_SPACE_USED,UOW_START_TIME
from TABLE(MON_GET_UNIT_OF_WORK(NULL,-1))
order by UOW_LOG_SPACE_USED"
若存在异常的活动连接,则可以通过类似如下命令终止。
db2 "force application (h1 [,h2,..hn])"
h1 [,h2,..hn] 代表 application handle identifier
2.3 检查不确定事务(In-doubt transaction)
在事务日志空间使用率过高的节点上,执行如下命令,以交互模式定位是否存在不确定事务(In-doubt transaction)。
db2 list indoubt transactions with prompting
若存在不确定事务,则可以通过交互命令进行 COMMIT 或 ROLLBACK 等操作,具体操作参见 WITH PROMPTING 模式的说明。
Command parameters WITH PROMPTING Indicates that indoubt transactions are to be processed. If this parameter is specified, an interactive dialog mode is initiated, permitting the user to commit, roll back, or forget indoubt transactions. If this parameter is not specified, indoubt transactions are written to the standard output device, and the interactive dialog mode is not initiated.
Interactive dialog mode permits the user to:
- List all indoubt transactions (enter l)
- List indoubt transaction number x (enter l, followed by a valid transaction number)
- Quit (enter q)
- Commit transaction number x (enter c, followed by a valid transaction number)
- Roll back transaction number x (enter r, followed by a valid transaction number)
- Forget transaction number x (enter f, followed by a valid transaction number).
A blank space must separate the command letter from its argument.