引言
在當今的信息技術領域中,新信息在不斷地向我們沖擊 - 新的軟件產品、新的版本和新的功能。使您能跟上這些不斷發生的變化的方法之一就是利用您手中 現有的知識。我將向您展示如何使用您目前的 Microsoft® SQL Server 2000 的知識來迅速獲得有關 DB2 UDB V8 for Linux、UNIX and Windows 的技能。在本文中,術語“SQL Server”指的是 Microsoft SQL Server 2000,“DB2 UDB” 指的是 DB2 UDB V8 for Linux、UNIX and Windows。本文的重點主要集中在 Windows 平台。
第一個要注意的 SQL Server 和 DB2 UDB 之間的重要區別是 SQL Server 僅在 Windows 平台(Intel 體系結構)上受支持。而另一方面,DB2 UDB 可以在 Linux、UNIX 和 Windows 平台以及許多硬件體系結構中得到支持。針對所有這些平台的代碼基本上是相同的,只帶有極少數特定於平台的模塊。此外,DB2 UDB 產品還可以擴展到 iSeries®(AS/400® 和 z/OS®(大型機))的領域。iSerIEs 和 z/OS 的 DB2 UDB 成員的代碼庫與 DB2 UDB for Linux、UNIX and Windows 的不同,因為這些產品利用了各自的硬件體系結構。但是,這些 DB2 系列的功能是非常相似的。在您熟悉了 DB2 UDB for Linux、UNIX and Windows 以後,您可以大膽嘗試學習有關其它平台上的 DB2 的更多知識。
系統結構概述
下圖 1 展示了基本的 SQL Server 結構。圖 2 展示了 DB2 UDB 的結構,請把兩者做一下比較。我將在整篇文章中引用這兩幅圖。
圖 1. Microsoft SQL Server 2000 結構
圖 2. Linux、UNIX 和 Windows 上的 DB2 UDB V8 系統結構
實例和服務器
盡管在 SQL Server 術語中不經常使用“實例”這個術語,但是 實例的概念在 SQL Server 和 DB2 UDB 中是相似的。用戶通常只把它稱為“服務器”。對於這兩個產品而言,實例提供一個獨立的環境,數據庫對象在其中創建,並且應用程序在這些對象上運行。由於實例遵循一種“不共享”的體系結構,因此一個實例的對象通常不與其它實例的對象進行交互。圖 1 和圖 2 將 PROD 實例和 DEV 實例表示為兩個概念上彼此獨立的框。雖然實例的概念在這兩個產品中是相同的,但它的實現卻是截然不同的。在 SQL Server 中,您可以有一個“缺省”實例(僅有一個)和一些命名實例。 缺省實例在第一次安裝 SQL Server 時創建,並由計算機名來標識。而 命名實例在創建 缺省實例之後創建,並必須通過 computer_nameinstance_name 的格式來進行標識。
要在同一台機器上創建幾個 SQL Server 命名實例,您必須對每個新的實例使用安裝 CD,並且對每個新的安裝都要使用安裝 GUI。請注意,在這個過程中,為每個您創建的實例復制 SQL Server 代碼,但使用的路徑不同。只有某些文件是實例之間共享的。要刪除一個實例,您必須使用安裝 GUI 來卸載該實例。
在 DB2 UDB 中,當將產品安裝在 Windows 平台後,將缺省地創建“DB2”實例。在 Linux 和 UNIX 中,缺省實例名為“db2instl”。要在同一台機器上創建另一個實例,您只須執行 db2icrt <instance name> 命令。對於一台機器上的多個 DB2 UDB 實例,只有 DB2 UDB 代碼的 一個副本。
圖 3 顯示了 DB2 UDB Control Center GUI 中的缺省 DB2 UDB 實例“DB2”和用 db2icrt 命令創建的其它兩個實例。
圖 3. 顯示 DB2 UDB 實例的 DB2 UDB Control Center GUI
要從命令行接口引用一個給定的 DB2 UDB 實例,請使用 DB2INSTANCE 環境變量。該變量讓您指定所有命令將應用到的當前的活動實例。例如,如果 DB2INSTANCE 被設置成 PROD,然後您發出 create database MYDB1 命令,那麼您將創建和實例 PROD 關聯的數據庫。如果您想在實例 DB2 上創建該數據庫,則您必須首先將 DB2INSTANCE 變量的值更改為 DB2。
標識您想使用的實例的另一個簡單方法是如圖 3 所示的使用 DB2 UDB Control Center GUI。您可能必須通過右鍵單擊 Instances並選擇 Add來將實例添加到 GUI 中,這樣就可以在這個工具中看到該新實例的條目。
在 Windows 中創建了一個 DB2 UDB 實例後,一個與實例名同名的相應服務也被創建。可以執行 db2idrop <instance name> 命令來刪除 DB2 實例。該命令 不會除去 DB2 UDB 代碼。如果是 Windows 的話,它會除去該實例的相應 Windows 服務。
總而言之,SQL Server 和 DB2 UDB 中的實例在概念上是相同的;不同的是在其實現上。SQL Server 對於每個新實例都需要一個不同的 SQL Server 代碼的副本,而 DB2 UDB 則不需要。在 SQL Server 中,可以使用 Enterprise Manager GUI 來管理實例,而在 DB2 UDB 中,則使用 Control Center GUI 來達到類似的目的。
Windows 服務
表 1 描述了一些主要的 DB2 UDB Windows 服務。
表 1. DB2 UDB Windows 服務
服務名 描述 DB2 - <instance name>-<partition number> 這是一個給定實例的引擎。它處理所有的 SQL 語句並管理數據庫。如果啟用了分區支持,DB2 可以支持一個數據庫在不同機器上的多個分區。因此,< partition number> 表明您正在處理哪個分區。如果沒有啟用分區,分區號則不會出現。 DB2 Governor 收集連接 DB2 數據庫的應用程序的信息,並且基於您定義的規則來監控操作並對一些操作采取行動。例如,您可以指定一條規則將某一工作單元使用的時間限制在一個小時,並且如果超過了這個限制,則強制連接到數據庫。 DB2 JDBC Applet Server 為使用 JDBC 類型 3 驅動程序的 DB2 應用程序提供 JDBC 服務器支持。 DB2 License Server 監控是否符合 DB2 許可證。 DB2 Remote Command Server 支持多分區數據庫的分區間通信。 DB2 Security Server 當在客戶機上執行認證時,認證 DB2 數據庫用戶。 DB2DAS - DB2DAS00 這是 DB2 Administration Server。它支持本地的和遠程的數據庫管理請求。DB2 Administration Server 的 Windows 缺省名稱是 DB2DAS00。該服務器與工具目錄服務器一起使用來管理作業、警告等。
圖 4 顯示了帶有缺省 DB2 實例以及用 db2icrt 命令創建的 PROD 和 DEV 實例的 DB2 UDB Windows 服務。
圖 4. DB2 UDB Windows 服務
既然已經理解了 DB2 UDB 使用的 Windows 服務,讓我們把這些服務與 SQL Server 上的服務一一對應起來。請看下面的表 2。
表 2. 把 SQL Server Windows 服務映射到 DB2 UDB Windows 服務
SQL Server 服務 匹配的 DB2 UDB Windows 服務 MSSQLServer 服務。這個服務代表了缺省的 SQL Server 實例。 DB2 - DB2-0 服務。這個服務代表了缺省的“DB2”實例。 MSSQL$<instance_name> DB2 - <instance_name> SQLServerAgent DB2DAS - DB2DAS00。這個服務代表了 DB2 Administration Server(DAS)* SQLAgent$<instance_name> DB2DAS - DB2DAS00。這個服務代表了 DB2 Administration Server(DAS)* Microsoft Distributed Transaction Coordinator (MS DTC) Sync Point Manager(SPM)用於支持分布式工作單元。數據庫配置參數 SPM_NAME 向數據庫管理器標識了同步點管理器實例的名稱。 Microsoft Search 沒有匹配的 DB2 UDB Windows 服務;但是,Net Search Extender 軟件可用於類似的目的。
* 每台 DB2 機器僅可以有一個 DAS。
數據庫
正如圖 1 所示,在 SQL Server 中,一個實例可以包含多個數據庫。每個數據庫都是一個獨立的單元;然而,有關所有用戶數據庫的元數據都保存在 master數據庫中,因此查詢可以訪問兩個不同數據庫中的表。當創建一個實例的時候,同時也缺省創建了幾個數據庫,例如 tempdb、master、model 和 Northwind 等等。
SQL Server 采用兩個級別來存儲元數據:實例級(使用 master 數據庫中的系統表)和數據庫級(使用用戶數據庫本身的系統表)。master 和 tempdb 這兩個數據庫可以被實例中的其它數據庫共享。其它例如視圖(vIEw)這樣的對象在創建用戶數據庫時也被缺省創建。
正如圖 2 所示,在 DB2 UDB 中,一個實例也可以容納多個數據庫,每個數據庫是真正封閉、獨立的單元。每個數據庫都有自己的目錄表空間(存儲元數據)、臨時表空間和用戶表空間。但沒有一個數據庫能夠像 SQL Server 中的 master數據庫那樣可以跨數據庫共享元數據信息。同樣,也沒有數據庫能夠像 SQL Server 中的 tempdb 那樣可以在其它數據庫中被共享以保持臨時數據。DB2 UDB 包含了一個稱作 系統數據庫目錄的二進制文件,裡面有您從 DB2 機器連接的所有數據庫的條目。這個目錄在實例級別保存。
圖 2 顯示了 DB2 UDB 中的每個數據庫的獨立性。此外,您從圖中還可以看到每個數據庫都有自己的事務日志,這一點與 SQL Server 也很類似。
當創建一個實例時,缺省情況下不創建數據庫。您需要使用 create database 命令顯式地創建數據庫。您也可以使用如圖 5 和圖 6 所示的 Control Center 來創建數據庫。
圖 5. 使用 Control Center GUI 創建 DB2 UDB 數據庫
圖 6. 使用 Control Center GUI 創建 DB2 UDB 數據庫(續)
在圖 6 中,您也可以看到當單擊了 Show Command時會發生什麼情況。所有的 DB2 UDB Control Center GUI 屏幕都會顯示實際上在後台執行的 SQL 語句或命令。這些命令能夠保存在腳本中以供今後執行,或者被復制並從命令行處理器(Command Line Processor,CLP)工具或 Command Center GUI 工具中執行。這兩個工具分別等同於 SQL Server 的 iSQL 和 Query Analyzer。
一個實例內的數據庫通常不會相互交互;然而,如果應用程序有這樣的要求,那麼可以通過啟用 聯邦(federation)支持來實現此目的。
容器、表空間和文件組
在 DB2 UDB 中, 容器是數據實際存儲的地方,並可以分為文件、目錄和裸設備。在 SQL Server 中不存在“容器”的概念;而是用文件來存儲數據。
在 DB2 UDB 中, 表空間是邏輯對象,用作邏輯表和物理容器之間的層。當創建一個表空間時,您可以將它和一個特定的緩沖池(數據庫高速緩存)關聯起來,並關聯到特定的容器。這給了你管理和性能上的靈活性。例如,如果有一個“熱門”的表,您可以在它自身的表空間中定義它,而這個表空間又關聯到其自身的緩沖池。這樣就幫助確保了該表的數據總是在內存中高速緩存。
當用缺省選項創建 數據庫時,將創建三個表空間,如表 3 所述。
表 3. 當創建數據庫時,缺省創建的 DB2 UDB 表空間
表空間名稱 描述 SYSCATSPACE 包含元數據的目錄表空間。 TEMPSPACE1 用於執行諸如連接和排序操作的系統臨時表空間。該表空間的名稱可以更改。 USERSPACE1 這個表空間是可選的,用於在創建表時沒有顯式指定表空間的時候存儲用戶表。
因為數據庫是獨立的單元,因此不能跨數據庫共享表空間。又因為表空間只在一個數據庫中是已知的,所以兩個不同的數據庫可以有同名的表空間。您可以在圖 2 中看到,數據庫 MYDB1 有一個名為 MYTBLS 的表空間,而數據庫 MYDB2 也有一個同名的表空間。
SQL Server 通過與 DB2 UDB 表空間類似的方式來使用文件組。兩個不同的數據庫可以有同名的文件組,這一點和表空間類似。如圖 1 中所顯示的,數據庫 MYDB1 有一個名為 MyFileGroup 的文件組,而數據庫 MYDB2 也有一個同名的文件組。
DB2 UDB 表空間可以被分為 SMS(系統管理空間)或 DMS(數據庫管理空間)。SMS 表空間由操作系統管理並僅可以是目錄。它們會隨著需要自動地增長,因此提供了較好的性能並且不需要太多管理。這與 SQL Server 數據文件的行為(如果您允許自動增長)如出一轍。DMS 表空間由 DB2 UDB 管理,可以是文件或裸設備。這種類型的表空間能獲得最佳性能,但需要一定的管理。例如,您需要提前指定希望分配給表空間的空間量,因為增長不是自動進行的。
事務日志的位置和大小可以在數據庫 配置文件中指定。
下表 4 顯示了 SQL Server 數據庫如何與 DB2 UDB 數據庫或表空間一一對應。
表 4. SQL Server 數據庫如何與 DB2 UDB 數據庫或表空間一一對應
SQL Server 數據庫 DB2 UDB 數據庫或表空間 Master SYSCATSPACE(目錄表空間);在 DB2 UDB 中,僅在數據庫級別保存該信息。 model 沒有等同的數據庫/表空間;然而,DB2 提供了一個名為“db2look”的工具,它用來將數據庫的結構復制到一個腳本文件以便今後執行它來創建一個新的數據庫。 msdb 工具目錄數據庫,它可以在安裝時創建,也可以在安裝後通過命令 create tools catalog 創建 Northwind SAMPLE 數據庫 pubs SAMPLE 數據庫 tempdb TEMPSPACE1 表空間 distribution DB2 UDB 為所有的 DB2 UDB 系列提供內建的復制支持。涉及非 DB2 的關系管理系統的復制需要 Information Integrator 軟件。
對象名稱
SQL Server 對象名稱的結構由四部分組成,如下所示:
[SQL Server Instance].[Database Name].[Owner].[object name]
請注意:這些名稱的頭三個部分是可選的,取決於使用對象的上下文。
在 DB2 UDB 中,對象的結構由兩部分組成:
Schema_name.object_name
模式名用來從邏輯上對對象進行分組。模式名不一定和用戶標識相匹配。任何具有名為 IMPLICIT_SCHEMA 特權的用戶都可以使用不存在的模式創建對象。例如,假設“Peter”具有 IMPLICIT_SCHEMA 特權,並執行了以下命令:
CREATE TABLE WORLD.TABLEA (lastname char(10))
在這種情況下,創建了表 WORLD.TABLEA,其中 WORLD 是新創建的模式。如果 Peter 沒有顯式地指明該模式,那麼表 PETER.TABLEA 也會被創建,因為缺省使用了連接標識。
在 DB2 UDB 中,在發出命令之前您總是顯式地連接至一個數據庫,這就解釋了為什麼數據庫名稱不是對象名稱結構一部分的原因。
表、視圖和索引
表、視圖和索引在 SQL Server 和 DB2 UDB 中基本上是相同的。就創建 GUI 而言,使用 SQL Server 的 Enterprise Manager GUI 工具時,您必須在創建索引之前創建一個圖表,而使用 DB2 UDB Control Center 時,您無需中間步驟就可以直接從 GUI 中創建一個索引。
SQL Server 使用 master 數據庫來存儲有關其它用戶數據庫的信息,但是用戶數據庫本身是獨立的單元,就象在 DB2 UDB 中一樣。因此,在兩種產品中,表、視圖或索引都可以在兩個不同的數據庫中擁有相同的名稱。SQL Server 允許連接不同數據庫(和 SQL Server)的表;DB2 UDB 僅在顯式激活聯邦的時候才提供此支持。
存儲過程、觸發器和用戶定義函數(UDF)
本文的主要目的是通過與 SQL Server 環境的比較來描述 DB2 UDB 環境。談論使用存儲過程、觸發器和 UDF 的數據庫服務器的邏輯是一個相當廣泛的話題,因此這裡只是簡要地介紹一下。
首先,兩個產品都支持所有這些對象。只是SQL Server 使用它專有的 Transact-SQL(T-SQL),而 DB2 使用的是 SQL 過程語言(SQL Procedural Language,SQL PL),兩者都是 SQL/PSM 標准的擴展。在 SQL Server 中,Transact-SQL 實際應用於每一件事情,包括實現 SQL Server 命令。在 DB2 UDB 中,情況卻不是這樣。DB2 使用不同的 API 來實現其命令,並且因為 SQL PL 存儲過程被首先轉換為 C,所以它需要一個 C 編譯器來開發這些存儲過程。Transact-SQL 是在 SQL Server 引擎中本機執行的一種解釋語言。當運行它時,會變成經過解釋的字節代碼,並在每次運行時都需要優化。存儲過程的 C 語言實現可以提供性能優勢,因為代碼只編譯一次(尤其當運行在無保護方式下);然而,它也增添了對 C 編譯器的需求。在 DB2 UDB 的未來發行版中,在提供現有功能的基礎上,希望能在無需 C 編譯器的情況下支持 SQL PL 存儲過程,這將允許用戶選擇他們想要實現 SQL PL 存儲過程的方式。
使用 DB2 UDB,您可以在觸發器和函數中使用 內聯SQL PL,這意味著您不需要 C 編譯器。通過這種方法可以支持 SQL PL 語句的一個子集。
配置文件
SQL Server 在實例級別和數據庫級別存儲它的配置信息。使用 Enterprise Manager GUI,右鍵單擊一個給定的實例或數據庫並選擇 PropertIEs就可以顯示一個帶有所有可能配置選項的窗口。在 DB2 UDB 中,配置參數同樣存儲在實例級別(稱為 數據庫管理器配置文件)和數據庫級(稱為 數據庫配置文件)。
使用 Control Center,如果右鍵單擊一個給定的實例並選擇 Configure Parameters,您將會看到圖 7 所示的窗口。
圖 7. DB2 UDB 數據庫管理器配置參數(實例級別)
在數據庫級別,右鍵單擊一個給定的數據庫並選擇 Configure Parameters,將顯示圖 8 所示的窗口。
圖 8. 數據庫配置參數(數據庫級別)
DB2 UDB 提供了許多可以用來配置系統的參數;然而,如果您喜歡用一種簡單的方法來自動配置系統,請使用 autoconfigure 命令(或 Configuration Advisor GUI),它根據您提供的一些信息,將數據庫管理器和數據庫配置參數設置成最佳值。圖 9 顯示了 Configuration Advisor。
圖 9. DB2 UDB Configuration Advisor
除了配置文件之外,DB2 UDB 通常還把 DB2 注冊表變量用於特定於平台的配置。注意, DB2 注冊表變量與 Windows 注冊表沒有任何關系。用戶可以使用 db2set 命令來查看並更改這些變量。
安全性
SQL Server 使用認證、角色和特權的概念來實現安全性。
支持兩種方式的認證:
Windows 認證。
Windows 操作系統認證登錄標識和密碼,並僅將登錄標識傳遞給 SQL Server,後者再將這個標識與 sysxlogins 系統表匹配。
混合方式的認證。
SQL Server 根據它在 sysxlogins 系統表中的信息認證登錄標識和密碼。
一旦經過認證,用戶還不能對 SQL Server 進行任何操作,除非他/她被分配了一個角色或一個給定的特權。 角色被用於將用戶分組為一個獨立的單元,在這個單元上將應用許可權。因此,您不用將單獨的許可權授予幾個用戶,相反,您可以創建一個包括所有這些許可權的角色,然後再把這個角色分配給用戶。
在 DB2 UDB 中,用戶不存在於數據庫中,而是由操作系統進行管理的。因此,DB2 UDB 的認證在某種程度上有點類似於 SQL Server 的 Windows 認證;但是,在任何數據庫表中都不會保存數據庫登錄信息。任何操作系統用戶都有可能潛在地使用 DB2 UDB;然而,除非他們被賦予了給定的 DB2 UDB 權限或特權,否則他們能做的並不是很多。通過 Control Center GUI 可以很方便地處理權限和特權的賦予和撤銷。您可能首先必須將一個用戶或組從可用的操作系統用戶或組中添加到 Control Center。
另外,在 DB2 UDB 中不使用術語“角色”;而是使用術語“權限(authority)”,這類似於 SQL Server 的固定的服務器和數據庫角色。DB2 UDB 不支持 MS SQL Server 的用戶定義的數據庫角色;但是,一個操作系統組可以被賦予權限和特權來實現角色功能。DB2 UDB 支持的權限有:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。
使用 GRANT SQL 語句不能賦予 SYSADM、SYSCTRL 和 SYSMAINT 權限。這些特殊的權限只能從數據庫管理器配置文件來設置。
具有 SYSADM 權限的 DB2 UDB 用戶相當於具有 sysadmin 角色的 SQL Server 用戶。
DB2 UDB 還使用術語“特權”,這等同於 SQL Server 的許可權。有數據庫 特權(connect、createtab 等)和 數據庫對象特權(schema、table、vIEw 等)。圖 10 顯示了從 Control Center GUI 中獲得的 DB2 UDB 安全性信息。圖中大部分的選項卡對應了 DB2 UDB 所支持的特權。
圖 10. DB2 UDB 安全性
下表 5 將 SQL Server 的安全性概念和 DB2 UDB 中的一一對應起來。
表 5. 將 SQL Server 的安全性概念和 DB2 UDB 中的一一對應起來
SQL Server DB2 UDB 兩種認證方式:Windows 認證和混合方式認證 由操作系統處理的一種認證方式;非常接近於 SQL Server 的 Windows 認證。 角色 權限(都是預定義的,沒有用戶定義的權限。) 許可權 特權
工具
我們已經簡單地討論了 SQL Server 和 DB2 UDB 中使用的一些工具;然而,還有許多工具在本文中並沒有涉及到。圖 11 顯示了 DB2 UDB 的菜單。這應該讓您對本文中沒有討論到的工具和主題有一個大致的認識。
圖 11. DB2 UDB 菜單
使用命令行
如果您更喜歡使用命令行接口,那麼對於 SQL Server,您應該習慣使用 iSQL 實用程序。在 DB2 UDB 中的對應接口是命令行處理器(CLP)。
圖 12 顯示了 DB2 UDB CLP 實用程序。我們首先從命令提示窗口執行命令 db2cmd 來打開命令窗口。這將初始化運行 CLP 所需要的 DB2 環境。然後,我們通過執行命令 db2 來調用 CLP。
圖 12. DB2 UDB CLP(命令行處理器)
SQL Server 和 DB2 UDB 都提供了同樣是 GUI 工具的命令行接口。SQL Server 中有 Query Analyzer。而在 DB2 UDB 中對等的是 Command Center,如圖 13 所示。
圖 13. DB2 UDB Command Center
結束語
本文利用您現有的 Microsoft SQL Server 2000 知識向您介紹了 DB2 UDB V8 for Linux、Windows and UNIX。既然 SQL Server 只受 Windows 平台的支持,因此本文就著重於這個平台;然而,此處所有您學習到的關於 DB2 UDB 的知識(不是很詳細)也可以應用於 Linux 和 UNIX 平台。而且,由於使用的是 Windows 平台,所以我們采用了兩個產品的 GUI 工具來解釋大多數的概念。但是,所有已經解釋過的內容都有一個等同的命令。
作為對 SQL Server 和 DB2 UDB 體系結構的最後回顧,讓我們比較一下圖 14 和圖 15。它們分別使用 SQL Server Enterprise Manager 和 DB2 UDB Control Center 顯示了各自的數據庫對象。
圖 14. MS SQL Server Enterprise Manager - 總結
圖 15. DB2 UDB Control Center - 總結