對任意表操作 (SELECT/INSERT/UPDATE/DELETE) 皆報錯:
SQL0668N Operation not allowed for reason code "7" on table XXX.
SQLSTATE=57016 SQLCODE=-668
執行 db2 "? 57016" 可見官方定義:
SQLSTATE 57016:因表處於非作用狀態,無法存取。
原因碼 7:表處於 REORG PENDING (重組待決) 狀態。通常發生於執行ALTER TABLE包含 REORG 建議操作 (如變更欄位型態、新增 NOT NULL、資料分區變更) 之後,DB2 要求先重組才能繼續存取。
db2 "SELECT TABSCHEMA, TABNAME, STATUS FROM SYSCAT.TABLES WHERE TABNAME='XXX'"
STATUS = 'R' 即為 REORG PENDING。
db2 "REORG TABLE schema.XXX"
注意:INPLACE REORG (線上重組) 不支援 解除 REORG PENDING 狀態。
db2 "RUNSTATS ON TABLE schema.XXX WITH DISTRIBUTION AND DETAILED INDEXES ALL"
| 指令 | 用途 |
|---|---|
| REORG TABLE | 消除碎片、壓縮資料、解除 REORG PENDING |
| RUNSTATS ON TABLE | 收集表與索引統計資訊供優化器使用 |
| REORGCHK ON TABLE ALL | 自動判斷所有表是否需重組,並可選擇自動 RUNSTATS |
-- 1. 更新統計
db2 "RUNSTATS ON TABLE administrator.test"
-- 2. 離線重組 (解除 REORG PENDING)
db2 "REORG TABLE administrator.test"
-- 3. 重組後再次更新統計
db2 "RUNSTATS ON TABLE administrator.test WITH DISTRIBUTION AND DETAILED INDEXES ALL"
REORG INDEX 即可解除 → 必須 REORG TABLE。INPLACE REORG → 此狀態下僅支援傳統離線重組。
db2look -d dbname -e -t tabname 檢視 DDL。掌握「偵測 → 離線重組 → 更新統計」三步驟,即可從容應對 57016/7 錯誤,確保資料庫持續可用。