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

IBM DB2 資料遷移大講堂:Export/Load 跨庫搬家全流程與自動化腳本

     編輯:DB2 教學

場景與目標

  • 需變更表空間類型(如 SMS→DMS)或將全庫資料遷移至新資料庫。
  • 測試環境:IBM x346, 3.2GHz×2, 4GB, RAID 1, DB2 V8.2.4, Win2000 Adv Server, DMS 表空間。
  • 實測 LOAD 速度:60–100 萬列/分。

八步遷移標準流程

  1. 導出 DDL:在 DB2 Control Center (db2cc) 勾選源庫所有表 → Generate DDL。
  2. 修改 DDL:將表空間子句改為目標表空間(如 IN GATHER INDEX IN GATHER)。
  3. 建立目標庫與表空間:
    CREATE DATABASE targetdb AUTOMATIC STORAGE NO;
    CREATE TABLESPACE GATHER MANAGED BY DATABASE
      USING (FILE 'D:\DB2\GATHER\GATHER.DBF' 10G)
      EXTENTSIZE 32 PREFETCHSIZE 32 BUFFERPOOL IBMDEFAULTBP;
    
  4. 執行 DDL 建表:在目標庫跑修改後的 DDL 腳本。
  5. 自動產生 EXPORT 腳本(見附錄 1 Java 程式)。
  6. 自動產生 LOAD 腳本(見附錄 2 Java 程式)。
  7. 源庫執行 EXPORT:產生 .ixf 檔案。
  8. 目標庫執行 LOAD:高速載入資料。

附錄 1:自動產生 EXPORT 腳本

public void createExportFile(Connection conn, String creator, String filePath) throws Exception {
    DBBase dbBase = new DBBase(conn);
    String sql = "SELECT name FROM sysibm.systables WHERE creator = '" + creator + "' AND type = 'T'";
    dbBase.executeQuery(sql);
    DBResult result = dbBase.getSelectDBResult();
    List list = new ArrayList<>();
    while (result.next()) list.add(result.getString(1));
    dbBase.close();

    StringBuilder sb = new StringBuilder();
    String nl = "\r\n";
    for (int i = 0; i < list.size(); i++) {
        sb.append("db2 \"export to aa").append(i+1).append(".ixf of ixf select * from ")
          .append(list.get(i)).append("\"").append(nl);
    }
    FileUtility.saveStringToFile(filePath, sb.toString(), false);
}

附錄 2:自動產生 LOAD 腳本

public void createLoadFile(Connection conn, String creator, String filePath) throws Exception {
    DBBase dbBase = new DBBase(conn);
    String sql = "SELECT name FROM sysibm.systables WHERE creator = '" + creator + "' AND type = 'T'";
    dbBase.executeQuery(sql);
    DBResult result = dbBase.getSelectDBResult();
    List list = new ArrayList<>();
    while (result.next()) list.add(result.getString(1));
    dbBase.close();

    StringBuilder sb = new StringBuilder();
    String nl = "\r\n";
    for (int i = 0; i < list.size(); i++) {
        sb.append("db2 \"load from aa").append(i+1).append(".ixf of ixf replace into ")
          .append(list.get(i)).append(" COPY NO without prompting\"").append(nl);
    }
    FileUtility.saveStringToFile(filePath, sb.toString(), false);
}

附錄 3/4:腳本範例

-- export.bat
db2 connect to testdb user test password test
db2 "export to aa1.ixf of ixf select * from table1"
db2 "export to aa2.ixf of ixf select * from table2"
db2 connect reset

-- load.bat
db2 connect to testdb user test password test
db2 "load from aa1.ixf of ixf replace into table1 COPY NO without prompting"
db2 "load from aa2.ixf of ixf replace into table2 COPY NO without prompting"
db2 connect reset

效能與避坑錦囊

  • IXF 格式:含資料與元資料,LOAD 可自動重建索引、檢查約束,比 DEL 快且安全。
  • COPY NO:不備份載入影像,速度最快;生產環境若需時間點恢復請用 COPY YES 並指定 USE TSM。
  • NONRECOVERABLE:大表載入可加此選項跳過日誌,載入後需立即 BACKUP。
  • 並行度:多張大表可同時開多個 LOAD 視窗,配合 CPU_PARALLELISM、DISK_PARALLELISM 參數壓榨 I/O 頻寬。
  • 外鍵處理:載入前 SET INTEGRITY ... OFF,載完再 IMMEDIATE CHECKED,避免逐列檢查拖慢。

結語

「導出 DDL → 改表空間 → 建新庫 → 自動化 Export/Load」四步走,配合 IXF 格式與 LOAD REPLACE,可在數小時內完成 TB 級跨庫遷移。自動化腳本一寫終身受用,是 DBA 遷移專案的標準化利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved