| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> php >> 基于DB2及PHP的應用系統跨平台遷移詳細步驟(一)
 

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

2008-12-22 08:07:42  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  本文主要介紹如何完成基于 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程序開發的原則彙總》
下一篇《基于DB2及PHP的應用系統跨平台遷移詳細步驟(二)》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
本文主要介紹如何完成基于 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;
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
小龍女彤彤之情溢皇都
龔潔
智能手機形象美女
崔潔彤
回家的路上----
中國一站(哈爾濱)
清明植物園的花。
桃花堤印象之豎版
 
>>返回首頁<<
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有