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

DB2 V9.7 新功能:線上移動表 (ADMIN_MOVE_TABLE) 完整解析

     編輯:DB2 教學

簡介

目前大多數企業 DB2 生產環境要求高可用,無法承擔片刻停機損失。DBA 希望將表從一個表空間移至另一個表空間時,DB2 V9.7 以前版本實現目標較複雜,總有一段時間表對外不可用。DB2 V9.7 提供 ADMIN_MOVE_TABLE 預存程序將表資料移至同名新表物件,新表位於不同表空間具不同儲存特性,同時資料保持線上可供查詢、插入、更新、刪除存取。還可在表移動時為表生成新的優化壓縮字典。

DB2 V9.7 透過自動將表資料移至新表物件並同時允許資料保持線上進行查詢、插入、更新、刪除存取,降低企業總擁有成本 (TCO) 與複雜度。

資料移動過程中還可使用 ADMIN_MOVE_TABLE 修改表定義,如增刪欄、修改欄資料類型等。

線上資料移動流程

ADMIN_MOVE_TABLE 涉及三個表:

  • 來源表:資料將被移走的表,透過參數傳遞給預存程序。
  • 目標表:由預存程序根據傳入參數新建立,所有來源表資料將複製至此,最後重命名為與來源表相同名稱。
  • 暫存表:由預存程序建立,移動過程中臨時保存對來源表的所有 Update、Insert、Delete 操作。移動完成後刪除。

還涉及一個協議表(protocol table),用於保存資料移動過程資料與配置資訊:移動使用參數、COPY 開始/結束時間、COPY 使用選項等。定義如下:

清單 1. 協議表定義

C:\>db2 describe table systools.ADMIN_MOVE_TABLE

資料類型 列
列名        模式       資料類型名稱     長度  小數位  NULL
----------- ---------- ---------------- ----- ------ ----
TABSCHEMA   SYSIBM     VARCHAR          128   0      否
TABNAME     SYSIBM     VARCHAR          128   0      否
KEY         SYSIBM     VARCHAR          32    0      否
VALUE       SYSIBM     CLOB             10485760 0     是

關鍵字 (KEY) 皆有特定含義,診斷問題、調整效能時會用到。

ADMIN_MOVE_TABLE 過程首先建立來源表陰影副本。複製階段,DB2 使用觸發器捕獲來源表插入、更新、刪除操作並放入暫存表。複製階段結束後,暫存表捕獲的資料變更在陰影副本中重現。最後預存程序使表短暫離線交換物件名。預設使用 INSERT Cursor 方式從來源表複製資料到目標表,也可指定選項用 LOAD 方式複製以提高效能。

移動階段劃分

  1. INIT 階段:驗證資料移動可行性,初始化後續所需各種資料(目標表、暫存表、來源表觸發器)。
  2. COPY 階段:將來源表所有資料複製到 INIT 建立的目標表。此時若用戶對來源表執行 DML,INIT 建立觸發器捕獲並將更新/刪除/插入保存至暫存表。複製結束後若未用 COPY_WITH_INDEXES 選項,目標表建立新索引;如需要,來源/目標表建立輔助索引提高 REPLAY 效能。COPY 僅在 INIT 完成後開始。
  3. REPLAY 階段:COPY 階段保存到暫存表所有資料在此階段重放至目標表。僅在 COPY 完成後開始。
  4. VERIFY 階段:可選,檢查目標表與來源表內容是否等同。先在來源/目標表獲取 S 鎖,重放來源表所有變更,再與目標表比較。有唯一索引則比較兩表共同欄所有值,無唯一索引不比較 LONG/LOB/XML 列。驗證成本高,必須判斷是否真需。僅在 COPY 或 REPLAY 完成後開始。
  5. SWAP 階段:REPLAY 完成後或達到協議表 REPLAY_THRESHOLD 設定值時,來源表離線,DB2 交換來源/目標表名稱,重新上線。可在 COPY 完成後啟動,最好在 REPLAY 調用完成後啟動。
  6. CLEANUP 階段:刪除 INIT 建立的暫存表、觸發器。若調用未用 KEEP 選項,來源表也會刪除。可在 SWAP 後調用。

注意:ADMIN_MOVE_TABLE 可將來源表定義的觸發器、視圖同時移至目標表,但不支援將外鍵關係複製到目標表(無論來源表是外鍵父表或子表)。因此來源表有外鍵關係時,需先捕獲外鍵定義,移動完成後在目標表重建。

ADMIN_MOVE_TABLE 語法

DB2 有兩種合法語法形式。

方法 1:用於修改目標表指定部分定義。如表定義很長,僅想修改表空間,用此語法無需重建表直接修改。僅需在參數指定 data_tbsp、index_tbsp、lob_tbsp,其他選擇參數設為空。

方法 2:更靈活方便控制目標表建立,不使用預存程序建立目標表。讓我們在方法 1 無法建立目標表時手工建立。

清單 2. 方法 1 語法

>>-ADMIN_MOVE_TABLE--(--tabschema--,--tabname--,----------------->
>--data_tbsp--,--index_tbsp--,--lob_tbsp--,--mdc_cols--,-------->
>.-,-------.
>  V       |
>--partkey_cols--,--data_part--,--coldef--,----options-+--,----->
>--Operation--)-----------------------------------------------><

清單 3. 方法 2 語法

>>-ADMIN_MOVE_TABLE--(--tabschema--,--tabname--,----------------->
>.-,-------.
>  V       |
>--target_tabname--,----options-+--,--Operation--)-------------><

參數說明

  • tabschema:來源表綱要
  • tabname:來源表名稱
  • data_tbsp:目標表新資料表空間。有值時 index_tbsp、lob_tbsp 必須存在。未提供則用來源表資料表空間。
  • index_tbsp:目標表新索引表空間。提供時 data_tbsp、lob_tbsp 必須存在。未提供則用來源表索引表空間。
  • lob_tbsp:目標表大物件表空間。提供時 data_tbsp、index_tbsp 必須存在。未指定則用來源表 LOB 表空間。
  • mdc_cols:目標表多維叢集 (MDC) 欄,多欄逗號分隔。NULL 或 '-' 不建立 MDC 表。空串或 '-' 時檢查來源表是否指定 MDC,存在則使用來源表 MDC。
  • partkey_cols:目標表分區鍵欄,逗號分隔。NULL 或 '-' 不用 PARTITIONING KEY 子句。空串或 '-' 檢查來源表分區鍵,存在則使用。
  • data_part:目標表資料分區詳細規格。定義如何根據表一或多欄值儲存於多儲存目標。NULL 或 '-' 不用 PARTITIONING RANGE。空串或 '-' 檢查來源表分區模式,存在則使用。
  • coldef:目標表欄定義,方便修改為相容資料類型(欄名必須相同)。提供新增/刪除欄功能,僅有唯一索引或主鍵索引表才能刪除欄,且欄不能是主鍵/唯一鍵一部分。
  • target_tabname:目標表名稱,移動完成後作為新表名稱。指定時可變更:資料/索引/LOB 表空間、MDC 規格、分區鍵規格、資料分區規格、啟用/停用資料壓縮、新增欄。約束:來源/目標表綱要相同、目標表存在時必須為空、不能為型別表/物化查詢表/暫存表/遠端表/聚集表。
  • options:多選項逗號分隔:
    • KEEP:來源表另存為另一名稱 COPY(如 T1 移動後重命名 T1AAAAVxo),協議表 ORIGINAL 關鍵字下可找到新名稱。
    • COPY_USE_LOAD:用不可恢復 db2Load API 複製資料。使用時需包含 FORCE。
    • COPY_WITH_INDEXES:COPY 前建立索引。預設 COPY 後建立。優點:索引建立受交易日誌控制;缺點:COPY 效能下降(需維護索引、索引有許多偽刪除鍵)。
    • FORCE:SWAP 階段不檢查來源表定義是否修改。
    • NO_STATS:不啟動目標表 Runstats 或複製統計資訊。
    • COPY_STATS:SWAP 前從來源表複製統計資訊到目標表。
    • NO_AUTO_REVAL:防止自動表 Revalid,直接重建所有索引、視圖。
    • REORG:SWAP 前對目標表離線重組,可重構資料字典。
  • Operation:指定期望操作,通常為 MOVE。也可手工拆分依次執行 INIT、COPY、REPLAY、VERIFY、SWAP、CLEANUP。移動到某階段想取消時用 CANCEL。

ADMIN_MOVE_TABLE_UTIL 使用

DB2 移動表資料時用 systools.ADMIN_MOVE_TABLE 保存配置與狀態資訊,主鍵為 tabschema、tabname、key。ADMIN_MOVE_TABLE_UTIL 可更改協議表中定義鍵值。

清單 4. ADMIN_MOVE_TABLE_UTIL 語法

>>-ADMIN_MOVE_TABLE_UTIL--(--tabschema--,--tabname--,--action--,--key--,--value--)-><
  • Tabschema:準備修改的移動中表綱要
  • Tabname:準備修改的移動中表名稱
  • Action:UPSERT(插入更新,Key 存在則更新否則插入)、DELETE(刪除指定行)
  • Key:可取值:
    • COMMIT_AFTER_N_ROWS:COPY 階段多少行 Commit 一次,預設 0 不 Commit。
    • DEEPCOMPRESSION_SAMPLE:來源表壓縮時,建立壓縮字典採樣資料大小(KB),預設 0 不採樣。
    • COPY_ARRAY_SIZE:COPY_ARRAY_INSERT 時 ARRAY 大小,≤0 不使用。
    • COPY_INDEXSCHEMA:COPY 階段聚焦目標表索引綱要。
    • COPY_INDEXNAME:COPY 階段聚焦目標表索引名稱。
    • REPLAY_MAX_ERR_RETRIES:REPLAY 階段最大錯誤重試次數(常遇鎖超時/死鎖)。
    • REPLAY_THRESHOLD:一輪 REPLAY 應用暫存表指定行數後停止(即使暫存表有新條目)。
    • REORG_USE_TEMPSPACE:使用 REORG 選項時指定 REORG 過程暫存表空間。未指定則用相同表空間。
    • SWAP_MAX_RETRIES:SWAP 階段最大錯誤重試次數(常遇鎖超時/死鎖)。
  • Value:Key 指定關鍵字值,CLOB(10M),可為 NULL 或空串。

清單 5. ADMIN_MOVE_TABLE_UTIL 範例

CALL SYSPROC.ADMIN_MOVE_TABLE('SVALENTI','T1','','','','','','','','','INIT')
CALL SYSPROC.ADMIN_MOVE_TABLE_UTIL('SVALENTI','T1','UPSERT','DEEPCOMPRESSION_SAMPLE','30720')
CALL SYSPROC.ADMIN_MOVE_TABLE_UTIL('SVALENTI','T1','DELETE','COPY_INDEXSCHEMA','')
CALL SYSPROC.ADMIN_MOVE_TABLE_UTIL('SVALENTI','T1','DELETE','COPY_INDEXNAME','')
CALL SYSPROC.ADMIN_MOVE_TABLE('SVALENTI','T1','','','','','','','','','COPY')
CALL SYSPROC.ADMIN_MOVE_TABLE('SVALENTI','T1','','','','','','','','','REPLAY')
CALL SYSPROC.ADMIN_MOVE_TABLE('SVALENTI','T1','','','','','','','','','SWAP')

先用預設值啟動 INIT,再用 UTIL 修改壓縮採樣大小 30720 KB、刪除索引綱要/名稱設定,續行移動流程。

資料移動範例

使用線上表移動功能可進行:線上表壓縮、表重組/重分布、線上將表空間轉換為 LARGE 表空間、資料/索引/LONG 移至新不同表空間、支援表模式變更(增刪欄、修改類型、增修 MDC 維度、增修範圍分區鍵/表分區鍵)。

先建立測試表 EMP_TEST、建立索引、插入 10 萬筆測試資料(清單 6 略)。

測試一:移動表至新表空間

建立測試表空間 TS_TEST,將 EMP_TEST 資料、索引、LONG 全部移至 TS_TEST。

CREATE TABLESPACE TS_TEST;
CALL SYSPROC.ADMIN_MOVE_TABLE
('DB2ADMIN', 'EMP_TEST',
 'TS_TEST', 'TS_TEST', 'TS_TEST',
 '', '', '', '', '', 'MOVE');

結果集顯示:COPY 10 萬列耗時 9.1 秒,REPLAY 9.4 秒,SWAP 0.6 秒,合計 21.1 秒。移動過程絕大部分時間花費在 COPY 與 REPLAY 階段,優化應主要從這階段入手。

測試二:效能優化

COPY 有兩個對效能影響大的選項:COPY_WITH_INDEXES、COPY_USE_LOAD。

  • COPY_WITH_INDEXES:COPY 前建立索引,複製過程需維護索引,效能下降,優點是索引建立受交易保護。預設不使用。協議表 COPY_OPTS 出現 WITH_INDEXES 表示先建索引。
  • COPY_USE_LOAD:預設用 INSERT FROM CURSOR COPY,每列執行一個 Insert。可設 COPY_USE_LOAD 用 LOAD API 提高效能。優點:不記錄每列日誌、利用 CPU/IO 平行性、大塊 IO 提高 IO 效能。注意:LOAD API 不可恢復,最好 LOAD 後備份或用 COPY/KEEP 保存原始資料。
CALL SYSPROC.ADMIN_MOVE_TABLE
('USERID', 'EMP_TEST', 'NEW_TS', 'NEW_TS', 'NEW_TS', '', '', '', '', 'COPY_USE_LOAD,FORCE', 'MOVE')

結果:COPY 10 萬列 8 秒,REPLAY 2 秒,SWAP 1 秒,合計 13.1 秒。用 LOAD API 比 INSERT FROM CURSOR 快 36%。

總結

DB2 V9.7 ADMIN_MOVE_TABLE 協助 DBA 線上修改表(表空間、欄定義、壓縮、分區等),保持系統高可用。使用時常遇錯誤,主要與移動狀態有關:

  • 線上移動表操作所處狀態不允許執行指定操作
  • 無正在執行的線上移動表操作,不允許執行指定操作
  • 存在正在執行的線上移動表操作,不允許對同一表執行並行移動
  • 該表是線上移動操作目標表/暫存表/協議表,不可移動
  • 正在執行現場重組操作,不允許執行線上移動表複製階段
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved