DB2數(shù)據(jù)庫(kù)及PHP應(yīng)用系統(tǒng)跨平臺(tái)遷移之實(shí)例演示
文章主要描述的是DB2數(shù)據(jù)庫(kù)及PHP的實(shí)際應(yīng)用系統(tǒng)跨平臺(tái)遷移實(shí)例講解,在實(shí)際操作中需我們大家注意的是DB2 v6 版本的 DB2look 尚未實(shí)現(xiàn)抽取如 UDF,TRIGGER,UserSpace,NodeGroup,BufferPool 等數(shù)據(jù)庫(kù)對(duì)象的 ddl 語(yǔ)句。
從 DB2 v7 開(kāi)始,DB2look 可以抽取上述對(duì)象的 DDL,但是依然無(wú)法抽取創(chuàng)建存儲(chǔ)過(guò)程對(duì)象的 ddl 語(yǔ)句。
從 DB2 v8.2 開(kāi)始,完善了對(duì) DB2look 功能的支持,實(shí)現(xiàn)了存儲(chǔ)過(guò)程 ddl 語(yǔ)句的抽取功能。由于本文所涉及的源數(shù)據(jù)庫(kù)系統(tǒng)的版本較低(DB2 v8.1),因此需要采取上述方案獲取所有數(shù)據(jù)庫(kù)對(duì)象的 DDL 信息:
1). 從某個(gè) DB2 v8.2 系統(tǒng)對(duì) SRCDB1(DB2數(shù)據(jù)庫(kù) v8.1 版本)執(zhí)行 CATALOG 操作:
- DB2 catalog db SRCDB1 as SRCDB1;
2). 從 DB2 v8.2 系統(tǒng)對(duì) SRCDB1 進(jìn)行 DB2look 抽取過(guò)程:
- DB2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1;
這樣就可以獲取完整的數(shù)據(jù)庫(kù)對(duì)象 DDL 信息。
3.生成數(shù)據(jù)導(dǎo)出export腳本
使用 shell 腳本生成并導(dǎo)出所有數(shù)據(jù)的 DML 腳本,并將其重定向到 srcdb1_export.sql 文件中。對(duì)于熟悉 DB2數(shù)據(jù)庫(kù)的用戶來(lái)說(shuō),應(yīng)該知道數(shù)據(jù)庫(kù)中創(chuàng)建的每個(gè)表、視圖、別名均對(duì)應(yīng) SYSCAT.TABLES 中一行記錄。因此可以通過(guò)相應(yīng)的數(shù)據(jù)庫(kù) select 語(yǔ)句就可以獲取所有需要的數(shù)據(jù)庫(kù)表信息。
根據(jù)需要,下述 shell 腳本將從系統(tǒng)表 SYSCAT.TABLES 中根據(jù) tabname 字段選出 SRCDB1 中所有 tabschema 表模式是 SRCDB1,ASN,SQLDBA,DB2DBG 的表名字,并根據(jù)它們的名字生成相應(yīng)的 export 導(dǎo)出語(yǔ)句,到達(dá)批量導(dǎo)出的目的。rtrim 函數(shù)用于去除 tabname 字段數(shù)據(jù)的右邊的空格。
清單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,刪除頭部和尾部所顯示的統(tǒng)計(jì)信息,只保留必要的 export 語(yǔ)句。通過(guò)修改上述腳本中所包含的 tabschema 信息,可以指定需要導(dǎo)出的表的范圍,也即遷移過(guò)程中需要的所有表名。所生成的 export 導(dǎo)出語(yǔ)句具有如下的命令形式:
- DB2 export to tablename.ixf of ixf select * from tablename;
4.生成數(shù)據(jù)導(dǎo)入 load 腳本
使用 shell 腳本生成 load 腳本用于將數(shù)據(jù)導(dǎo)入目標(biāo)系統(tǒng):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,刪除頭部和尾部的統(tǒng)計(jì)信息,只保留必要的 load 語(yǔ)句。與 export 導(dǎo)出語(yǔ)句類似,上述 shell 腳本從系統(tǒng)表中選出 SRCDB1 中所有表的名字,并根據(jù)它們的名字生成相應(yīng)的 import 導(dǎo)入語(yǔ)句,到達(dá)批量導(dǎo)入的目的。所生成的 import 導(dǎo)入語(yǔ)句命令形式如下:
- DB2 load from tablename.ixf of ixf insert into tablename;
5.處理數(shù)據(jù)庫(kù)表中的自增字段
對(duì)于需要加載的含有自增字段的表,即該表的 ixf 數(shù)據(jù)文件中有自增列的值, 可以在 load 命令中加入如下參數(shù)控制自增字段值:
1). modified by identityignore :加載的數(shù)據(jù)文件中有自增字段值,load 時(shí)忽略數(shù)據(jù)文件中自增字段值 ;
2). modified by identitymissing :加載的數(shù)據(jù)文件中沒(méi)有自增字段值,load 時(shí)自動(dòng)生成自增字段值 ;
3). modified by identityoverride :加載的數(shù)據(jù)文件中有自增字段值,load 時(shí)使用數(shù)據(jù)文件中的自增字段值 。
為了使目標(biāo)數(shù)據(jù)庫(kù)中含有自增字段的表中數(shù)據(jù)與源數(shù)據(jù)庫(kù)中的數(shù)據(jù)保持一致,本文實(shí)例中選擇使用 modified by identityoverride 參數(shù),在導(dǎo)入數(shù)據(jù)時(shí)使用數(shù)據(jù)文件中的自增字段值。讀者可以根據(jù)不同情況選擇適當(dāng)?shù)目刂茀?shù)。
首先,在 srcdb1_tables.ddl 文件中查找所有包自增字段的表名 ( 含有 GENERATED ALWAYS AS IDENTITY 字段的表 ),然后在 srcdb1_load.sql 中將 modified by identityoverride 語(yǔ)句片段插入到這些含有自增字段的表所對(duì)應(yīng)的 load 命令行中。
清單8. load 腳本中自增字段處理
- DB2 load from test.ixf of ixf modified by identityoverride insert into TEST;
6.執(zhí)行導(dǎo)出腳本
執(zhí)行導(dǎo)出腳本,導(dǎo)出所有表的數(shù)據(jù) 。
- # DB2 -tvf srcdb1_export.sql
導(dǎo)出的表數(shù)據(jù)以 ixf 格式存放于當(dāng)前路徑下。
以上的相關(guān)內(nèi)容就是對(duì)DB2數(shù)據(jù)庫(kù)及PHP的應(yīng)用系統(tǒng)跨平臺(tái)遷移實(shí)例講解的介紹,望你能有所收獲。
【編輯推薦】
- 實(shí)現(xiàn)DB2備份數(shù)據(jù)庫(kù)的操作方案漫談
- DB2歸檔日志的管理方案從哪幾點(diǎn)入手?
- 對(duì)DB2取得當(dāng)前時(shí)間的正確解析
- DB2性能調(diào)優(yōu)中存在哪些問(wèn)題,如何破解?
- DB2 數(shù)據(jù)類型如何才能輕松接觸?