程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2下數據轉移任務操作實例

DB2下數據轉移任務操作實例

編輯:DB2教程

使用 DB2 LOAD 實用程序的 FROM CURSOR 選項簡化 DB2 for Linux, UNIX, and Windows的數據轉移過程。本文介紹 LOAD FROM CURSOR 特性並提供兩個接口 Command Line Processor 和 ADMIN_CMD 存儲過程的使用示例。

簡介

典型的 DB2 數據轉移任務涉及三個步驟:

◆把數據以二進制或文本格式從源數據庫導出到一個臨時數據交換文件

◆在系統之間轉移生成的文件

◆把數據從文件導入或裝載到目標數據庫中

在數據量很大的情況下,使用 EXPORT 實用程序生成數據交換文件常常要花費很長時間。另外,在把數據移入和移出數據庫時,必須考慮不同的數據庫編碼頁和操作系統。

可以使用 LOAD 實用程序的 FROM CURSOR 選項避免這些問題。當指定 FROM CURSOR 選項時,LOAD 實用程序直接把一個 SQL 查詢的結果集作為數據裝載操作的來源,這樣就不需要生成臨時數據交換文件。因此,LOAD FROM CURSOR 是在不同的表空間或數據庫之間快速輕松地轉移數據的方法。可以在命令行上執行 LOAD FROM CURSOR,也可以通過使用 DB2 的 ADMIN_CMD 存儲過程在應用程序或存儲過程中執行它。本文介紹 LOAD FROM CURSOR 特性並提供兩個接口 Command Line Processor (CLP) 和 ADMIN_CMD 存儲過程的使用示例。

把表轉移到另一個表空間

首先,看看如何把表從一個表空間轉移到另一個表空間。如果創建表的表空間的頁面大小不合適,或者應該用另一個緩沖區池訪問表,就可能需要執行這種數據轉移。在 9.1 以前的 DB2 版本中,常常由於達到表空間的最大大小而在表空間之間轉移表。但是,在 DB2 9.1 和更高版本中,這應該不再是問題了,因為表空間大小限制已經顯著提高了(前提是使用大表空間,而不是以前使用的常規表空間)。

這個示例場景首先創建 DB2 SAMPLE 數據庫。這可以通過在命令行上調用 db2sampl 命令來完成,見清單 1。

清單 1. 創建 SAMPLE 數據庫

C:>db2sampl
Creating database "SAMPLE"...
Connecting to database "SAMPLE"...
Creating tables and data in schema "FECHNER"...
'db2sampl' processing complete.

除了其他表之外,SAMPLE 數據庫包含一個名為 SALES 的表。在默認情況下,在表空間 USERSPACE1 中創建這個表。可以通過對 DB2 編目視圖 SYSCAT.TABLES 和 SYSCAT.TABLESPACES 執行查詢來確認這一點。

清單 2. 判斷 SALES 表的表空間

C:>db2 "CONNECT TO SAMPLE"
Database Connection Information
Database server = DB2/NT 9.5.2
SQL authorization ID = FECHNER
Local database alias = SAMPLE
C:>db2 "SELECT TABLES.TABSCHEMA, TABLES.TABNAME, TBSPACES.TBSPACE FROM SYSCAT.TABLES AS
TABLES, SYSCAT.TABLESPACES AS TBSPACES WHERE TABLES.TBSPACEID = TBSPACES.TBSPACEID AND
TABNAME = 'SALES'"
TABSCHEMA
TABNAME
TBSPACE
------------------------------------------------------------------------------------------

-------- ---------------------------------------------------------------------------------

----------------- ------------------------------------------------------------------------

--------------------------

FECHNER
SALES
USERSPACE1
1 record(s) selected.

除了 USERSPACE1 表空間之外,還有第二個表空間 IBMDB2SAMPLEREL,它也用於存儲用戶數據。在這個示例場景中,IBMDB2SAMPLEREL 作為轉移 SALES 表的目標表空間。執行 DB2 命令 LIST TABLESPACES,就可以看到一個數據庫的所有表空間。清單 3 演示具體做法。

清單 3. 列出 SAMPLE 數據庫的所有表空間

C:>db2 "LIST TABLESPACES"
Tablespaces for Current Database
Tablespace ID = 0
Name = SYSCATSPACE
Type = Database managed space
Contents = All permanent data. Regular table space.
State = 0x0000
Detailed explanation:
Normal
Tablespace ID = 1
Name = TEMPSPACE1
Type = System managed space
Contents = System Temporary data
State = 0x0000
Detailed explanation:
Normal
Tablespace ID = 2
Name = USERSPACE1
Type = Database managed space
Contents = All permanent data. Large table space.
State = 0x0000
Detailed explanation:
Normal
Tablespace ID = 3
Name = IBMDB2SAMPLEREL
Type = Database managed space
Contents = All permanent data. Large table space.
State = 0x0000
Detailed explanation:
Normal

在把 SALES 表的內容復制到 IBMDB2SAMPLEREL 表空間之前,必須在目標表空間中創建一個空表,此表的結構應該與 SALES 表相同。因為在同一個數據庫模式中不可能有兩個同名的表,所以臨時用 SALES_TMP 這個名稱創建新的表。通過在 CREATE TABLE 命令中指定 LIKE 選項,創建一個與現有表結構相同的空表(清單 4)。通過 IN 選項顯式地定義新表 SALES_TMP 的表空間。

清單 4. 創建數據轉移操作所需的目標表 SALES_TMP

C:>db2 "CREATE TABLE FECHNER.SALES_TMP LIKE FECHNER.SALES IN IBMDB2SAMPLEREL"
DB20000I The SQL command completed successfully.

現在,可以執行數據轉移操作了。使用 DECLARE CURSOR 命令定義一個游標,它使用 SELECT 語句讀取源表 SALES 的所有數據。可以自由選擇游標的名稱,在此示例中使用 C1。然後,在用來填充目標表 SALES_TMP 的 LOAD 命令中引用此游標。此示例中的 LOAD 命令把它的消息寫到日志文件 load_sales_tmp.msg 中。執行的 LOAD 操作包含 NONRECOVERABLE 選項。這意味著在數據庫恢復的前滾階段無法重新執行這個 LOAD 操作。因此,在執行數據轉移操作之後,應該執行數據庫備份,至少是表空間備份。LOAD 命令有其他選項可以避免這種情況,但是這些選項超出了本文的范圍。更多信息請參見 DB2 Information Center 中對 LOAD 命令的說明(參見 參考資料)。

清單 5. 執行 LOAD FROM CURSOR 操作把 SALES 表中的所有行復制到 SALES_TMP 表

C:>db2 "DECLARE C1 CURSOR FOR SELECT * FROM FECHNER.SALES"
DB20000I The SQL command completed successfully.
C:>db2 "LOAD FROM C1 OF CURSOR MESSAGES C:load_sales_tmp.msg INSERT INTO
FECHNER.SALES_TMP NONRECOVERABLE"
Number of rows read = 41
Number of rows skipped = 0
Number of rows loaded = 41
Number of rows rejected = 0
Number of rows deleted = 0
Number of rows committed = 41

在把 SALES 表中的所有行成功地復制到 SALES_TMP 表之後,可以刪除源表(DROP TABLE 語句)。然後,把目標表 SALES_TMP 重命名為 SALES(RENAME TABLE 語句)。在使用 RENAME TABLE 時,只能修改表名,而不能修改表的模式名。因此,一定要在正確的模式中創建 SALES_TMP 表。

清單 6. 刪除源表 SALES 並重命名目標表 SALES_TMP

C:>db2 "DROP TABLE FECHNER.SALES"
DB20000I The SQL command completed successfully.
C:>db2 "RENAME TABLE FECHNER.SALES_TMP TO SALES"
DB20000I The SQL command completed successfully.

再次對 DB2 編目視圖執行查詢,可以確認 SALES 表已經從原來的表空間 USERSPACE1 轉移到了新的表空間 IBMDB2SAMPLEREL 中,見清單 7。

清單 7. 確認新 SALES 表的表空間

C:>db2 "SELECT TABLES.TABSCHEMA, TABLES.TABNAME, TBSPACES.TBSPACE FROM SYSCAT.TABLES AS
TABLES, SYSCAT.TABLESPACES AS TBSPACES WHERE TABLES.TBSPACEID = TBSPACES.TBSPACEID AND
TABNAME = 'SALES'"
TABSCHEMA
TABNAME
TBSPACE
------------------------------------------------------------------------------------------

-------- ---------------------------------------------------------------------------------

----------------- ------------------------------------------------------------------------

--------------------------

FECHNER
SALES
IBMDB2SAMPLEREL
1 record(s) selected.
C:>db2 "TERMINATE"
DB20000I The TERMINATE command completed successfully.

使用別名在另一個數據庫中創建表拷貝

除了可以在一個數據庫中的表空間之間轉移表之外,還可以在不同的數據庫之間轉移表。這意味著:通過使用 LOAD FROM CURSOR,也可以把表從一個數據庫轉移到另一個數據庫。這可以通過兩種方法完成:

方法 1 - 在目標數據庫中,使用 DB2 的聯邦數據庫機制訪問源數據庫。

方法 2 - 使用 LOAD FROM CURSOR 命令的遠程訪問特性。

這兩種方法各有優點,下面分別討論。

方法1 使用 DB2 的聯邦數據庫機制

通過對源數據庫執行聯邦訪問來復制表內容。方法 1 要求目標數據庫被配置為聯邦數據庫。因此,對應的 DB2 實例的 FEDERATED 參數必須設置為 YES(UPDATE DBM CFG)。在修改 DBM CFG 參數 FEDERATED 之後,必須重新啟動 DB2 實例(db2stop/db2start)。在這個示例場景中,源和目標數據庫在同一個 DB2 實例中運行。創建一個名為 MYSAMPLE 的空數據庫作為目標數據庫。對於沒有特殊需求的測試數據庫,可以使用 CREATE DATABASE 命令創建此數據庫,不需要其他選項。

清單 8. 在 DBM CFG 中啟用聯邦數據庫支持並創建空的目標數據庫 MYSAMPLE

C:>db2 "UPDATE DBM CFG USING FEDERATED YES"
DB20000I The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
SQL1362W One or more of the parameters submitted for immediate modification
were not changed dynamically. ClIEnt changes will not be effective until the
next time the application is started or the TERMINATE command has been issued.
Server changes will not be effective until the next DB2START command.
C:>db2stop
2008-09-22 14.55.36 0 0 SQL1064N DB2STOP processing was successful.
SQL1064N DB2STOP processing was successful.
C:>db2start
2008-09-22 14.55.53 0 0 SQL1063N DB2START processing was successful.
SQL1063N DB2START processing was successful.
C:>db2 "CREATE DATABASE MYSAMPLE"
DB20000I The CREATE DATABASE command completed successfully.

與前面一樣,必須在目標數據庫 MYSAMPLE 中創建一個空表,它的結構與 SAMPLE 數據庫中的 SALES 表相同。因此,應該使用 db2look 實用程序提取源數據庫中 SALES 表的 DDL。

清單 9. 使用 db2look 實用程序提取源表 SALES 的 DDL

C:>db2look -d sample -e -z fechner -t sales -o sales.ddl
-- USER is: FECHNER

-- SpecifIEd SCHEMA is: FECHNER

-- The db2look utility will consider only the specifIEd tables

-- Creating DDL for table(s)

-- Schema name is ignored for the Federated Section

-- Output is sent to file: sales.ddl

-- Binding package automatically ...

-- Bind is successful

-- Binding package automatically ...

-- Bind is successful

db2look 調用的結果是 sales.ddl 文件,其中包含 SALES 表的 CREATE TABLE 語句。如果在 SALES 表上定義了約束和/或索引,也會提取出對應的定義並寫到 sales.ddl 文件中。清單 10 顯示這些結果。

清單 10. db2look 調用的結果文件 sales.ddl

-- This CLP file was created using DB2LOOK Version 9.5

-- Timestamp: 23.09.2008 07:35:10

-- Database Name: SAMPLE

-- Database Manager Version: DB2/NT Version 9.5.2

-- Database Codepage: 1208

-- Database Collating Sequence is: IDENTITY

CONNECT TO SAMPLE;
------------------------------------------------

-- DDL Statements for table "FECHNER "."SALES"

------------------------------------------------

CREATE TABLE "FECHNER "."SALES" (
"SALES_DATE" DATE ,
"SALES_PERSON" VARCHAR(15) ,
"REGION" VARCHAR(15) ,
"SALES" INTEGER )
IN "IBMDB2SAMPLEREL" ;
COMMIT WORK;
CONNECT RESET;
TERMINATE;

-

在對目標數據庫 MYSAMPLE 執行 sales.ddl 文件中的語句之前,在文本編輯器中打開此文件並對生成的語句做兩處修改:

在文件的開頭,db2look 為源數據庫 SAMPLE 生成 CONNECT 語句。因為希望對目標數據庫 MYSAMPLE 執行下面的語句,所以要相應地修改 CONNECT 語句。

因為在目標數據庫 MYSAMPLE 中沒有用於存儲用戶數據的表空間 IBMDB2SAMPLREL,所以要把 CREATE TABLE 語句中的表空間名替換為 USERSPACE1。

清單 11. 結果文件 sales.ddl 中創建目標表所需的修改

CONNECT TO SAMPLE; -> CONNECT TO MYSAMPLE;
IN "IBMDB2SAMPLEREL" ; -> IN "USERSPACE1";

在修改 sales.ddl 文件之後,通過調用 DB2 CLP (command line processor) 執行此腳本。

清單 12. 在 MYSAMPLE 數據庫中創建目標表

C:>db2 -tf sales.ddl
Database Connection Information
Database server = DB2/NT 9.5.2
SQL authorization ID = FECHNER
Local database alias = MYSAMPLE
DB20000I The SQL command completed successfully.
DB20000I The SQL command completed successfully.
DB20000I The SQL command completed successfully.
DB20000I The TERMINATE command completed successfully.

到目前為止,只在目標數據庫 MYSAMPLE 中創建了 SALES 表的空拷貝。准備數據轉移操作的下一步是把源數據庫 SAMPLE 編目為遠程數據庫。顯然,這對於這個示例場景並不是必需的,因為源和目標數據庫在同一個服務器上的同一個 DB2 實例中運行。但是在真實的環境中,必須對運行目標數據庫的 DB2 實例執行以下 CATALOG 命令,從而允許對源數據庫進行 TCP/IP 訪問。

清單 13. 在節點和數據庫目錄中創建訪問 SAMPLE 數據庫所需的條目

C:>db2 "CATALOG TCPIP NODE SRCNODE REMOTE localhost SERVER 50000"
DB20000I The CATALOG TCPIP NODE command completed successfully.
DB21056W Directory changes may not be effective until the directory cache is
refreshed.
C:>db2 "CATALOG DATABASE SAMPLE AS SRCDB AT NODE SRCNODE AUTHENTICATION SERVER"
DB20000I The CATALOG DATABASE command completed successfully.
DB21056W Directory changes may not be effective until the directory cache is
refreshed.
C:>db2 "TERMINATE"
DB20000I The TERMINATE command completed successfully.

准備 LOAD FROM CURSOR 操作的最後一步是配置對源數據庫 SAMPLE 中 SALES 表的聯邦訪問。這需要在目標數據庫 MYSAMPLE 中創建對另一個數據庫執行聯邦訪問所需的幾個特殊對象:

包裝器

包裝器支持訪問外部數據源。外部數據源可以是另一個 DBMS(數據庫管理系統),比如 Oracle 或 SQL Server,也可以僅僅是 Excel 文件。根據應該訪問的數據源,需要適當的包裝器。這些包裝器包含在單獨的 IBM product WebSphere® Federation Server 中。如果只希望訪問 DB2 產品系列(DB2 LUW 或 DB2 z/OS)的另一個數據庫,那麼需要 DRDA 包裝器。DB2 LUW 中已經包含這個包裝器,所以在這種情況下不需要 WebSphere Federation Server。通過在目標數據庫中執行以下命令,創建 DRDA 包裝器:CREATE WRAPPER DRDA。

服務器

“服務器” 這個詞在這裡有點容易引起誤解,因為這實際上意味著源數據庫扮演(數據)服務器的角色。為了在目標數據庫中識別源數據庫,要創建一個服務器對象,它指定數據源的類型 (DB2/UDB VERSION 9.5)、要使用的包裝器 (DRDA) 和訪問源數據庫所需的用戶名/密碼組合。使用 DBNAME 選項提供源數據庫本身的名稱。用戶名/密碼必須在引號中指定。為了避免命令行解釋器刪除引號,應該加上一個反斜槓 ()。可以自由選擇服務器對象的名稱。在這個示例場景中,使用名稱 SRCSRV。

用戶映射

對於希望用前面定義的服務器對象訪問遠程數據庫的每個用戶,都必須創建一個用戶映射。用戶映射定義本地數據庫 (MYSAMPLE) 中的授權 ID 如何映射到遠程數據庫 (SAMPLE) 中的授權 ID。在這個示例場景中,本地用戶和遠程用戶是相同的,但是仍然必須定義用戶映射。

別名

別名是源數據庫中的遠程表的本地別名。指定了別名,就可以在目標數據庫中用 SQL 語句查詢遠程表,就像查詢任何本地表一樣。

清單 14. 創建聯邦訪問所需的數據庫對象

C:>db2 "CONNECT TO MYSAMPLE"
Database Connection Information
Database server = DB2/NT 9.5.2
SQL authorization ID = FECHNER
Local database alias = MYSAMPLE
C:>db2 "CREATE WRAPPER DRDA"
DB20000I The SQL command completed successfully.
C:>db2 "CREATE SERVER SRCSRV TYPE DB2/UDB VERSION 9.5 WRAPPER DRDA AUTHORIZATION
"fechner" PASSWORD "passWord" OPTIONS (DBNAME 'SRCDB')"
DB20000I The SQL command completed successfully.
C:>db2 "CREATE USER MAPPING FOR fechner SERVER SRCSRV OPTIONS (REMOTE_AUTHID 'fechner',
REMOTE_PASSWORD 'passWord')"
DB20000I The SQL command completed successfully.
C:>db2 "CREATE NICKNAME FECHNER.SRCTAB FOR SRCSRV.FECHNER.SALES"
DB20000I The SQL command completed successfully.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved