午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

基于DB2及PHP的應(yīng)用系統(tǒng)跨平臺(tái)遷移詳細(xì)步驟(一)

瀏覽:23日期:2024-02-22 16:15:54

本文主要介紹如何完成基于 DB2 的 PHP 應(yīng)用系統(tǒng)從 AIX 平臺(tái)到 Linux 平臺(tái)的移植過(guò)程。文中包含了底層的 DB2 數(shù)據(jù)庫(kù)移植、上層的 PHP 應(yīng)用系統(tǒng)移植的詳細(xì)步驟以及移植過(guò)程中可能遇到的問(wèn)題和解決方法。

任務(wù)概述

系統(tǒng)遷移的工作主要分為以下幾個(gè)方面:

1.DB2 數(shù)據(jù)庫(kù)系統(tǒng)的跨平臺(tái)遷移

2.Apache 服務(wù)器與 php 應(yīng)用系統(tǒng)的安裝和配置

下面我們就分 2 個(gè)方面分別介紹遷移和配置的具體步驟。

DB2 數(shù)據(jù)庫(kù)系統(tǒng)的跨平臺(tái)遷移

數(shù)據(jù)庫(kù)環(huán)境

源環(huán)境:AIX+DB2 v8.1

目標(biāo)環(huán)境:Linux+DB2 v8.1

其中源數(shù)據(jù)庫(kù)中包含了 2 個(gè)數(shù)據(jù)庫(kù) Instance:SRCDB1 與 SRCDB2。在 SRCDB1/SRCDB2 數(shù)據(jù)庫(kù)中,均包含了上百?gòu)垟?shù)據(jù)庫(kù)表,并有很多的索引、外鍵約束、觸發(fā)器、存儲(chǔ)過(guò)程以及一些含有自增字段的表(含有 GENERATED ALWAYS AS IDENTITY 定義字段的表)。更為困難的是,我們并沒(méi)有關(guān)于這些數(shù)據(jù)庫(kù)對(duì)象的準(zhǔn)確創(chuàng)建腳本。

遷移方案的選擇

如果遷移的源系統(tǒng)與目的系統(tǒng)屬于同一類(lèi)型操作系統(tǒng),例如 Linux 之間的遷移,或者 AIX 系統(tǒng)之間的遷移,則情況相對(duì)簡(jiǎn)單,DB2 本身已經(jīng)提供相關(guān)的實(shí)用工具來(lái)實(shí)現(xiàn)這種同類(lèi)型平臺(tái)之間的數(shù)據(jù)庫(kù)移植,如: BACKUP 和 RESTORE 命令。當(dāng)然,根據(jù)不同的情況還需要對(duì)實(shí)用工具所提供的參數(shù)有比較清楚的了解,譬如源系統(tǒng)與目標(biāo)系統(tǒng)使用不同的表空間,就會(huì)涉及到表空間重定向的問(wèn)題。由于本文的重點(diǎn)在于跨平臺(tái)的移植,這種方案顯然無(wú)法滿足需求,在此不再熬述。

那么,如何處理跨平臺(tái)的數(shù)據(jù)庫(kù)遷移問(wèn)題?是不是可以使用實(shí)用工具 db2move 呢? db2move 只能遷移表中的數(shù)據(jù),而無(wú)法對(duì)索引、外鍵約束、觸發(fā)器和存儲(chǔ)過(guò)程等數(shù)據(jù)庫(kù)對(duì)象也實(shí)現(xiàn)遷移操作,而且對(duì)于包含自增字段數(shù)據(jù)的表來(lái)說(shuō),db2move 也有一定的限制。并且 db2move 只能把數(shù)據(jù)導(dǎo)入到已存在的數(shù)據(jù)庫(kù)的表中,無(wú)法顯示指定表空間的位置。由于在數(shù)據(jù)庫(kù)的系統(tǒng)遷移過(guò)程中,不僅需要遷移表中的數(shù)據(jù),還有索引、外鍵約束、觸發(fā)器和存儲(chǔ)過(guò)程等數(shù)據(jù)庫(kù)對(duì)象,與本文所選方案相比,還是后者更具優(yōu)勢(shì)。可以將 db2move 僅作為遷移表數(shù)據(jù)的一種備用方案。

而對(duì)于 export 和 import 來(lái)說(shuō),一次只能針對(duì)一張表進(jìn)行導(dǎo)出導(dǎo)入操作,并且需要手動(dòng)輸入 export 和 import 的命令以及需要導(dǎo)入導(dǎo)出的數(shù)據(jù)表名,在數(shù)據(jù)庫(kù)表的數(shù)量不多的情況下,這種方案也許還可以考慮,但也不并是最佳的方案。而在數(shù)據(jù)庫(kù)中表數(shù)量眾多的情況下,這種做法則是基本不現(xiàn)實(shí)的,而且 import 命令并不能保證自增字段的數(shù)據(jù)與原來(lái)的表數(shù)據(jù)保持一致。

本文根據(jù) DB2 對(duì)數(shù)據(jù)庫(kù)對(duì)象的處理機(jī)制,采用將 db2look 與 DDL、DML 腳本相結(jié)合的方式,并針對(duì)原數(shù)據(jù)庫(kù)中的觸發(fā)器、存儲(chǔ)過(guò)程以及外鍵約束等分別處理,給出了一種跨平臺(tái) DB2 數(shù)據(jù)庫(kù)系統(tǒng)移植的可行方案。

下面我們以 SRCDB1 為例介紹一下這種情況下的數(shù)據(jù)庫(kù)整體遷移過(guò)程。SRCDB1 數(shù)據(jù)庫(kù)中有 SRCDB1、ASN、DB2DBG 和 SQLDBA 這四個(gè)數(shù)據(jù)庫(kù)模式。假設(shè) SRCDB1 數(shù)據(jù)庫(kù)的用戶(hù)名為 user_srcdb1,密碼:pw_srcdb1。

在源系統(tǒng) (AIX) 上的相關(guān)操作

1.使用 db2look 命令抽取生成數(shù)據(jù)庫(kù)對(duì)象的 DDL 腳本

清單 1. db2look 命令及參數(shù)

# db2look -d SRCDB1 -e -o srcdb1.ddl -a -i user_srcdb1 -w pw_srcdb1

db2look :生成 DDL 以便重新創(chuàng)建在數(shù)據(jù)庫(kù)中定義的對(duì)象

語(yǔ)法: 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ù)庫(kù)名稱(chēng),必選參數(shù)

-e : 抽取復(fù)制數(shù)據(jù)庫(kù)所需要的 DDL 文件,此選項(xiàng)將生成包含 DDL 語(yǔ)句的腳本

-o : 將輸出重定向到給定的文件名,如果未指定 -o 選項(xiàng),則輸出默認(rèn)轉(zhuǎn)到 stdout

-a : 為所有創(chuàng)建程序生成統(tǒng)計(jì)信息,如果指定了此選項(xiàng),則將忽略 -u 選項(xiàng)

-i : 指定登錄到數(shù)據(jù)庫(kù)所在服務(wù)器時(shí)所使用的用戶(hù)標(biāo)識(shí)

-w : 指定登錄到數(shù)據(jù)庫(kù)所在服務(wù)器時(shí)所使用的密碼

2.根據(jù)不同類(lèi)型對(duì)象,分化數(shù)據(jù)庫(kù)對(duì)象 DDL 腳本

由于源數(shù)據(jù)庫(kù)中的各個(gè)表數(shù)據(jù)已經(jīng)是經(jīng)過(guò)觸發(fā)器、存儲(chǔ)過(guò)程等數(shù)據(jù)庫(kù)對(duì)象處理過(guò)的數(shù)據(jù),為保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的一致性和完整性,這些數(shù)據(jù)庫(kù)對(duì)象應(yīng)該在導(dǎo)入數(shù)據(jù)后再創(chuàng)建,以防止在導(dǎo)入表數(shù)據(jù)時(shí)重復(fù)執(zhí)行觸發(fā)器和存儲(chǔ)過(guò)程等數(shù)據(jù)庫(kù)對(duì)象生成錯(cuò)誤數(shù)據(jù)。使用文本編輯器編輯由 db2look 生成的 srcdb1.ddl,將創(chuàng)建表及索引的 DDL 語(yǔ)句,創(chuàng)建外鍵約束的 DDL 語(yǔ)句以及創(chuàng)建觸發(fā)器和創(chuàng)建存儲(chǔ)過(guò)程的語(yǔ)句分為四組,分別保存為下面四個(gè) DDL 腳本:

srcdb1_tables.ddl srcdb1_foriegnkeys.ddl

srcdb1_triggers.ddl srcdb1_procedures.ddl

srcdb1_tables.ddl :包含創(chuàng)建 SEQUENCE,UDF,TABLE,VIEW 等數(shù)據(jù)庫(kù)對(duì)象的 ddl 語(yǔ)句。

清單2. srcdb1_tables.ddl 語(yǔ)句

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 語(yǔ)句。

清單3. srcdb1_foriegnkeys.ddl 語(yǔ)句

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 語(yǔ)句。

清單 4. srcdb1_triggers.ddl 語(yǔ)句

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 存儲(chǔ)過(guò)程以及 java 存儲(chǔ)過(guò)程的 ddl 語(yǔ)句。

清單 5. srcdb1_procedures.ddl語(yǔ)句

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ù)庫(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 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 的用戶(hù)來(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ǔ)句類(lèi)似,上述 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;

標(biāo)簽: PHP
主站蜘蛛池模板: 欧美日韩国产精品一区 | 国产区精品在线 | 韩日在线| 五月婷婷激情五月 | 国产在线观看免费视频软件 | 亚洲综合视频在线 | 国产欧美日韩久久 | 91久久综合亚洲鲁鲁五月天 | 黄色影院在线 | 中文字幕在线高清 | 国产综合视频 | 亚洲一区二区三区视频在线 | 国产精品一区二区久久久 | 蜜挑成熟时在线观看 | 国产精品99久久久久久久久 | www视频免费在线观看 | 亚洲 欧美 日韩 在线 | 欧美三级中文字幕 | 日本久久久久久 | 欧美三级国产 | 91av在线播放 | 99热这里只有精品在线观看 | 激情五月婷婷色 | 日韩视频网 | 婷婷社区五月天 | 琪琪久久| 免费黄色a| 欧美一级片在线观看 | 超碰影音| 理论片亚洲| 亚洲成人精品一区 | 国偷自拍| 欧美在线小视频 | 欧美性a视频 | 免费在线视频一区二区 | 在线观看第一页 | 黄色a免费| 开心激情播播网 | 日韩黄色网页 | www狠狠操| 制服.丝袜.亚洲.中文.综合懂色 |