將基於 DB2 UDB v8.1 的 PHP 應用系統從 AIX 遷移至 Linux,核心工作包含:
源環境:AIX + DB2 v8.1(雙實例 SRCDB1/SRCDB2),缺乏準確建立腳本。
db2look 導出 DDL + Shell 腳本批量 EXPORT/LOAD,分類處理觸發器/預存程序/外鍵,支援自增欄位覆寫,適用異構平台。# db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1
關鍵參數:-e 產生 DDL,-a 所有物件,-i/-w 認證。
注意:DB2 v8.1 的 db2look 不支援導出預存程序 DDL。解決辦法:從一台 DB2 v8.2+ 系統對 SRCDB1 執行 CATALOG 再跑 db2look,即可獲得完整物件定義。
為確保資料一致性,依建立順序將 srcdb1.ddl 手工拆分為四檔:
| 檔案 | 內容 |
|---|---|
srcdb1_tables.ddl | SEQUENCE、UDF、TABLE、VIEW、INDEX 等 |
srcdb1_foreignkeys.ddl | ALTER TABLE ADD CONSTRAINT FOREIGN KEY |
srcdb1_triggers.ddl | CREATE TRIGGER |
srcdb1_procedures.ddl | CREATE PROCEDURE (SQL/Java) |
範例片段:
-- srcdb1_tables.ddl
CREATE SEQUENCE "SRCDB1"."SAMPLE_SEQ_1" AS INTEGER MINVALUE 1 MAXVALUE 9999999999 START WITH 1 INCREMENT BY 1;
CREATE FUNCTION "SRCDB1"."SAMPLE_FUNC_1" (...) RETURNS VARCHAR(254) ...;
CREATE TABLE "SRCDB1"."SAMPLE_TAB_1" ("TAB_COL1" CHAR(20) NOT NULL, "TAB_COL2" VARCHAR(70) NOT NULL);
CREATE VIEW SRCDB1.SAMPLE_VIEW_1 ...;
-- srcdb1_foreignkeys.ddl
ALTER TABLE "SRCDB1"."SAMPLE_FK_1" ADD CONSTRAINT "SQL030903143850120" FOREIGN KEY ("FK_COL1") REFERENCES "SRCDB1"."SAMPLE_TABLE" ("COL1");
-- srcdb1_triggers.ddl
CREATE TRIGGER SRCDB1.SAMPLE_TRIG_1 AFTER UPDATE OF col1 ON SRCDB1.SAMPLE_TAB REFERENCING NEW AS n FOR EACH ROW MODE DB2SQL WHEN (n.col1 > 3) BEGIN ATOMIC UPDATE SAMPLE_TAB SET (col2) = 'anotherValue' WHERE col1 = n.col1; END;
-- srcdb1_procedures.ddl
CREATE PROCEDURE "SRCDB1"."JAVA_PROCEDURE_1" (...) LANGUAGE JAVA EXTERNAL NAME 'Submit_batch!submit_batch' ...;
CREATE PROCEDURE SRCDB1.SQL_PROCEDURE_1 (...) LANGUAGE SQL P1: BEGIN ... END P1;
# db2 "select 'export to ' || rtrim(tabname) || '.ixf of ixf select * from ' || rtrim(tabname) || ';' from syscat.tables where tabschema in ('SRCDB1','ASN','SQLDBA','DB2DBG')" > srcdb1_export.sql
編輯檔案,移除首尾統計資訊,保留純 db2 export to ... 指令。
# db2 "select 'load from ' || rtrim(tabname) || '.ixf of ixf insert into ' || rtrim(tabname) || ';' from syscat.tables where tabschema in ('SRCDB1','ASN','SQLDBA','DB2DBG')" > srcdb1_load.sql
同樣清理首尾,得到 db2 load from ... 指令集。後續將在第二部分於 Linux 端執行並加入 identityoverride 參數。
本部分完成了源端所有資料庫物件 DDL 導出、分類拆分、資料匯出腳本與載入腳本生成。第二部分將詳述 Linux 端資料庫重建、資料載入、自增欄位處理及 Apache/PHP 環境建置全過程。