首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

重置 DB2 表空間靜默狀態正確姿勢:db2dart 定位發起者與授權 ID 綁定機制

     編輯:DB2 教學

上一篇揭示 QUIESCE RESET 必須由原發起授權 ID 執行才生效。本文提供標準化排查與重置流程:停止實例 → db2dart /DTSF 產生報告 → 解析 Userid of quiescer → 以正確授權 ID 登入執行 RESET → 驗證狀態恢復 0x0000。

標準重置流程 (5 步驟)

步驟 1:停止 DB2 實例 (離線分析必須)

db2stop force

db2dart 需獨佔存取資料庫檔案,實例必須停止。

步驟 2:執行 db2dart 產生表空間靜默報告

db2dart <資料庫別名> /DTSF
# 範例:db2dart SAMPLE /DTSF
  • /DTSF (Dump TableSpace Quiescer Info):專門傾印表空間靜默資訊
  • 報告檔預設位置:<DB2INSTPROF>/dump/DART0000/<資料庫名>.RPT

步驟 3:解析報告找出靜默發起者

打開報告檔,搜尋靜默表空間 ID (如 Tablespace ID: 2):

Information for Tablespace ID: 2
-------------------------------------
Tablespace name: USERSPACE1
Table space flags (HEX): 0101
Table space type: System Managed Space (SMS)
Page size: 4096
Extent size: 32
Prefetch size: 32
Version: 9
Tablespace state: 2
Number of quiescers: 1

1) Userid of quiescer: DB2INST1
   Quiesce state: 2
   Tbspace ID of quiesced object: 2
   Table ID of quiesced object: 3
   EDU ID: 0
   Agent ID: 0

關鍵欄位:Userid of quiescer: DB2INST1 → 此為唯一能成功 RESET 的授權 ID。

步驟 4:以正確授權 ID 登入並執行 RESET

# 重啟實例
db2start

# 以 DB2INST1 登入 (或具相同授權 ID 的用戶)
db2 connect to SAMPLE user db2inst1 using password

# 執行重置
db2 quiesce tablespaces for table db2inst1.staff reset
# DB20000I The QUIESCE TABLESPACES command completed successfully.

步驟 5:驗證表空間狀態恢復正常

db2 list tablespaces
# 輸出片段:
Tablespace ID = 2
Name = USERSPACE1
Type = System managed space
Contents = Any data
State = 0x0000
Detailed explanation:
  Normal

State = 0x0000 確認靜默已完全解除,表空間恢復正常存取。

為什麼其他用戶 RESET 會「假成功」?

  • DB2 CLI 處理 QUIESCE RESET 時,語法檢查通過即回傳成功
  • 實際權限驗證在引擎內部進行,失敗不回傳錯誤碼
  • 此設計為相容舊版行為,非 Bug

線上替代方案 (無法停機時)

若無法停止實例執行 db2dart,可嘗試:

  1. 查詢系統視圖 (DB2 9.7+):
    SELECT TBSP_NAME, QUIESCER_AUTHID, QUIESCE_STATE
    FROM SYSIBMADM.TBSP_UTILIZATION
    WHERE TBSP_STATE != 0;
  2. db2pd 即時檢視:
    db2pd -tablespaces -db <dbname> | grep -A5 "Quiescer"
  3. 應用程式快照:
    db2 get snapshot for applications on <dbname> | grep -i quiesce

注意:線上方法可能無法顯示已斷開連線的靜默持有者,db2dart /DTSF 為最權威離線分析手段。

預防措施:自動化 QUIESCE/RESET 成對執行

#!/bin/bash
# backup_with_quiesce.sh
DB=SAMPLE
TABLE=db2inst1.staff

db2 "quiesce tablespaces for table $TABLE intent to update"
if [ $? -ne 0 ]; then exit 1; fi

# 執行備份
db2 "backup database $DB online"
RC=$?

# 無論備份成敗,嘗試重置
db2 "quiesce tablespaces for table $TABLE reset"
exit $RC

緊急情況:發起者連線已消失無法 RESET

  1. 嘗試 db2 force application all 清理所有連線
  2. 重啟資料庫:db2stop force && db2start (會清除記憶體中靜默狀態)
  3. 若重啟後仍殘留 (極罕見),需 IBM 支援協助修復控制檔案

總結檢查清單

  • [ ] 確認表空間狀態非 0x0000
  • [ ] 執行 db2stop force
  • [ ] 執行 db2dart <db> /DTSF
  • [ ] 解析報告獲取 Userid of quiescer
  • [ ] db2start 並以該授權 ID 登入
  • [ ] 執行 QUIESCE RESET
  • [ ] db2 list tablespaces 驗證 State = 0x0000
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved