成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

基于DB2及PHP的應用系統跨平臺遷移詳細步驟(一)

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

本文主要介紹如何完成基于 DB2 的 PHP 應用系統從 AIX 平臺到 Linux 平臺的移植過程。文中包含了底層的 DB2 數據庫移植、上層的 PHP 應用系統移植的詳細步驟以及移植過程中可能遇到的問題和解決方法。

任務概述

系統遷移的工作主要分為以下幾個方面:

1.DB2 數據庫系統的跨平臺遷移

2.Apache 服務器與 php 應用系統的安裝和配置

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

DB2 數據庫系統的跨平臺遷移

數據庫環境

源環境:AIX+DB2 v8.1

目標環境:Linux+DB2 v8.1

其中源數據庫中包含了 2 個數據庫 Instance:SRCDB1 與 SRCDB2。在 SRCDB1/SRCDB2 數據庫中,均包含了上百張數據庫表,并有很多的索引、外鍵約束、觸發器、存儲過程以及一些含有自增字段的表(含有 GENERATED ALWAYS AS IDENTITY 定義字段的表)。更為困難的是,我們并沒有關于這些數據庫對象的準確創建腳本。

遷移方案的選擇

如果遷移的源系統與目的系統屬于同一類型操作系統,例如 Linux 之間的遷移,或者 AIX 系統之間的遷移,則情況相對簡單,DB2 本身已經提供相關的實用工具來實現這種同類型平臺之間的數據庫移植,如: BACKUP 和 RESTORE 命令。當然,根據不同的情況還需要對實用工具所提供的參數有比較清楚的了解,譬如源系統與目標系統使用不同的表空間,就會涉及到表空間重定向的問題。由于本文的重點在于跨平臺的移植,這種方案顯然無法滿足需求,在此不再熬述。

那么,如何處理跨平臺的數據庫遷移問題?是不是可以使用實用工具 db2move 呢? db2move 只能遷移表中的數據,而無法對索引、外鍵約束、觸發器和存儲過程等數據庫對象也實現遷移操作,而且對于包含自增字段數據的表來說,db2move 也有一定的限制。并且 db2move 只能把數據導入到已存在的數據庫的表中,無法顯示指定表空間的位置。由于在數據庫的系統遷移過程中,不僅需要遷移表中的數據,還有索引、外鍵約束、觸發器和存儲過程等數據庫對象,與本文所選方案相比,還是后者更具優勢。可以將 db2move 僅作為遷移表數據的一種備用方案。

而對于 export 和 import 來說,一次只能針對一張表進行導出導入操作,并且需要手動輸入 export 和 import 的命令以及需要導入導出的數據表名,在數據庫表的數量不多的情況下,這種方案也許還可以考慮,但也不并是最佳的方案。而在數據庫中表數量眾多的情況下,這種做法則是基本不現實的,而且 import 命令并不能保證自增字段的數據與原來的表數據保持一致。

本文根據 DB2 對數據庫對象的處理機制,采用將 db2look 與 DDL、DML 腳本相結合的方式,并針對原數據庫中的觸發器、存儲過程以及外鍵約束等分別處理,給出了一種跨平臺 DB2 數據庫系統移植的可行方案。

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

在源系統 (AIX) 上的相關操作

1.使用 db2look 命令抽取生成數據庫對象的 DDL 腳本

清單 1. db2look 命令及參數

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

db2look :生成 DDL 以便重新創建在數據庫中定義的對象

語法: 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 : 數據庫名稱,必選參數

-e : 抽取復制數據庫所需要的 DDL 文件,此選項將生成包含 DDL 語句的腳本

-o : 將輸出重定向到給定的文件名,如果未指定 -o 選項,則輸出默認轉到 stdout

-a : 為所有創建程序生成統計信息,如果指定了此選項,則將忽略 -u 選項

-i : 指定登錄到數據庫所在服務器時所使用的用戶標識

-w : 指定登錄到數據庫所在服務器時所使用的密碼

2.根據不同類型對象,分化數據庫對象 DDL 腳本

由于源數據庫中的各個表數據已經是經過觸發器、存儲過程等數據庫對象處理過的數據,為保證數據庫中數據的一致性和完整性,這些數據庫對象應該在導入數據后再創建,以防止在導入表數據時重復執行觸發器和存儲過程等數據庫對象生成錯誤數據。使用文本編輯器編輯由 db2look 生成的 srcdb1.ddl,將創建表及索引的 DDL 語句,創建外鍵約束的 DDL 語句以及創建觸發器和創建存儲過程的語句分為四組,分別保存為下面四個 DDL 腳本:

srcdb1_tables.ddl srcdb1_foriegnkeys.ddl

srcdb1_triggers.ddl srcdb1_procedures.ddl

srcdb1_tables.ddl :包含創建 SEQUENCE,UDF,TABLE,VIEW 等數據庫對象的 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 :包含創建外鍵約束的 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 :包含創建觸發器的 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 :包含創建 SQL 存儲過程以及 java 存儲過程的 ddl 語句。

清單 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 尚未實現抽取如 UDF,TRIGGER,UserSpace,NodeGroup,BufferPool 等數據庫對象的 ddl 語句。從 db2 v7 開始,db2look 可以抽取上述對象的 DDL,但是依然無法抽取創建存儲過程對象的 ddl 語句。從 db2 v8.2 開始,完善了對 db2look 功能的支持,實現了存儲過程 ddl 語句的抽取功能。由于本文所涉及的源數據庫系統的版本較低(DB2 v8.1),因此需要采取上述方案獲取所有數據庫對象的 DDL 信息:

1). 從某個 DB2 v8.2 系統對 SRCDB1(DB2 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;

標簽: PHP
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲一级电影| 国自产拍偷拍福利精品免费一| 男人的j进女人的j一区| 欧美日韩国产免费观看| 久久亚洲精品国产精品紫薇| 日本最新不卡在线| 亚洲手机视频| 精品国产不卡一区二区三区| 狠狠色综合播放一区二区| 欧美在线看片a免费观看| 亚洲图片欧美一区| 亚洲国产美女| 久久精品亚洲国产奇米99| 蜜桃久久久久久| 香港久久久电影| 椎名由奈av一区二区三区| 成人黄色小视频在线观看| 欧美性生活一区| 午夜国产精品一区| 欧美一级专区| 亚洲精品水蜜桃| 欧美婷婷久久| 久久色视频免费观看| 成人福利视频在线看| 欧美精品乱人伦久久久久久| 日韩高清国产一区在线| 亚洲一区亚洲| 亚洲精品欧美二区三区中文字幕| 国产在线不卡| 亚洲猫色日本管| 亚洲视频中文| 久久先锋影音av| 国产一区二区不卡老阿姨| 色88888久久久久久影院野外 | 欧美va天堂在线| 精品久久久久久久久久久院品网| 粉嫩aⅴ一区二区三区四区| 欧美日韩国产123区| 国产乱码一区二区三区| 777亚洲妇女| 国产美女在线精品| 欧美日韩在线播放三区四区| 久久福利视频一区二区| 一区二区不卡在线视频 午夜欧美不卡'| 国产人久久人人人人爽| 欧美 日韩 国产在线| 国产亚洲欧洲一区高清在线观看| 欧美日韩影院| 久久青青草综合| 成人午夜在线免费| 91精品国产综合久久香蕉麻豆| 精品无码三级在线观看视频 | 欧美精品v日韩精品v韩国精品v| 国产精品亚洲成人| 亚洲精品一区二区三区在线观看| 99久久久国产精品免费蜜臀| 久久婷婷国产综合国色天香| 黑人中文字幕一区二区三区| 综合婷婷亚洲小说| 色吧成人激情小说| 国产精品一区在线观看乱码| xfplay精品久久| 99热在线精品观看| 日本亚洲视频在线| 蜜臀va亚洲va欧美va天堂| 国内精品美女在线观看| 国产精品视频看| 午夜精品爽啪视频| 在线观看日韩毛片| 国产一区二区三区久久悠悠色av| 国内自拍亚洲| 亚洲国产欧美一区二区三区丁香婷| 久久资源av| 五月婷婷欧美视频| 91麻豆精品国产91久久久久| 国产91丝袜在线播放九色| 久久婷婷国产综合国色天香| 国产综合色一区二区三区| 国产精品免费人成网站| 另类av一区二区| 免播放器亚洲一区| 26uuu国产在线精品一区二区| 99久久777色| 亚洲福利视频导航| 色屁屁一区二区| 豆国产96在线|亚洲| 久久久精品影视| 日韩视频一区| 亚洲精品国产第一综合99久久| 国产综合第一页| 亚洲一区免费视频| 国产精品地址| 偷拍亚洲欧洲综合| 久久综合五月天婷婷伊人| 狠久久av成人天堂| 一区二区在线电影| 欧美在线影院一区二区| 国产xxx精品视频大全| 国产日韩欧美麻豆| 亚洲人www| 国内精品在线播放| 2022国产精品视频| 夜夜爽99久久国产综合精品女不卡| 亚洲va欧美va天堂v国产综合| 日韩欧美在线网站| 伊人久久亚洲美女图片| 国产精品1024| 国产精品电影院| 欧美亚洲综合网| 99久久综合色| 日本aⅴ亚洲精品中文乱码| 夜夜嗨一区二区三区| 国产麻豆成人传媒免费观看| 国产欧美一区二区精品秋霞影院| 91丨国产丨九色丨pron| 一区二区三区在线影院| 欧美视频第二页| 亚洲福利精品| 天天综合网 天天综合色| 国产清纯在线一区二区www| 久久不射网站| 欧美三级免费| 日韩精品成人一区二区三区| 欧美国产亚洲另类动漫| 午夜在线视频一区二区区别| 欧美成人一区二免费视频软件| 午夜欧美电影在线观看| 国产欧美1区2区3区| 另类激情亚洲| 亚洲无线观看| 麻豆成人av在线| 亚洲欧美视频在线观看视频| 欧美丝袜自拍制服另类| 欧美激情aⅴ一区二区三区| 午夜精品久久久久| 欧美一卡二卡在线观看| 国产精品久久波多野结衣 | 欧美一区91| 五月天视频一区| 国产精品灌醉下药二区| 欧美日韩免费不卡视频一区二区三区| 在线日本高清免费不卡| 精品一二线国产| 爽好久久久欧美精品| 欧美高清在线一区| 欧美另类高清zo欧美| 国产精品嫩草99av在线| 久久不见久久见中文字幕免费| 亚洲国产成人porn| 久久久精品免费网站| 日韩午夜激情av| 久久九九精品| 欧美日韩国产免费观看| 国产麻豆精品95视频| 亚洲免费在线观看| 国产精品视频在线看| 在线一区二区视频| 国产精品手机在线| av电影天堂一区二区在线观看| 国产91丝袜在线18| 日韩福利电影在线观看| 亚洲一卡二卡三卡四卡| 欧美成人一区二区三区| 欧美精品日韩综合在线| 国产视频一区三区| 亚洲精品在线免费| 成人性视频免费网站| 国产精品亚洲视频| 日韩国产欧美在线播放| 天天色图综合网| 亚洲美女区一区| 亚洲精品菠萝久久久久久久| 精品国产乱码久久久久久1区2区| 日韩女优毛片在线| 欧美在线影院一区二区| 欧美日韩色一区| 色综合久久久久综合体桃花网| 国产区欧美区日韩区| 欧美一区三区二区在线观看| www.亚洲精品| 国产精品系列在线观看| 成人综合婷婷国产精品久久蜜臀 | 欧美日韩1080p| 成人h动漫精品一区二| 91一区二区在线观看| 国产一区二区三区香蕉| 国产精品系列在线播放| 久久国产夜色精品鲁鲁99| 国产在线国偷精品免费看| 亚洲成av人片在线| 日韩高清在线不卡| 亚洲午夜在线视频| 天天av天天翘天天综合网 | 欧美激情在线一区二区| 国产精品欧美一区喷水| 久久综合狠狠综合| 国产嫩草影院久久久久| 久久久午夜精品| 中文字幕中文乱码欧美一区二区| 国产亚洲综合色|