簡介
如果對於 IBM® DB2® Universal Database™(UDB)for Linux、UNIX® 和 Windows®,您還是位新手,或者您正准備參加認證考試,那麼本文可能會使您在設法掌握有關 DB2 環境的主要概念方面節省一些時間。
常言道:一圖抵千言。盡管 DB2 認證指南(Certification Guide)為您備考作了大量工作,但是它沒有為您提供圖解形式的 DB2 概述。請在閱讀認證指南之前先閱讀本文,我相信這會大大地縮短您的准備時間。
在本文中,我使用 DB2 來指代 DB2 通用數據庫 V8.1 for UNIX、Linux 和 Windows。我建議您打印本文(使用彩色打印機!)而不要聯機閱讀,因為我將一直引用下面這張圖。首先會簡略地說明一下概念,然後在最後一節中我們會使用 案例研究把這些概念都串起來。
在 圖中,我們使用藍色來表示用於查詢配置文件內容的命令,用黑色來表示更改這些內容的語法,並用紫色來顯示有關如何使用命令的示例。
圖 1 - DB2 V8 環境
在 DB2 中, 實例提供了獨立的環境,可在其中創建數據庫對象並針對這些對象運行應用程序。由於這些環境是獨立的,所以兩個或更多的單獨實例的對象可以有相同的名稱。在 圖 1中,有一個名為“MYDB2”的數據庫,它與實例“DB2”相關;還有一個同名的數據庫,但它與實例“MyInst”相關。實例允許用戶具有用於生產、測試和開發目的的不同環境。
以下是一些與實例相關的命令:
通過從命令行處理器(CLP)發出下列命令來顯式地創建實例: db2icrt <instance name>
在 Windows 平台上首次安裝 DB2 時,缺省情況下會創建一個稱為“DB2”的實例。在 UNIX 環境中,如果您選擇創建實例,那麼缺省的實例名稱為“db2inst1”。
要刪除實例,請使用這條命令: db2idrop <instance name>
要啟動實例,請使用這條命令: db2start
要停止實例,請使用這條命令: db2stop
創建了實例後,就會生成到 DB2 代碼的鏈接。對於 圖 1中的示例而言,已創建了實例“DB2”和實例“MyInst”,兩者都鏈接至同一段 DB2 代碼。
V8 之前,曾有兩種實例類型:“DB2”類型和“DAS”類型。V8 中已經除去了 DAS 類型的實例;它的功能已經被作為服務器進程集成到產品中了。
和許多其它關系數據庫管理系統(RDBMS)一樣,DB2 使用不同的機制來管理、監視和控制 DB2 系統的行為。這些機制包括:
環境變量
環境變量是在操作系統級別上定義的變量。例如,在 Windows 2000® 平台中,您可以為一個變量創建新的項,或者通過選擇 Control Panel --> System --> Advanced Tab --> Environment Variables 來編輯現有變量的值。在 UNIX 中,您通常可以將安裝了 DB2 之後所提供的腳本 db2profile (Bourne 或 Korn shell)或 db2cshrc (C shell)添加到 .login 或 .profile UNIX 初始化文件中。 db2profile/db2cshrc 文件包含了“export”UNIX 命令,這些命令能確保每次調用 shell 時就傳遞一個 UNIX 環境變量。
最常使用的 DB2 環境變量是“DB2INSTANCE”變量。該環境變量允許您指定當前活動實例,所有命令都將應用於該實例。對於本例而言,如果將 DB2INSTANCE 設置成“MyInst”,那麼發出命令“ create database mydb ”會創建出與實例“MyInst”相關的數據庫。但是如果您想創建與實例“DB2”相關的該數據庫,那麼首先您必須將 DB2INSTANCE 變量的值更改成“DB2”。
使用控制面板(在 Windows 中)/db2profile(在 UNIX 中)來設置環境變量的值,將保證您下次打開窗口/會話時該值不變;但是,如果您想在給定的窗口/會話中臨時更改該值,那麼在 Windows 中您可以使用操作系統的“ set ”命令,或者在 UNIX 中使用“export”命令。例如,在 Windows 平台中,下面這個命令:
set DB2INSTANCE=DB2
會將環境變量 DB2INSTANCE 的值設置成“DB2”。使用 set 命令時常犯的錯誤是在等號(=)前後留有空格。絕對不能有空格!
要查看該變量的當前設置,您可以使用下面三個方法中的任何一個:
echo %DB2INSTANCE% (Windows only)
set DB2INSTANCE
db2 get instance
要獲取系統中您可以執行的所有可用實例的列表,請發出下面這個命令:
db2ilist
DB2 概要注冊表
在 Windows 平台上使用 DB2 時,單詞“注冊表(Registry)”的使用往往會造成混淆。DB2 概要注冊表(Profile Registry)變量與 Windows 注冊表變量沒有任何關系。過去,對某些環境變量進行更改時,會要求用戶重新引導機器。如果所有 DB2 變量都已被定義成環境變量,那麼對變量值進行更改將會很麻煩。因此,當時決定將大多數 DB2 變量組成一個專門的 DB2 注冊表,在其中進行更改無需重新引導機器。
DB2 概要注冊表分成四類;但是下面這兩個是最常用的:
DB2 全局級概要注冊表(Global-Level Profile Registry)
DB2 實例級概要注冊表(Instance-Level Profile Registry)
兩者的主要區別(您從它們的名稱就可以看出)是變量適用的級別。全局級概要注冊表變量的值適用於所有實例。因此,可以從圖中看到,該注冊表畫在了兩個實例框的外面。實例級概要注冊表變量的值適用於特定的實例。因此,您可以看到 圖中那兩個實例每個內部都有單獨的“Instance-Level Profile Registry”框。
要查看所設置的當前注冊表變量,請從 CLP 發出下面這個命令:
db2set -all
您可能會得到類似下面這樣的輸出:
[i] DB2INSTPROF=C:PROGRAM FILESSQLLIB
[g] DB2SYSTEM=RAULCHONG
正如您可能已經猜測到的那樣,[i] 表明該變量是在實例級上定義的,而 [g] 表明它是在全局級上定義的。以下是一些與變量相關的命令:
要查看可以在 DB2 中進行定義的所有注冊表變量,請使用這個命令:db2set -lr
要在全局級上設置特定變量(在這個示例中為 DB2INSTPROF )的值,請使用:db2set DB2INSTPROF="C:PROGRAM FILESSQLLIB" -g
要在實例級上為實例“MyInst”設置變量,請使用:db2set DB2INSTPROF="C:MY FILESSQLLIB" -i MyInst
請注意上面的示例,在兩個級別(實例級和全局級)上設置了同一個變量。當注冊表變量在不同級別上進行定義時,DB2 總是會選擇最低級別的值;在本例中,它將選擇實例級的值。
db2set 命令和前一節中的 set 命令一樣,等號(=)前後不該留有空格。
某些注冊表變量為了使更改生效,要求您停止和啟動實例( db2stop/db2start )。另一些注冊表變量則沒有這個需求。為了安全起見,建議您在對注冊表變量作了更改後總是停止和啟動實例。
配置參數
配置參數是在兩個不同的級別(實例級和數據庫級)上定義的。每個級別上的變量都是不同的(不象注冊表變量那樣可以在不同級別上定義相同的變量)。
在實例級上,變量被存儲在數據庫管理器配置文件(dbm cfg)中;對這些變量所作的更改會影響與該實例相關的“所有”數據庫,這就是圖中顯示了 dbm cfg 框(每個實例定義了一個),並且該框都顯示在數據庫框外面的原因。以下是一些與配置參數相關的命令:
要從 CLP 查看 dbm cfg 的內容,請發出下面這個命令:db2 get dbm cfg
要更新特定變量的值,請發出下面這個命令:db2 update dbm cfg using <parameter> <value>
例如:
db2 update dbm cfg using INTRA_PARALLEL YES
V8 之前,對“所有”dbm cfg 變量所作的更改都要求您停止和啟動實例( db2stop/db2start )。現在,V8 中有大約 40% 的參數是“可聯機配置的”參數;也就是說,不再需要停止和啟動實例了。請參考“DB2 V8 管理指南(DB2 V8 Administration Guide)”以獲取更多詳細信息。
在數據庫級別上,變量被存儲在數據庫配置文件(db cfg)中;對這些變量所作的更改會影響特定的數據庫。從 圖 1中,您可以看到每個定義的數據庫內部都有一個 db cfg 框。
要查看 db cfg 的內容,請從 CLP 發出下面這個命令:db2 get db cfg for <dbname>
例如:
db2 get db cfg for mydb1
要更新特定變量的值,請發出下面這個命令:db2 update db cfg for <dbname> using <parameter> <value>
例如:
db2 update db cfg for mydb1 using MINCOMMIT 3
V8 之前,對“所有”db cfg 變量進行更改都要求您斷開與該數據庫的所有連接;然後,在進行第一個新連接時,這些更改將生效。V8 中有大約 50% 的參數可以進行聯機配置;也就是說,無需為了使更改生效而斷開到數據庫的所有連接。請參考“DB2 V8 管理指南(DB2 V8 Administration Guide)”以獲取更多詳細信息。
在 DB2 中,目錄是存儲有關數據庫及其連接信息的二進制文件。DB2 中有四個如下所描述的主目錄。還包括了相應的建立連接的命令;但是,許多用戶發現客戶機配置助手 GUI 工具(ClIEnt Configuration Assistant GUI Tool)非常便於建立連通性。
系統數據庫目錄(或系統 db 目錄)
系統數據庫目錄是主要的“目錄(table of contents)”,它包含了有關可以從您的 DB2 系統進行連接的所有數據庫的信息。正如您可以從 圖 1看到的那樣,系統 db 目錄是在實例級上進行存儲的;因此,如果您打算刪除一個實例,那麼您應當考慮備份其內容。
要列出系統 db 目錄的內容,請從 CLP 發出下面這個命令:
db2 list db directory
該命令輸出中的任何項都包含單詞“indirect”,這意味著:該項適用於本地數據庫(即,駐留在您當前正在使用的機器上的數據庫)。該項還會指向由“Database drive”項(在 Windows 中)或“Local database directory”項(在 UNIX 中)所指示的本地數據庫目錄。
任何包含單詞“Remote”的項都意味著:該項適用於遠程數據庫(即,駐留在其它機器上而非您當前正在使用的機器上的數據庫)。該項還會指向由“Node name”項所指示的節點目錄項。
要將信息輸入系統 db 目錄,您需要使用 catalog 命令:
db2 catalog db <db_name> as <alias> at node <nodename>
例如: db2 catalog db mydb as yourdb at node mynode
節點名是指向節點目錄中某一項的指針。在發出這條命令之前該項必須已經存在。
通常只有在將信息添加到遠程數據庫的系統 db 目錄時才使用 catalog 命令。對於本地數據庫來說,在用 create database 命令創建數據庫之後就自動創建 Catalog 項。
本地數據庫目錄(或本地 db 目錄)
本地數據庫目錄包含了有關本地數據庫(即,駐留在您目前正在使用的機器上的數據庫)的信息。正如您可以從 圖 1中看到的那樣,本地數據庫目錄駐留在數據庫結構內部。注意從該圖還可以看到沒有專門的命令用於將信息輸入到該目錄中。當您用 create database 命令創建數據庫時,在該目錄中會添加一項。
要列出本地數據庫目錄的內容,請發出以下命令:
db2 list db directory on <path>
其中,可以從系統 db 目錄相應項中的“Database drive”項(Windows 中)或“Local database directory”項(UNIX 中)獲取 <path>。
節點目錄
節點目錄用於存儲遠程數據庫的所有連通性信息。V8 僅支持 TCPIP 協議;因此,該目錄中的大多數項將顯示 TCPIP 信息,比如機器(其中包含了您想連接的數據庫)的主機名或 IP 地址,還有相關的 DB2 實例的端口號。下面是一些與節點目錄相關的命令:
要列出節點目錄的內容,請從 CLP 發出下面這個命令:db2 list node directory
要將信息輸入節點目錄,請從 CLP 發出 catalog 命令:db2 catalog tcpip node <node_name>
remote <hostname or IP_address>
server <port_name or port_number>
例如:
db2 catalog tcpip node mynode
remote 9.26.138.35
server 60000
要想得到您想要連接的遠程實例的端口號,可以查看該實例的 dbm cfg 中的 svcename 參數來實現。該值通常對應於 TCP/IP services 文件中的某一項。
DCS 目錄
DCS 目錄包含了通常駐留在 zSeries™(S/390®)或 iSerIEs™(AS/400®)機器上的主機數據庫的連通性信息。您需要安裝 DB2 Connect 軟件。下面是一些命令:
要列出 DCS 目錄的內容,請從 CLP 發出下面這個命令:db2 list dcs directory
要將信息輸入 DCS 目錄,請從 CLP 發出 catalog 命令:db2 catalog dcs db as <location name>
例如:
db2 catalog dcs db as db1g
請參考 DB2 V8 連通性快捷表以獲取本節中所描述的那些命令的摘要。
數據庫是與實例相關的封閉且獨立的單元。由於這個獨立性,所以兩個或更多的數據庫的對象可以有相同的名稱。例如, 圖 1顯示了一個名為“MyTablespace1”的表空間,它位於與實例“DB2”相關的數據庫“MYDB1”內部。還有一個同名的表空間,它位於也與實例“DB2”相關的數據庫“MYDB2”內部。
由於數據庫是封閉單元,所以您不能執行涉及了兩個不同數據庫表的查詢(除非您使用 Information Integrator(II)/ Relational Connect,這已經超出本文的討論范疇)。例如,涉及數據庫“MYDB1”中的“Table1”和數據庫“MYDB2”中的“TableZ”的查詢是不允許的。
數據庫是用命令 create database 創建的。請注意,這被認為是一個命令,而非 SQL 語句。
當您創建數據庫、表空間、日志和緩沖池時,會自動地創建配置文件,這就是完成該命令需要花費幾秒鐘的原因。
表空間是用作邏輯表和物理容器之間中間層的邏輯對象。創建表空間時,您可以將它與特定的緩沖池(數據庫高速緩存)以及特定的容器進行關聯。容器是物理存儲數據的地方,可以分成文件、目錄和原始設備等幾類。
Catalog(SYSCATSPACE)、系統臨時空間(TEMPSPACE1)和用戶空間(USERSPACE1)都是表空間,並且都會在創建數據庫時自動創建。Catalog 和系統臨時空間都可以看作是系統結構,因為它們是數據庫的正常操作所必需的。Catalog 包含了元數據(有關數據的數據)。一些其它 RDBMS 把這個結構稱作“數據字典”。不要把這一節的術語“Catalog”和早先提到的 catalog 命令混淆起來;它們毫無關系。
系統臨時表空間是數據庫管理器執行操作(比如連接和排序)的工作區。至少必須有一個系統臨時表空間。
缺省情況下會創建 USERSPACE1 表空間,但是可以刪除它。它是用來存儲用戶表的缺省位置。
圖 1用與本節標題顏色一樣的桃褐色顯示了用 create tablespace 命令顯式創建的其它表空間。請參考“DB2 V8 SQL 參考大全(DB2 V8 SQL Reference)”以獲取更多詳細信息。
表是由行和列組成的無序的數據記錄集。索引是與表相關的有序指針集,用於性能目的並確保唯一性。視頻、音頻和掃描文檔等可以作為大對象(LOB)存儲在數據庫中。表、索引和 LOB 駐留在表空間中。
日志是用於恢復目的的文件。日志記錄了對數據庫進行的每個操作。萬一發生故障,在將數據庫恢復到某個一致的點方面,日志就顯得至關重要了。
緩沖池是一塊內存區域,所有索引和數據頁(除了 LOB)都必須有序地經過該區域,從而進行處理。它是數據庫管理器所使用的主要高速緩存。在數據庫性能問題方面,緩沖池是進行調優的最重要的對象。
案例研究
既然您已經熟悉了 DB2 環境,那麼讓我們通過簡單的案例研究來回顧一下本文中提到的所有概念:
DB2 數據庫管理員(DBA)由於突發的個人原因離開了公司,經理要您負責所有 DB2 系統。這是您擔任新 DB2 DBA 的第一天,因而您想熟悉系統。您登錄到安裝了 DB2 的開發機器(Windows 2000),並打開 CLP 窗口。下面是您要進行的步驟: