基于DB2及PHP的應用系統(tǒng)跨平臺遷移實例講解_PHP教程
推薦:用PHP編程語言開發(fā)動態(tài)WAP網(wǎng)站WAP(無線通訊協(xié)議)是在數(shù)字移動電話、個人手持設備(PDA等)及計算機之間進行通訊的開放性全球標準協(xié)議。隨著無線通訊的不斷發(fā)展,靜態(tài)的WAP頁面在很多方面已經(jīng)不能滿足用戶個性化的要求,因此開發(fā)者可以在WAP服務器端使用諸如PHP等語言產(chǎn)生動態(tài)的WML頁面,來
本文主要介紹如何完成基于 DB2 的 PHP 應用系統(tǒng)從 AIX 平臺到 Linux 平臺的移植過程。文中包含了底層的 DB2 數(shù)據(jù)庫移植、上層的 PHP 應用系統(tǒng)移植的詳細步驟以及移植過程中可能遇到的問題和解決方法。
任務概述
系統(tǒng)遷移的工作主要分為以下幾個方面:
1.DB2 數(shù)據(jù)庫系統(tǒng)的跨平臺遷移
2.Apache 服務器與 php 應用系統(tǒng)的安裝和配置
下面我們就分 2 個方面分別介紹遷移和配置的具體步驟。
DB2 數(shù)據(jù)庫系統(tǒng)的跨平臺遷移
數(shù)據(jù)庫環(huán)境
源環(huán)境:AIX DB2 v8.1
目標環(huán)境:Linux DB2 v8.1
其中源數(shù)據(jù)庫中包含了 2 個數(shù)據(jù)庫 Instance:SRCDB1 與 SRCDB2。在 SRCDB1/SRCDB2 數(shù)據(jù)庫中,均包含了上百張數(shù)據(jù)庫表,并有很多的索引、外鍵約束、觸發(fā)器、存儲過程以及一些含有自增字段的表(含有 GENERATED ALWAYS AS IDENTITY 定義字段的表)。更為困難的是,我們并沒有關于這些數(shù)據(jù)庫對象的準確創(chuàng)建腳本。
遷移方案的選擇
如果遷移的源系統(tǒng)與目的系統(tǒng)屬于同一類型操作系統(tǒng),例如 Linux 之間的遷移,或者 AIX 系統(tǒng)之間的遷移,則情況相對簡單,DB2 本身已經(jīng)提供相關的實用工具來實現(xiàn)這種同類型平臺之間的數(shù)據(jù)庫移植,如: BACKUP 和 RESTORE 命令。當然,根據(jù)不同的情況還需要對實用工具所提供的參數(shù)有比較清楚的了解,譬如源系統(tǒng)與目標系統(tǒng)使用不同的表空間,就會涉及到表空間重定向的問題。由于本文的重點在于跨平臺的移植,這種方案顯然無法滿足需求,在此不再熬述。
那么,如何處理跨平臺的數(shù)據(jù)庫遷移問題?是不是可以使用實用工具 db2move 呢? db2move 只能遷移表中的數(shù)據(jù),而無法對索引、外鍵約束、觸發(fā)器和存儲過程等數(shù)據(jù)庫對象也實現(xiàn)遷移操作,而且對于包含自增字段數(shù)據(jù)的表來說,db2move 也有一定的限制。并且 db2move 只能把數(shù)據(jù)導入到已存在的數(shù)據(jù)庫的表中,無法顯示指定表空間的位置。由于在數(shù)據(jù)庫的系統(tǒng)遷移過程中,不僅需要遷移表中的數(shù)據(jù),還有索引、外鍵約束、觸發(fā)器和存儲過程等數(shù)據(jù)庫對象,與本文所選方案相比,還是后者更具優(yōu)勢�?梢詫� db2move 僅作為遷移表數(shù)據(jù)的一種備用方案。
而對于 export 和 import 來說,一次只能針對一張表進行導出導入操作,并且需要手動輸入 export 和 import 的命令以及需要導入導出的數(shù)據(jù)表名,在數(shù)據(jù)庫表的數(shù)量不多的情況下,這種方案也許還可以考慮,但也不并是最佳的方案。而在數(shù)據(jù)庫中表數(shù)量眾多的情況下,這種做法則是基本不現(xiàn)實的,而且 import 命令并不能保證自增字段的數(shù)據(jù)與原來的表數(shù)據(jù)保持一致。
本文根據(jù) DB2 對數(shù)據(jù)庫對象的處理機制,采用將 db2look 與 DDL、DML 腳本相結合的方式,并針對原數(shù)據(jù)庫中的觸發(fā)器、存儲過程以及外鍵約束等分別處理,給出了一種跨平臺 DB2 數(shù)據(jù)庫系統(tǒng)移植的可行方案。
下面我們以 SRCDB1 為例介紹一下這種情況下的數(shù)據(jù)庫整體遷移過程。SRCDB1 數(shù)據(jù)庫中有 SRCDB1、ASN、DB2DBG 和 SQLDBA 這四個數(shù)據(jù)庫模式。假設 SRCDB1 數(shù)據(jù)庫的用戶名為 user_srcdb1,密碼:pw_srcdb1。
在源系統(tǒng) (AIX) 上的相關操作
1.使用 db2look 命令抽取生成數(shù)據(jù)庫對象的 DDL 腳本
清單 1. db2look 命令及參數(shù)
# db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1
db2look :生成 DDL 以便重新創(chuàng)建在數(shù)據(jù)庫中定義的對象
語法: db2look -d DBname [-e] [-u Creator] [-z Schema]
[-t Tname1 Tname2...TnameN] [-tw Tname] [-h] [-o Fname] [-a]
[-m] [-c] [-r] [-l] [-x] [-xd] [-f] [-fd] [-td x]
[-noview] [-i userID] [-w password]
[-v Vname1 Vname2 ... VnameN] [-wrapper WrapperName]
[-server ServerName] [-nofed]
-d : 數(shù)據(jù)庫名稱,必選參數(shù)
-e : 抽取復制數(shù)據(jù)庫所需要的 DDL 文件,此選項將生成包含 DDL 語句的腳本
-o : 將輸出重定向到給定的文件名,如果未指定 -o 選項,則輸出默認轉到 stdout
-a : 為所有創(chuàng)建程序生成統(tǒng)計信息,如果指定了此選項,則將忽略 -u 選項
-i : 指定登錄到數(shù)據(jù)庫所在服務器時所使用的用戶標識
-w : 指定登錄到數(shù)據(jù)庫所在服務器時所使用的密碼
2.根據(jù)不同類型對象,分化數(shù)據(jù)庫對象 DDL 腳本
由于源數(shù)據(jù)庫中的各個表數(shù)據(jù)已經(jīng)是經(jīng)過觸發(fā)器、存儲過程等數(shù)據(jù)庫對象處理過的數(shù)據(jù),為保證數(shù)據(jù)庫中數(shù)據(jù)的一致性和完整性,這些數(shù)據(jù)庫對象應該在導入數(shù)據(jù)后再創(chuàng)建,以防止在導入表數(shù)據(jù)時重復執(zhí)行觸發(fā)器和存儲過程等數(shù)據(jù)庫對象生成錯誤數(shù)據(jù)。使用文本編輯器編輯由 db2look 生成的 srcdb1.ddl,將創(chuàng)建表及索引的 DDL 語句,創(chuàng)建外鍵約束的 DDL 語句以及創(chuàng)建觸發(fā)器和創(chuàng)建存儲過程的語句分為四組,分別保存為下面四個 DDL 腳本:
srcdb1_tables.ddl srcdb1_foriegnkeys.ddl
srcdb1_triggers.ddl srcdb1_procedures.ddl
srcdb1_tables.ddl :包含創(chuàng)建 SEQUENCE,UDF,TABLE,VIEW 等數(shù)據(jù)庫對象的 ddl 語句。
清單2. 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"
(
VARCHAR(254),
VARCHAR(254),
VARCHAR(254)
) RETURNS VARCHAR(254)
SPECIFIC SAMPLE _FUNC_1 ……;
CREATE TABLE " SRCDB1"." SAMPLE _TAB_1" (
"TAB_COL1" CHAR(20) NOT NULL ,
"TAB_COL2" VARCHAR(70) NOT NULL ) ;
CREATE TABLE " SRCDB1"." SAMPLE _TAB_2" (……);
……
CREATE TABLE " SRCDB1"." SAMPLE _TAB_N" (……);
CREATE VIEW SRCDB1.SAMPLE_VIEW_1 (VIEW_COL1,VIEW_COL2) AS SELECT distinct
COL1 , COL2 FROM SAMPLE_TAB WHERE ……;
CREATE VIEW SRCDB1.SAMPLE_VIEW_2 ……;
……
CREATE VIEW SRCDB1.SAMPLE_VIEW_N ……;
srcdb1_foriegnkeys.ddl :包含創(chuàng)建外鍵約束的 ddl 語句。
清單3. srcdb1_foriegnkeys.ddl 語句
ALTER TABLE " SRCDB1"."SAMPLE_FK_1"
ADD CONSTRAINT "SQL030903143850120" FOREIGN KEY
("FK_COL1")
REFERENCES " SRCDB1"."SAMPLE_TABLE"
("COL1");
ALTER TABLE " SRCDB1"."SAMPLE_FK_2" ADD ……;
……
ALTER TABLE " SRCDB1"."SAMPLE_FK_N" ADD ……;
srcdb1_triggers.ddl :包含創(chuàng)建觸發(fā)器的 ddl 語句。
清單 4. 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;
CREATE TRIGGER SRCDB1. SAMPLE_TRIG_2 ……;
……
CREATE TRIGGER SRCDB1. SAMPLE_TRIG_N ……;
srcdb1_procedures.ddl :包含創(chuàng)建 SQL 存儲過程以及 java 存儲過程的 ddl 語句。
分享:學習PHP必備的知識及工具數(shù)據(jù)庫操作:PEAR,這個里邊的DB庫大家都知道很好用,也很耐用。準推薦。PDO,這個在PHP。INI里配置一下,應該說是很不錯,很推薦。 ADODB,老同志了,大家也可以用一用,效果也還是很明顯,推薦。 框架: ZENDFRAMEWORK,這用說了,官方的大家伙,有了它就
- 相關鏈接:
- 教程說明:
PHP教程-基于DB2及PHP的應用系統(tǒng)跨平臺遷移實例講解
。