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

DB2 外部資料匯入實戰:四大核心避坑指南

     編輯:DB2 教學

資料庫上線前的大量資料匯入 (Initial Load) 是專案交付關鍵路徑。DB2 提供 IMPORT (行級處理、觸發器生效) 與 LOAD (頁級直寫、高效能) 兩大工具,但實際操作中常遇預設值失效、效能瓶頸、日誌暴增、格式不符等問題。本文歸納四大核心場景與解決方案,助您順利完成資料遷移。

一、預設值 vs NULL 值:誰生效?

現象

目標表欄位定義 DEFAULT 'SYSDATE' 且 NOT NULL,匯入檔案該欄位為空,結果寫入 NULL 導致錯誤,或寫入 NULL 而非預期預設值。

根因

  • 預設行為:IMPORT/LOAD 預設不使用資料表定義的 DEFAULT 值,空欄位直接寫入 NULL。
  • 若欄位有 NOT NULL 約束 → 匯入失敗 (SQL0407N)。
  • 若欄位允許 NULL → 靜默寫入 NULL,業務邏輯錯誤。

解決方案

# IMPORT 指定 USEDEFAULTS 選項
db2 "import from data.del of del modified by usedefaults insert into target_table"

# LOAD 同樣支援
db2 "load from data.del of del modified by usedefaults insert into target_table"

效果:檔案欄位有值 → 用檔案值;檔案欄位為空 → 自動套用 DEFAULT 定義。建議:所有 NOT NULL + DEFAULT 欄位匯入必加 USEDEFAULTS。

二、大量匯入效能優化三板斧

手段適用工具原理典型提升
選擇 LOAD 而非 IMPORT LOAD 繞過 SQL 層、不寫日誌 (可選)、頁級直寫容器 10x - 100x
客戶端匯入加 COMPOUND=x IMPORT/LOAD (CLP) 將 x 筆記錄打包為一個網路封包,減少往返延遲,客戶端讀檔與伺服器寫入流水線並行 2x - 5x (WAN 環境更明顯)
設定 COMMITCOUNT n / SAVECOUNT n IMPORT / LOAD 每 n 筆提交/存檔點,避免單一巨大交易撐爆作用中日誌空間,失敗時可從上一存檔點 RESTARTCOUNT 續傳 避免失敗重頭來過,間接提升整體吞吐

實戰參數建議 (百萬筆以上)

# LOAD 範例 (非可恢復表空間可加 NONRECOVERABLE 進一步提速)
db2 "load from data.del of del
     modified by compound=100 usedefaults
     savecount 5000
     messages load.msg
     insert into target_table nonrecoverable"

# IMPORT 範例
db2 "import from data.del of del
     modified by compound=100 usedefaults
     commitcount 500
     restartcount 0
     messages imp.msg
     insert into target_table"

注意:SAVECOUNT/COMMITCOUNT 過小 (如 100) 會頻繁同步降低效能;過大 (如 100,000) 風險集中。建議 500-5,000 區間根據日誌空間與網路延遲調整。

三、日誌空間耗盡與斷點續傳

問題

大量 INSERT 產生海量作用中日誌,觸發 SQL0964C (交易日誌滿) 導致匯入中斷,且無 COMMITCOUNT 時整筆交易回滾,耗時極長。

對策

  1. 必加 COMMITCOUNT n (IMPORT) 或 SAVECOUNT n (LOAD),建立定期提交/存檔點。
  2. 失敗後,查看訊息檔找到最後成功提交/存檔的筆數 N。
  3. 重啟匯入並指定 RESTARTCOUNT N 跳過已匯入資料:
db2 "import from data.del of del
     modified by compound=100 usedefaults
     commitcount 500
     restartcount 125000
     messages imp_restart.msg
     insert into target_table"

此機制將「全量重跑」轉為「增量續傳」,大幅降低失敗成本。

四、檔案格式不符與分隔符優先級陷阱

常見格式衝突

  • 欄位分隔符非逗號 (如分號 ;、Tab \t、豎線 |)
  • 記錄換行符被誤判為欄位值一部分 (多行記錄)
  • 字串包含分隔符字元 (需引號包裹)

解決工具:MODIFIED BY filetype-mod 修飾符

場景修飾符範例說明
欄位分隔符為分號 coldel; 覆蓋預設逗號
欄位分隔符為 Tab coldel\x09 十六進位表示
字串引號為單引號 chardel' 預設雙引號
記錄分隔符非換行 (固定長度) reclen=120 指定記錄長度
多行記錄 (換行符優先級過高) delprioritychar 關鍵:提升欄位分隔符優先級高於記錄分隔符,避免單筆記錄被拆成多行

綜合範例 (CSV、分號分隔、雙引號包裹、含多行欄位)

db2 "import from data.csv of del
     modified by coldel; chardel\" delprioritychar usedefaults
     commitcount 1000
     messages imp.log
     insert into target_table"

匯入前檢查清單

  1. [ ] 目標表 DDL 已確認 (NOT NULL、DEFAULT、CHECK 約束)
  2. [ ] 匯入檔編碼與資料庫 CODEPAGE 一致 (或指定 codepage=xxx)
  3. [ ] 選擇 LOAD (大量、無觸發器需求) 或 IMPORT (需觸發器、RI 檢查、小量)
  4. [ ] 加上 USEDEFAULTS、COMPOUND、COMMITCOUNT/SAVECOUNT
  5. [ ] 依檔案格式設定 COLDEL、CHARDEL、DELPRIORITYCHAR
  6. [ ] 預留足夠作用中日誌空間 (LOGFILSIZ、LOGPRIMARY、LOGSECOND)
  7. [ ] 規劃失敗重啟腳本 (自動讀取訊息檔最後提交筆數 → RESTARTCOUNT)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved