故障現象描述:
執行 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.