基于DB2及PHP的應(yīng)用系統(tǒng)跨平臺遷移實(shí)例講解(2)_PHP教程
推薦:用PHP編程語言開發(fā)動態(tài)WAP網(wǎng)站WAP(無線通訊協(xié)議)是在數(shù)字移動電話、個人手持設(shè)備(PDA等)及計算機(jī)之間進(jìn)行通訊的開放性全球標(biāo)準(zhǔn)協(xié)議。隨著無線通訊的不斷發(fā)展,靜態(tài)的WAP頁面在很多方面已經(jīng)不能滿足用戶個性化的要求,因此開發(fā)者可以在WAP服務(wù)器端使用諸如PHP等語言產(chǎn)生動態(tài)的WML頁面,來
清單 5. srcdb1_procedures.ddl語句
CREATE PROCEDURE " SRCDB1"." JAVA_PROCEDURE_1"
(
OUT SQLSTATE CHARACTER(5),
OUT ROWS_SUBMITED INTEGER,
IN BATCH_ID INTEGER,
IN LEVEL VARCHAR(4000)
)
DYNAMIC RESULT SETS 0
SPECIFIC SUBMIT_BATCH
EXTERNAL NAME 'Submit_batch!submit_batch'
LANGUAGE JAVA
PARAMETER STYLE JAVA
NOT DETERMINISTIC
FENCED THREADSAFE
MODIFIES SQL DATA
NO DBINFO;
CREATE PROCEDURE " SRCDB1"."JAVA_PROCEDURE_2" ……;
……
CREATE PROCEDURE " SRCDB1"."JAVA_PROCEDURE_N" ……;
SET CURRENT SCHEMA = " SRCDB1";
SET CURRENT PATH = "SYSIBM","SYSFUN"," SRCDB1";
CREATE PROCEDURE SRCDB1.SQL_PROCEDURE_1 (
IN hostname varchar(4000),
IN username varchar(4000),
OUT SQLCODE_OUT int )
SPECIFIC SRCDB1.SQL_PROCEDURE_1
LANGUAGE SQL
-------------------------------------------------
-- SQL Stored Procedure
-------------------------------------------------
P1: BEGIN
……
END P1 ;
CREATE PROCEDURE SRCDB1.SQL_PROCEDURE_2 ……;
……
CREATE PROCEDURE SRCDB1.SQL_PROCEDURE_N ……;
需要注意的是,db2 v6 版本的 db2look 尚未實(shí)現(xiàn)抽取如 UDF,TRIGGER,UserSpace,NodeGroup,BufferPool 等數(shù)據(jù)庫對象的 ddl 語句。從 db2 v7 開始,db2look 可以抽取上述對象的 DDL,但是依然無法抽取創(chuàng)建存儲過程對象的 ddl 語句。從 db2 v8.2 開始,完善了對 db2look 功能的支持,實(shí)現(xiàn)了存儲過程 ddl 語句的抽取功能。由于本文所涉及的源數(shù)據(jù)庫系統(tǒng)的版本較低(DB2 v8.1),因此需要采取上述方案獲取所有數(shù)據(jù)庫對象的 DDL 信息:
1). 從某個 DB2 v8.2 系統(tǒng)對 SRCDB1(DB2 v8.1 版本)執(zhí)行 CATALOG 操作:
db2 catalog db SRCDB1 as SRCDB1;
2). 從 DB2 v8.2 系統(tǒng)對 SRCDB1 進(jìn)行 db2look 抽取過程:
db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1;
這樣就可以獲取完整的數(shù)據(jù)庫對象 DDL 信息。
3.生成數(shù)據(jù)導(dǎo)出export腳本
使用 shell 腳本生成并導(dǎo)出所有數(shù)據(jù)的 DML 腳本,并將其重定向到 srcdb1_export.sql 文件中。對于熟悉 DB2 的用戶來說,應(yīng)該知道數(shù)據(jù)庫中創(chuàng)建的每個表、視圖、別名均對應(yīng) SYSCAT.TABLES 中一行記錄。因此可以通過相應(yīng)的數(shù)據(jù)庫 select 語句就可以獲取所有需要的數(shù)據(jù)庫表信息。根據(jù)需要,下述 shell 腳本將從系統(tǒng)表 SYSCAT.TABLES 中根據(jù) tabname 字段選出 SRCDB1 中所有 tabschema 表模式是 SRCDB1,ASN,SQLDBA,DB2DBG 的表名字,并根據(jù)它們的名字生成相應(yīng)的 export 導(dǎo)出語句,到達(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)計信息,只保留必要的 export 語句。通過修改上述腳本中所包含的 tabschema 信息,可以指定需要導(dǎo)出的表的范圍,也即遷移過程中需要的所有表名。所生成的 export 導(dǎo)出語句具有如下的命令形式:
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)計信息,只保留必要的 load 語句。與 export 導(dǎo)出語句類似,上述 shell 腳本從系統(tǒng)表中選出 SRCDB1 中所有表的名字,并根據(jù)它們的名字生成相應(yīng)的 import 導(dǎo)入語句,到達(dá)批量導(dǎo)入的目的。所生成的 import 導(dǎo)入語句命令形式如下:
db2 load from tablename.ixf of ixf insert into tablename;
5.處理數(shù)據(jù)庫表中的自增字段
對于需要加載的含有自增字段的表,即該表的 ixf 數(shù)據(jù)文件中有自增列的值, 可以在 load 命令中加入如下參數(shù)控制自增字段值:
1). modified by identityignore :加載的數(shù)據(jù)文件中有自增字段值,load 時忽略數(shù)據(jù)文件中自增字段值 ;
2). modified by identitymissing :加載的數(shù)據(jù)文件中沒有自增字段值,load 時自動生成自增字段值 ;
3). modified by identityoverride :加載的數(shù)據(jù)文件中有自增字段值,load 時使用數(shù)據(jù)文件中的自增字段值 。
為了使目標(biāo)數(shù)據(jù)庫中含有自增字段的表中數(shù)據(jù)與源數(shù)據(jù)庫中的數(shù)據(jù)保持一致,本文實(shí)例中選擇使用 modified by identityoverride 參數(shù),在導(dǎo)入數(shù)據(jù)時使用數(shù)據(jù)文件中的自增字段值。讀者可以根據(jù)不同情況選擇適當(dāng)?shù)目刂茀?shù)。
首先,在 srcdb1_tables.ddl 文件中查找所有包自增字段的表名 ( 含有 GENERATED ALWAYS AS IDENTITY 字段的表 ),然后在 srcdb1_load.sql 中將 modified by identityoverride 語句片段插入到這些含有自增字段的表所對應(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)前路徑下。
7.保存腳本和數(shù)據(jù)文件
將所有 DDL 腳本以及數(shù)據(jù)文件 *.ixf 復(fù)制到目標(biāo)系統(tǒng)所在站點(diǎn)。
LINUX 系統(tǒng)上的操作
1.通過命令行處理器(CLP)創(chuàng)建實(shí)例 SRCDB1:
# db2icrt SRCDB1
2.使用 CREATE DATABASE 命令創(chuàng)建數(shù)據(jù)庫 SRCDB1,創(chuàng)建必要的表空間及配置必要的數(shù)據(jù)庫參數(shù)。
# db2 create database SRCDB1
3.連接到數(shù)據(jù)庫 SRCDB1,執(zhí)行 srcdb1_tables.ddl 腳本創(chuàng)建緩沖池,表空間,UDF,表以及 Index,Sequence,視圖等數(shù)據(jù)庫對象。
# db2 connect to srcdb1
# db2 -tvf srcdb1_tables.ddl
4.進(jìn)入到放置 .ixf 數(shù)據(jù)文件的目錄,執(zhí)行下面的命令導(dǎo)入表數(shù)據(jù)。
# db2 -tvf srcdb1_load.sql
5.使用 srcdb1_foriegnkeys.ddl,srcdb1_triggers.ddl ,srcdb1_procedures.ddl 腳本文件創(chuàng)建外鍵約束,觸發(fā)器和存儲過程。
# db2 -tvf srcdb1_foriegnkeys.ddl
# db2 -tvf srcdb1_triggers.ddl
# db2 -tvf srcdb1_procedures.ddl
成功完成上述步驟后,數(shù)據(jù)庫的遷移工作基本完成。
分享:學(xué)習(xí)PHP必備的知識及工具數(shù)據(jù)庫操作:PEAR,這個里邊的DB庫大家都知道很好用,也很耐用。準(zhǔn)推薦。PDO,這個在PHP。INI里配置一下,應(yīng)該說是很不錯,很推薦。 ADODB,老同志了,大家也可以用一用,效果也還是很明顯,推薦。 框架: ZENDFRAMEWORK,這用說了,官方的大家伙,有了它就
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時間
- PHP中獎概率的抽獎算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
- 教程說明:
PHP教程-基于DB2及PHP的應(yīng)用系統(tǒng)跨平臺遷移實(shí)例講解(2)
。