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

使用 AWK 實現 DB2 資料庫 Schema 跨環境同步自動化

     編輯:DB2 教學

應用場景

專案組共用 SIT (AIX/DB2 8.1) 整合測試資料庫,各開發人員 PC (Windows XP/DB2 8.1/Cygwin) 維護單元測試庫。模型變更導致 SIT Schema 更新時,需高效同步至各本地環境,並保留本地測試資料。

同步策略比較

  1. 人工發布變更腳本:易遺漏、依賴通知完整性
  2. 全量備份恢復:跨平台 (AIX→Windows) 磁碟管理差異大、資料量大超出 PC 容量
  3. 增量 Schema 比對同步 (本文方案):自動比對、最小人工干預、保留本地資料延續性

同步完整流程 (10 步驟)

  1. SIT 環境提取最新 Schema:db2look -d cusgadev -i db2admin -w pwd -e -a -o cusnew.sql
  2. 本地提取舊 Schema:db2look -d cusgadev -e -a -o cusold.sql
  3. 本地導出現有資料:db2move cusgadev export (產生 IXF 檔與 db2move.lst 清單)
  4. Cygwin 環境格式化兩 Schema 檔 (統一小寫、去首空白、合併多空白)
  5. 提取新/舊 Schema 表清單 (函數 gettbllist)
  6. 找出僅在舊庫/新庫存在的表 (函數 gettableonlyinone) → 處理 db2move.lst (刪除舊有、新表選擇性導入)
  7. 找出結構變更的表,生成重新導出資料 SQL (函數 gettableschema + AWK) → unload.sql
  8. 本地執行 db2 -z result.txt -tvf unload.sql 重新導出變更表資料,檢查 result.txt 無錯誤
  9. 從新 Schema 提取表空間名稱,生成緩衝池/表空間建立命令建議
  10. 重建資料庫:刪除舊庫 → 建立新庫 (codeset/territory) → 連接 → 調整日誌參數 → 建立緩衝池/表空間 → 執行 cusnew.sql 建立物件 → db2move load 載入資料 → 選擇性導入新表資料 → db2dart / 完整性檢查腳本驗證

核心 Shell/AWK 技術細節

Schema 格式化

sed -e "s/^[ ]*//" -e "s/[ ][ ]*/ /g" ${FILE} | tr [:upper:] [:lower:] > ${FILE}.tmp

提取表清單

grep -i "^[ ]*create[ ][ ]*table" $1 | sed -e "s/^[ ]*CREATE[ ][ ]*TABLE//" -e "s/(.*$//" | sort > $2

比對表差異

awk -F"." '{printf("%s\n", $2)}' | awk -F"\"" '{printf("%s ", $2)}' | sort 遍歷比對 grep 判斷是否存在於另一 Schema。

提取變更表 Schema 生成 unload SQL

awk -v _tblname=$1 'BEGIN{isThisTable=0}{if($1=="create"&&$2=="table"&&match($0, "\""_tblname"\"")){isThisTable=1; printf("create table %s (\n", _tblname)} else if(isThisTable){if(match($0,";")){isThisTable=0; if($1=="in") printf(";\n", $0); else printf("%s\n", $0)} else if(match($0,"timestamp not null with default ,")){printf("%s timestamp not null with default current timestamp ,\n", $1)} else printf("%s\n", $0)}}' $2 > $3

表空間提取與建立命令生成

grep -i "^[ ]*in[ ]" ${NEWDBSCHEMA} | grep ";" | awk '{printf("%s\n", $2); if(NF>3 && $3=="INDEX" && $4=="IN") printf("%s\n", $5)}' | sort | uniq → 迴圈輸出 CREATE TABLESPACE ... PAGESIZE 8K MANAGED BY DATABASE USING (FILE '<filename>' 50000) bufferpool bf81

完整性檢查腳本

awk -F"!" -v _dbname=${DBNAME} 'BEGIN{printf("connect to %s;\n", _dbname)}{printf("set integrity for %s immediate checked;\n", $2)}' db2move.lst > ${DBNAME}.integrity.sql → db2 -tvf 執行。

關鍵優勢

  • 全自動比對差異,僅處理變更表,大幅減少資料移動量
  • 保留開發者本地測試資料 (非變更表)
  • 跨平台 (AIX→Windows/Cygwin) 相容
  • 模組化函數設計,易維護擴展

注意事項

  • 欄位型別變更需人工調整生成的 unload.sql
  • 新表若有外鍵關聯,需同步導入父表資料
  • 表空間檔案路徑需根據 Windows 磁碟實際情況修改
  • 大資料量環境建議分批次執行 load
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved