文章主要描述的是DB2數據庫及PHP的實際應用系統跨平台遷移實例講解,在實際操作中需我們大家注意的是DB2 v6 版本的 DB2look 尚未實現抽取如 UDF,TRIGGER,UserSpace,NodeGroup,BufferPool 等數據庫對象的 ddl 語句。
從 DB2 v7 開始,DB2look 可以抽取上述對象的 DDL,但是依然無法抽取創建存儲過程對象的 ddl 語句。
從 DB2 v8.2 開始,完善了對 DB2look 功能的支持,實現了存儲過程 ddl 語句的抽取功能。由於本文所涉及的源數據庫系統的版本較低DB2 v8.1),因此需要采取上述方案獲取所有數據庫對象的 DDL 信息:
1). 從某個 DB2 v8.2 系統對 SRCDB1DB2數據庫 v8.1 版本)執行 CATALOG 操作:
- DB2 catalog db SRCDB1 as SRCDB1;
2). 從 DB2 v8.2 系統對 SRCDB1 進行 DB2look 抽取過程:
- DB2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1;
這樣就可以獲取完整的數據庫對象 DDL 信息。
3.生成數據導出export腳本
使用 shell 腳本生成並導出所有數據的 DML 腳本,並將其重定向到 srcdb1_export.sql 文件中。對於熟悉 DB2數據庫的用戶來說,應該知道數據庫中創建的每個表、視圖、別名均對應 SYSCAT.TABLES 中一行記錄。因此可以通過相應的數據庫 select 語句就可以獲取所有需要的數據庫表信息。
根據需要,下述 shell 腳本將從系統表 SYSCAT.TABLES 中根據 tabname 字段選出 SRCDB1 中所有 tabschema 表模式是 SRCDB1,ASN,SQLDBA,DB2DBG 的表名字,並根據它們的名字生成相應的 export 導出語句,到達批量導出的目的。rtrim 函數用於去除 tabname 字段數據的右邊的空格。
清單6. 生成export腳本
- # 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 ;
編輯生成的 srcdb1_export.sql,刪除頭部和尾部所顯示的統計信息,只保留必要的 export 語句。通過修改上述腳本中所包含的 tabschema 信息,可以指定需要導出的表的范圍,也即遷移過程中需要的所有表名。所生成的 export 導出語句具有如下的命令形式:
- DB2 export to tablename.ixf of ixf select * from tablename;
4.生成數據導入 load 腳本
使用 shell 腳本生成 load 腳本用於將數據導入目標系統:srcdb1_load.sql
清單7. 生成 load 腳本
- # 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;
編輯生成的 srcdb1_load.sql,刪除頭部和尾部的統計信息,只保留必要的 load 語句。與 export 導出語句類似,上述 shell 腳本從系統表中選出 SRCDB1 中所有表的名字,並根據它們的名字生成相應的 import 導入語句,到達批量導入的目的。所生成的 import 導入語句命令形式如下:
- DB2 load from tablename.ixf of ixf insert into tablename;
5.處理數據庫表中的自增字段
對於需要加載的含有自增字段的表,即該表的 ixf 數據文件中有自增列的值, 可以在 load 命令中加入如下參數控制自增字段值:
1). modified by identityignore :加載的數據文件中有自增字段值,load 時忽略數據文件中自增字段值 ;
2). modified by identitymissing :加載的數據文件中沒有自增字段值,load 時自動生成自增字段值 ;
3). modified by identityoverride :加載的數據文件中有自增字段值,load 時使用數據文件中的自增字段值 。
為了使目標數據庫中含有自增字段的表中數據與源數據庫中的數據保持一致,本文實例中選擇使用 modified by identityoverride 參數,在導入數據時使用數據文件中的自增字段值。讀者可以根據不同情況選擇適當的控制參數。
首先,在 srcdb1_tables.ddl 文件中查找所有包自增字段的表名 ( 含有 GENERATED ALWAYS AS IDENTITY 字段的表 ),然後在 srcdb1_load.sql 中將 modified by identityoverride 語句片段插入到這些含有自增字段的表所對應的 load 命令行中。
清單8. load 腳本中自增字段處理
- DB2 load from test.ixf of ixf modified by identityoverride insert into TEST;
6.執行導出腳本
執行導出腳本,導出所有表的數據 。
- # DB2 -tvf srcdb1_export.sql
導出的表數據以 ixf 格式存放於當前路徑下。
以上的相關內容就是對DB2數據庫及PHP的應用系統跨平台遷移實例講解的介紹,望你能有所收獲。