| 級別: 初級 Suita Gupta (suitag@my.ibm.com), 技術(shù)顧問(wèn), IBM Malaysia 2003 年 7 月 17 日 如果您是一名有興趣培養自己 DB2? 9 技能的數據庫專(zhuān)家,那么您很可能已經(jīng)具備了其他關(guān)系數據庫產(chǎn)品的數據庫技能。近來(lái),本文依據最新版本的 DB2 和 Oracle 作了更新,將向您展示如何利用您現有的 Oracle 10g 的知識,快速掌握 IBM? DB2 9 for Linux?, UNIX?, and Windows? 方面的技能。 在 developerWorks 的上一篇文章 中,我們談到了如何利用 MS SQL Server 2000 方面的技能學(xué)習 DB2。您對 Oracle 背景知識的熟悉程度更超過(guò) SQL Server 嗎?如果是這樣,那么請繼續閱讀。在本文中,我們將展示如何使用您現有的 Oracle 10g 知識來(lái)快速掌握 DB2 9 方面的技能。 在 2006 年 7 月 28 日,IBM 發(fā)布了 DB2 9 for Linux, UNIX, and Windows,這是一種真正的混合型數據服務(wù)器,可滿(mǎn)足當今苛刻的業(yè)務(wù)需求。 DB2 9 是當今惟一采用 pureXML? 技術(shù)的數據服務(wù)器,這種技術(shù)允許以原生的形式存儲 XML,也就是說(shuō),以分層格式存儲 XML。 DB2 9 的其他特性包括行壓縮、基于標簽的訪(fǎng)問(wèn)控制(label based access control,LBAC)安全性以及自調優(yōu)內存管理器(Self-tuning Memory Manager,STMM)等自治特性。本文首先對 DB2 與 Oracle 作一個(gè)比較,然后著(zhù)重介紹 DB2 9 中的新特性。 注意:在本文后面的內容中,我們將使用術(shù)語(yǔ) “Oracle” 來(lái)表示 Oracle 10g Release 2,而用 “DB2” 表示 DB2 9 for Linux, UNIX, and Windows。
首先,我們需要理解 Oracle 使用的架構,并理解它與 DB2 的不同之處。圖 1 展示了 Oracle 的系統結構。將該圖與 圖 2 進(jìn)行比較,后者顯示了 DB2 的系統結構。在閱讀本文的時(shí)候,為便于理解,可以參照這兩個(gè)圖。 圖 1. Oracle on Linux, UNIX, and Windows Version 10.2 的系統結構 ![]() 圖 2. DB2 on Linux, UNIX, and Windows 系統結構 ![]()
在 Oracle 和 DB2 中,實(shí)例 的概念是類(lèi)似的。在這兩者之中,實(shí)例都是指后臺進(jìn)程與共享內存的組合。兩者之間的主要差別在于,在 Oracle 中每個(gè)實(shí)例只能有一個(gè)數據庫,而在 DB2 中多個(gè)數據庫可以共享一個(gè)實(shí)例。 在 Oracle 中,由于數據庫與實(shí)例是一對一的關(guān)系,因此用 CREATE DATABASE 命令創(chuàng )建一個(gè)數據庫的同時(shí)便隱式地創(chuàng )建了一個(gè)實(shí)例?;蛘?,為了在計算機上創(chuàng )建一個(gè) Oracle 實(shí)例,也可以使用 Database Configuration Assistant,或者使用 ORADIM 實(shí)用程序,后者是 Oracle 9i 通過(guò) NEW 選項提供的。另外還必須提供某些信息,包括系統標識符(System Identifier,SID)或一個(gè)服務(wù)名稱(chēng)、實(shí)例密碼、最大用戶(hù)數、啟動(dòng)模式等等。類(lèi)似地,為了刪除實(shí)例,可以使用 ORADIM 實(shí)用程序加 DELETE 選項。這里需要提供 SID 或服務(wù)名稱(chēng)。除非在安裝過(guò)程中創(chuàng )建一個(gè)新的數據庫,否則在以 fresh 方式安裝 Oracle 的時(shí)候,不會(huì )創(chuàng )建缺省的實(shí)例。 在 DB2 中,當在 Windows 平臺上安裝了該產(chǎn)品之后,便缺省地創(chuàng )建了一個(gè)實(shí)例 "DB2"。在 Linux 和 UNIX 中,缺省的實(shí)例名稱(chēng)為 "db2inst1"。若要在同一臺計算機上創(chuàng )建另一個(gè)實(shí)例,只需執行命令 圖 3 展示了缺省的 DB2 實(shí)例 “DB2”(在 Windows 中)和從 DB2 Control Center GUI 中用 db2icrt 命令創(chuàng )建的另外兩個(gè)實(shí)例。 圖 3. 顯示 DB2 實(shí)例的 DB2 Control Center GUI ![]() 若要在命令行接口中引用給定的 DB2 實(shí)例,可以使用環(huán)境變量 DB2INSTANCE。通過(guò)這個(gè)變量,可以指定當前活動(dòng)實(shí)例,所有命令將應用到此實(shí)例。例如,如果 DB2INSTANCE 被設置為 PROD,然后您執行了命令 還有一種標識要使用的實(shí)例的簡(jiǎn)單方法,那就是使用 DB2 Control Center GUI,如 圖 3 所示。要在該工具中看到對應于新實(shí)例的條目,需要通過(guò)右擊 Instances 并選擇 Add 來(lái)將該實(shí)例添加到此工具中。要刪除 DB2 中的一個(gè)實(shí)例,可以執行命令 總之,在 Oracle 中,可以使用 Database Configuration Assistant 來(lái)創(chuàng )建、修改、啟動(dòng)、停止和刪除實(shí)例,而在 DB2 中則可以使用 Control Center GUI 做同樣的事情。而且,Oracle 實(shí)例與數據庫只能是一對一的關(guān)系,而在 DB2 中卻不是這樣。一個(gè) DB2 實(shí)例中可以同時(shí)存在多個(gè)數據庫,并且可以并發(fā)地使用這些數據庫。
在 Oracle 中,可以用 CREATE DATABASE 命令手動(dòng)創(chuàng )建數據庫,也可以用 Database Configuration Assistant 創(chuàng )建數據庫。手動(dòng)創(chuàng )建數據庫時(shí),在執行 CREATE DATABASE 命令之前,需要執行一系列的步驟,包括設置 OS 變量,準備參數文件,以及創(chuàng )建密碼文件。 元數據信息在 Data Dictionary 中存儲和管理,由基本表和相應的視圖組成?;颈硎窃跀祿靹?chuàng )建過(guò)程中自動(dòng)創(chuàng )建的,而視圖則是通過(guò)運行 catalog.sql 和 catproc.sql 腳本構造的。 因此,Oracle 數據庫可看作包含 3 種類(lèi)型的文件的一個(gè)集合:
在 DB2 中,一個(gè)實(shí)例可以包含多個(gè)數據庫,如 圖 2 所示。每個(gè)數據庫都是一個(gè)封閉的、真正獨立的單元。每個(gè)數據庫有其自己的編目表空間、臨時(shí)表空間和用戶(hù)表空間,這些表空間是在創(chuàng )建數據庫時(shí)缺省創(chuàng )建的。DB2 包含一個(gè)稱(chēng)為系統數據庫目錄(system database directory) 的二進(jìn)制文件,其中包含可從 DB2 機器上連接的所有數據庫的條目。這個(gè)目錄保存在實(shí)例級。 當創(chuàng )建一個(gè)實(shí)例時(shí),缺省情況下不會(huì )創(chuàng )建數據庫,您需要使用 create database 命令顯式地創(chuàng )建一個(gè)數據庫。此外還可以用 Control Center 創(chuàng )建數據庫,如 圖 4 和 圖 5 所示。 圖 4. 使用 Control Center GUI 創(chuàng )建 DB2 數據庫 ![]() 圖 5. 使用 Control Center GUI 創(chuàng )建 DB2 數據庫(續) ![]() 在 圖 5 中,您也可以看看單擊 Show Command 時(shí)會(huì )出現什么情況。所有的 DB2 Control Center GUI 屏幕都會(huì )顯示實(shí)際上在后臺執行的 SQL 語(yǔ)句或命令。這些命 令可以保存在一個(gè)腳本中,以便在以后執行,或者也可以將它們復制到 Command Line Processor(CLP)或 Command Center GUI 工具中,在這些工具中執行。這些工具分別相當于 Oracle 的 SQL*Plus 和 iSQL *Plus。 可以使用 ‘DROP DATABASE‘ 命令或者在 DB2 Control Center GUI 中刪除一個(gè) DB2 數據庫。而在 Oracle 中卻不是使用這樣的命令。數據庫的刪除是通過(guò)刪除所有相關(guān)數據文件來(lái)完成的。 同一個(gè)實(shí)例中的數據庫通常不會(huì )相互進(jìn)行交互。然而,如果應用程序需要與多個(gè)數據庫交互,那么通過(guò)啟用聯(lián)邦(federation) 支持可以滿(mǎn)足這一需求。在 參考資料 小節中有一篇關(guān)于聯(lián)邦的文章。
在 Oracle 中,在物理上數據是存儲在被稱(chēng)作數據文件(Data File)的文件中的。這類(lèi)似于 DB2 的容器(container),DB2 的容器也是數據實(shí)際存儲的地方。每個(gè) Oracle 數據庫包含一個(gè)名為 SYSTEM 的表空間,這是在創(chuàng )建數據庫時(shí)由 Oracle 自動(dòng)創(chuàng )建的。其他用于用戶(hù)數據、臨時(shí)數據和索引數據的表空間則需要在創(chuàng )建數據庫之后另行創(chuàng )建,并且在使用這些表空間之前,還需要為之指定一個(gè)用戶(hù)。 在 DB2 中,表空間 是邏輯對象,作為邏輯表和物理容器之間的一層。當創(chuàng )建一個(gè)表空間時(shí),可以將它與一個(gè)特定的緩沖池(數據庫緩存)關(guān)聯(lián)起來(lái),并關(guān)聯(lián)到特定的容器。這為性能管理帶來(lái)了靈活性。例如,如果有一個(gè) "hot" 表,那么可以在一個(gè)單獨的表空間中定義它,而這個(gè)表空間又與一個(gè)獨立的緩沖池相關(guān)聯(lián)。這有助于確保此表中的數據連續地緩存在內存中。 在 DB2 中,使用 CREATE DATABASE 命令及其缺省值創(chuàng )建數據庫時(shí),同時(shí)也會(huì )自動(dòng)創(chuàng )建三個(gè)缺省的表空間。表 1 描述了缺省的 DB2 表空間: 表 1. 用缺省值創(chuàng )建數據庫時(shí),缺省創(chuàng )建的 DB2 表空間
在 DB2 中,由于數據庫是獨立的單元,因此表空間不能跨數據庫共享。由于表空間只在一個(gè)數據庫中是可知的,因此兩個(gè)不同的數據庫可以有具有相同名稱(chēng)的表空間。在 圖 2 中可以看到這一點(diǎn),其中數據庫 MYDB1 有一個(gè)名為 MYTBLS 的表空間,而數據庫 MYDB2 也有一個(gè)同名的表空間。 DB2 表空間可以分為 SMS(系統管理的表空間)與 DMS(數據庫管理的表空間)兩類(lèi)。SMS 表空間由操作系統管理,它們只能是目錄。SMS 表空間可根據需要自動(dòng)增長(cháng),因此 SMS 可以提供很好的性能,并且需要的管理也很少。DMS 表空間由 DB2 管理,既可以是文件,也可以是原始設備。這種類(lèi)型的表空間可以提供最佳性能,但是需要進(jìn)行一些管理。例如,需要預先指定想要為這個(gè)表空間分配多大的空間,因為這種表空間不能自動(dòng)增長(cháng)。 Oracle 的存儲模型中沒(méi)有 SMS 的概念,但是它的數據文件類(lèi)似于 DB2 DMS 表空間。也就是說(shuō),可以通過(guò)增加數據文件的大小,或為表空間添加數據文件,或者通過(guò)添加一個(gè)新的表空間,來(lái)增加數據庫的大小。 表 2 顯示了 Oracle 數據庫或表空間與 DB2 數據庫或表空間的對應關(guān)系。 表 2. Oracle 數據庫與 DB2 數據庫和表空間的對應關(guān)系
前面已指出,Oracle 的數據緩沖區概念相當于 DB2 的緩沖池。但是,DB2 允許多個(gè)緩沖池存在。在 DB2 中不需要預先定義可創(chuàng )建的緩沖池的數量,緩沖池的名稱(chēng)可以是任意的。 Oracle 中塊(block) 的概念與 DB2 中的頁(yè)最為相似。一個(gè) DB2 頁(yè)的大小可以為 4k、8k、16k 或 32k。表中的一個(gè)行只能放在一個(gè)頁(yè)中,而不能像 Oracle 中那樣跨多個(gè)頁(yè)。
Oracle 中的對象名稱(chēng)形式如下:
在 DB2 中,對象名稱(chēng)也是由兩部分組成的結構:
和在 Oracle 中一樣,DB2 模式名稱(chēng)用于在邏輯上組織對象。但是兩者之間一個(gè)重要差異是,在 DB2 中,模式名稱(chēng)不一定與一個(gè)用戶(hù) id 相匹配。任何擁有 IMPLICIT_SCHEMA 權限的用戶(hù)都可以用一個(gè)不存在的模式創(chuàng )建對象。例如,假設 “Peter” 具有 IMPLICIT_SCHEMA 權限,他執行以下命令:
該命令創(chuàng )建表 WORLD.TABLEA,其中 WORLD 是新創(chuàng )建的模式。如果 Peter 沒(méi)有顯式地指定模式,那么該命令就會(huì )創(chuàng )建表 PETER.TABLEA,因為缺省情況下是使用連接 ID。 在 DB2 中,在發(fā)出與數據庫相關(guān)的命令之前,總是要連接到數據庫。因此,在這種架構下,對象名稱(chēng)不需要包括數據庫名稱(chēng)。
在 Oracle 和 DB2 中,表、視圖和索引基本上是一樣的。 DB2 提供了一個(gè)名為 Design Advisor 的實(shí)用程序,可以用它來(lái)為特定的查詢(xún)或工作負載推薦索引。Design Advisor 可以從 DB2 Control Center 中調用,也可以從 DB2 CLP 中使用 db2advis 命令來(lái)調用。在 DB2 中,索引是直接與表定義綁定的。例如,當使用 DMS 表空間時(shí),可以用下面的語(yǔ)句指定索引存放在哪個(gè)表空間:
上面的例子表明,表中的數據將存儲在表空間 ‘tbls1‘ 中,而索引頁(yè)將存儲在表空間 ‘tbls2‘ 中。但在 Oracle 語(yǔ)法中,CREATE INDEX 語(yǔ)句有一個(gè)選項來(lái)指定索引存放在哪個(gè)表空間。 此外,在 DB2 中,索引一旦創(chuàng )建好,便不能修改索引定義中的任何子句。為了進(jìn)行更改,需要刪除索引,然后重新創(chuàng )建索引。 和在 Oracle 中一樣,不同數據庫中的 DB2 表、視圖和索引可以有相同的名稱(chēng)。相同數據庫中的表和視圖則必須使用不同的名稱(chēng),但是允許使用與已有的表或視圖相同的名稱(chēng)創(chuàng )建索引。
存儲過(guò)程、觸發(fā)器和用戶(hù)定義函數(UDF) 在 Oracle 環(huán)境中,有很多方法來(lái)創(chuàng )建和訪(fǎng)問(wèn)存儲過(guò)程、觸發(fā)器和函數。PL/SQL 是 SQL 的面向對象(OO)過(guò)程擴展,支持數據操縱(DML)、流控制、變量和常量的聲明、過(guò)程和函數定義以及 OO 數據類(lèi)型,例如嵌套表和變長(cháng)數組(varray)。Oracle 還將 JVM 并入到它的引擎中。在 Oracle 數據庫中,可以使用 SQLJ 將存儲過(guò)程、函數和觸發(fā)器,作為類(lèi)來(lái)創(chuàng )建、存儲和執行。Oracle 還支持 Type 1 至 4 的 JDBC 驅動(dòng)程序。 DB2 存儲過(guò)程可以用 DB2 預編譯器支持的任何語(yǔ)言編寫(xiě),包括 Java、C、C++、REXX、Fortran 和 COBOL。但是,我們推薦您使用 SQL Procedural Language(SQL PL),這種語(yǔ)言非常類(lèi)似于 Oracle 的 PL/SQL。在開(kāi)發(fā) SQL PL 存儲過(guò)程時(shí),需要一個(gè) C 編譯器,因為這種存儲過(guò)程首先要轉換成 C。存儲過(guò)程的 C 實(shí)現可以提供性能優(yōu)勢,因為代碼只需編譯一次(在 unfenced 模式下性能優(yōu)點(diǎn)尤其明顯)。但是,在開(kāi)發(fā)這種存儲過(guò)程時(shí),開(kāi)發(fā)系統上需要一個(gè)額外的 C 編譯器。在 DB2 將來(lái)的版本中,有望出現不需 C 編譯器支持的 SQL PL 存儲過(guò)程。DB2 存儲過(guò)程開(kāi)發(fā)還利用 Type 1 至 4 的 JDBC 驅動(dòng)程序來(lái)支持 SQLJ 和 Java。 觸發(fā)器和函數的開(kāi)發(fā)可以使用內聯(lián) SQL/PL,這種方法不需要 C 編譯器。這種方法支持 SQL PL 語(yǔ)句的一個(gè)子集。另外還可以使用 DB2 Development Center Tool 來(lái)簡(jiǎn)化 DB2 存儲過(guò)程和用戶(hù)定義函數的創(chuàng )建、構建、調試和部署。
傳統上,Oracle 將所有與會(huì )話(huà)和系統相關(guān)的參數存儲在一個(gè)文本文件中,這種文件通常被稱(chēng)做 initSID.ora。但是,由于這種文本文件不具有持久性,從 Oracle 9i 開(kāi)始,Oracle 引入了 Server Parameter File(SPFILE),這是一種存儲在服務(wù)器上的二進(jìn)制參數文件。它在實(shí)例停止之后到啟動(dòng)之前這個(gè)過(guò)程中是持久存在的。不過(guò),當 SPFILE 不可用的時(shí)候,仍然使用 initSID.ora 文件。引入 SPFILE 之前,任何對參數有影響的 ALTER SYSTEM 和 ALTER SESSION 命令都只能在實(shí)例或會(huì )話(huà)活動(dòng)期間持久。每當數據庫實(shí)例需要回彈(rebound)時(shí),DBA 都必須手動(dòng)修改 initSID.ora 文本文件。對于偵聽(tīng)器,網(wǎng)絡(luò )訪(fǎng)問(wèn)配置通常存儲在 listener.ora 中;對于客戶(hù)機訪(fǎng)問(wèn),網(wǎng)絡(luò )訪(fǎng)問(wèn)配置通常存儲在 tnsnames.ora 中。 在 DB2 中,配置參數也是存儲在實(shí)例級和數據庫級,在實(shí)例級是數據庫管理器(database manager) 配置文件,在數據庫級是數據庫配置文件。這些參數大多數都可以動(dòng)態(tài)地更改,也就是說(shuō),不需要為了使對參數值的更改生效而停止并重啟實(shí)例或者重連所有連接。 如果想在 CLP 中手動(dòng)更改特定的數據庫管理器配置參數,可以使用命令 如果想在 CLP 中手動(dòng)更改特定的數據庫參數,可以使用命令 這兩個(gè)命令分別相當于 Oracle 的 ALTER SYSTEM 和 ALTER SESSION?;蛘?,也可以使用 Control Center 查看和修改這些參數的值。如果右鍵單擊一個(gè)給定的實(shí)例,并選擇 Configure Parameters,那么可以看到 圖 6 中顯示的窗口。 圖 6. DB2 Database Manager 配置參數(實(shí)例級) ![]() 在數據庫級,右擊一個(gè)給定的數據庫,并選擇 Configure Parameters,則可以看到 圖 7 中顯示的窗口。 圖 7. 數據庫配置參數(數據庫級) ![]() DB2 提供了很多用于配置系統的參數。但是,如果想通過(guò)一種容易的方法自動(dòng)配置系統,那么可以使用 圖 8. DB2 Configuration Advisor ![]() 除了配置文件外,DB2 通常還為與平臺相關(guān)的配置使用 DB2 注冊表變量。注意,DB2 注冊表變量與 Windows 注冊表沒(méi)有任何關(guān)系??梢允褂妹?db2set 查看和更改這些變量。 連接(網(wǎng)絡(luò )訪(fǎng)問(wèn))信息存儲在 System 數據庫目錄、本地數據庫目錄和節點(diǎn)目錄中。這些都是二進(jìn)制文件,只能用 CATALOG 和 UNCATALOG 命令修改。
接下來(lái),我們來(lái)看看內存架構和后臺進(jìn)程,并且比較一下 Oracle 和 DB2 中內存架構和后臺進(jìn)程的不同之處。 圖 9. Oracle 內存架構和后臺進(jìn)程 ![]() Oracle 中的 System Global Area(SGA)是一組共享內存塊,用于存儲與實(shí)例有關(guān)的信息。其中包括語(yǔ)句緩存、重做日志緩沖區和數據緩沖區緩存。Program Global Area(PGA)和 User Global Area(UGA)共享內存塊,包含用于服務(wù)器進(jìn)程和用戶(hù)會(huì )話(huà)的數據和控制信息。 Oracle 支持在同一臺計算機上存在多個(gè)實(shí)例,但不允許共享后臺進(jìn)程。例如,同一臺計算機上的三個(gè)實(shí)例就需要三組后臺進(jìn)程。因此建議在一臺計算機上包含一個(gè)數據庫、一個(gè)實(shí)例和多個(gè)模式。 圖 10. DB2 內存架構和后臺進(jìn)程 ![]() DB2 和 Oracle 都使用共享內存塊,但是 DB2 與 Oracle 內存架構的實(shí)現方式略有不同。由于 DB2 實(shí)例可以包含多個(gè)數據庫,因此存在兩個(gè)級別的配置。在前一節已經(jīng)提到,實(shí)例級的配置可以在 DBM CFG 文件中完成,而數據庫級的配置則可以在 DB CFG 文件中完成。這兩個(gè)級別上的配置參數都可以進(jìn)行調整,以調優(yōu)內存使用情況。后文將更詳細地闡述 DB2 的內存結構和不同的后臺進(jìn)程。 Oracle 是在實(shí)例和數據庫啟動(dòng)時(shí)將內存分配給它們的,而 DB2 則是在不同級別上分配內存。這主要是因為 DB2 實(shí)例可以包含多個(gè)數據庫。DB2 中主要有三種內存結構:
在 DB2 for Windows 中,服務(wù)器活動(dòng)是以線(xiàn)程的形式進(jìn)行的,而在 Linux 和 UNIX 環(huán)境中,這些活動(dòng)是以后臺進(jìn)程的形式來(lái)實(shí)現的。DB2 有以下幾種級別的進(jìn)程:
要獲得對 DB2 進(jìn)程的完整解釋?zhuān)垍⒖嘉恼?“DB2 通用數據庫進(jìn)程全接觸”。
Oracle 中的鎖可以是手動(dòng)的,也可以是自動(dòng)的。Oracle Lock Manager 可以在行級隱式地鎖定表數據,此外也可以使用以下 SQL 語(yǔ)句在事務(wù)或會(huì )話(huà)級覆蓋缺省的鎖: Oracle 支持一種稱(chēng)為 Multi-Version Read Consistency 的機制,這是用 undo 段中的 undo 數據實(shí)現的。 DB2 實(shí)現 ANSI 標準隔離(Isolation)級別,例如未提交讀(Uncommitted Read)、游標穩定性(Cursor stability)、讀穩定性(Read stability)和可重復讀(Repeatable Read)。除非使用未提交讀隔離級別,否則用戶(hù)只能看到已提交的數據。行鎖是根據隔離級別隱式地獲得的??涉i定的數據庫對象有表空間、表和行,但是,只有表和表空間可以顯式鎖定??墒褂? 與 Oracle 不同,在 DB2 中,鎖是存儲在內存中的,而不是存儲在數據頁(yè)中??梢允褂?LOCKLIST 數據庫配置參數來(lái)配置鎖可用的內存,而 MAXLOCKS 配置參數則定義用于一個(gè)特定應用程序的鎖的最大內存。
Oracle 和 DB2 都是具有基本的和高級的安全特性的安全數據庫。Oracle 中有 4 種不同的用戶(hù)身份驗證方法:
身份驗證方法是在使用 在 DB2 中,用戶(hù)不是存在于數據庫中,而是由操作系統來(lái)管理。沒(méi)有數據庫登錄信息存放在數據庫表中。任何操作系統用戶(hù)都有可能訪(fǎng)問(wèn) DB2;但是,除非他們被授予了給定的 DB2 權限或特權,否則他們能做的事情不多。通過(guò) Control Center GUI 很容易授予和撤銷(xiāo)權限和特權。不過(guò)首先需要將可用操作系統用戶(hù)或組中的一個(gè)用戶(hù)或組添加到 Control Center。 在 DB2 中沒(méi)有 “角色(role)” 這個(gè)術(shù)語(yǔ)。相反,DB2 使用術(shù)語(yǔ) “權限(authority)”,它類(lèi)似于 Oracle 的數據庫角色,DB2 通過(guò)權限將特權授予某些組或用戶(hù)。DB2 支持的權限有:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。 不能使用 GRANT SQL 語(yǔ)句授予 SYSADM、SYSCTRL 和 SYSMAINT 權限。這些特殊的權限只能在數據庫管理器配置文件中設置。 DB2 還使用術(shù)語(yǔ) “特權(privilege)”,它類(lèi)似于 Oracle 的系統和模式對象特權。DB2 中有數據庫特權(連接、創(chuàng )建表等)和數據庫對象特權(模式、表、視圖等)。圖 11 顯示了從 Control Center GUI 獲得的 DB2 安全性信息。Change User 窗口中顯示的大部分選項卡對應了 DB2 所支持的特權。 圖 11. DB2 安全性 ![]() Oracle 10g 的安全性大體上沒(méi)有變化,只有部分增強。下面是 Oracle 10g 中的增強的列表:
DB2 中的身份驗證不僅涉及對用戶(hù)名和密碼進(jìn)行加密,還允許對客戶(hù)機與服務(wù)器之間傳輸的數據進(jìn)行加密。身份驗證的位置由數據庫管理器配置參數 AUTHENTICATION 的值決定。 下面是用于啟用 DB2 的身份驗證的有效選項:
若要更新 AUTHENTICATION 實(shí)例參數,例如將它的值設置為 DATA_ENCRYPT,可以使用以下命令: 清單 1. 更新 AUTHENTICATION 實(shí)例參數
DB2 提供了基于標簽的訪(fǎng)問(wèn)控制(Label Based Access Control,LBAC)機制,從而進(jìn)一步擴展了安全性。 LBAC 特性為控制對各行和各列的讀寫(xiě)訪(fǎng)問(wèn)提供了更大的粒度。 DB2 中提供了一種新的安全管理員角色(SECADM),用于操縱 LBAC 對象。 試圖訪(fǎng)問(wèn)一個(gè)對象的用戶(hù)必須被授予該對象的安全標簽。如果安全標簽匹配,則允許訪(fǎng)問(wèn);如果不匹配,則拒絕訪(fǎng)問(wèn)。實(shí)現 DB2 中的 LBAC 安全性基本上有三個(gè)步驟:
除了特權和權限外,數據庫安全性還包含其他方面。簡(jiǎn)單地說(shuō),Oracle 與 DB2 之間既有不同點(diǎn),也有相同點(diǎn): 用戶(hù)身份驗證和授權 Oracle 在創(chuàng )建用戶(hù)之后,使用存儲在目錄中的加密密碼。DB2 支持用于用戶(hù)身份驗證的密碼,并使用底層的操作用戶(hù)進(jìn)行身份驗證。Oracle 和 DB2 都支持 LDAP (Oracle Internet Directory 與 IBM Directory Server)。Oracle 和 DB2 都支持單點(diǎn)登錄(SSO)。 數據加密 Oracle 支持數據加密,它可以對敏感數據,例如信用卡號和一些高度敏感的商業(yè)數據進(jìn)行加密。DB2 允許列級的數據加密。 網(wǎng)絡(luò )加密 Oracle 通過(guò)它的 Oracle Advanced Security 提供網(wǎng)絡(luò )加密。Oracle 使用 DES、3DES 和 RC4 業(yè)界標準加密。DB2 本身不進(jìn)行網(wǎng)絡(luò )加密。但可以使用附帶的 Tivoli SecureWay 實(shí)現網(wǎng)絡(luò )加密。 審計跟蹤 Oracle 允許審計跟蹤用戶(hù)和對象。還可以使用日志挖掘程序調查和分析有疑問(wèn)的查詢(xún)。DB2 也提供了類(lèi)似的審計設施。在 DB2 中,可以使用 db2audit 實(shí)用程序進(jìn)行審計跟蹤。
在本節中,我們將 Oracle 對 XML 的支持與 DB2 對 XML 的支持進(jìn)行比較。 Oracle XML DB 特性隨 Oracle 9i Release 2 一起發(fā)布,借助該特性,通過(guò)定義 XMLTYPE 表和列,將它們存儲為 CLOB 或拆分(分解)到關(guān)系表中,可以實(shí)現對 XML 存儲、檢索和模式的管理。 Oracle 10g 為管理 XML 文檔提供了一些增強。例如,通過(guò)映射已有的數據,可以動(dòng)態(tài)地反映模式的更改,而不必重新導入。Oracle 10g 包括一些工具包,例如:
Oracle 10g 仍然是一種 支持 XML 的 數據庫。它提供的所有接口、API 和包,都是為了減輕 XML 與關(guān)系表之間的相互轉換和映射所帶來(lái)的負擔、復雜性和維護。支持 XML 的數據庫,不管是使用 CLOB 還是分解方法,都不能提供良好的性能。例如,在使用 CLOB 的情況下,XML 文檔作為鏡像文件存儲在數據庫中。您可能已經(jīng)知道,鏡像文件的管理是很麻煩的。分解方法在性能方面也不如人意。將一個(gè) XML 文檔分解成小塊并存儲在多個(gè)表中之后,當需要將 XML 文檔組合成原樣時(shí),就不得不使用一個(gè) SQL JOIN 操作。SQL 中的 JOIN 是開(kāi)銷(xiāo)很大的,特別是表的數量較多時(shí)這一點(diǎn)尤其明顯。保持數字簽名的保真度同樣也是一個(gè)挑戰。 另一方面,DB2 9 pureXML 技術(shù)則是原生存儲 XML 文檔,也就是說(shuō),在內部以樹(shù)型格式存儲 XML 文檔。它還允許同時(shí)使用 SQL 和 XML 擴展,即 Xquery 和 Xpath 來(lái)訪(fǎng)問(wèn)關(guān)系數據和 XML 數據。原生存儲 XML 文檔是一種更好的方法,IBM 的研究表明,使用該方法在 XML 文檔的搜索和檢索方面可以取得更好的性能,并且能減少某些程序中代碼的行數。 要在數據庫中使用 pureXML 特性,在創(chuàng )建數據庫時(shí)要使用 UNICODE(例如使用編碼集 UTF-8)。在創(chuàng )建一個(gè)表之前,如果沒(méi)能創(chuàng )建一個(gè) UNICODE 數據庫,則會(huì )產(chǎn)生如下所示的錯誤:
DB2 與之前版本一樣存儲關(guān)系數據。但是,XML 數據是以分層格式存儲的(作為使用 Xquery 數據模型的一棵樹(shù))。XML 與關(guān)系服務(wù)之間是緊密集成的。為了存儲 XML 文檔,用戶(hù)需要創(chuàng )建一個(gè)表,并指定一個(gè)列使用一種新的數據類(lèi)型,即 XML,如下面的例子所示。 清單 2. 用 XML 數據類(lèi)型創(chuàng )建表
下圖展示了這兩列的顯示效果: 圖 12. DB2 存儲模型 ![]() 由于 XML 文檔是以解析的分層格式存儲在 XQuery Data Model (XDM) 中的,因此不需要進(jìn)行轉換或映射。用于存儲 XML 文檔的格式就是用于處理 XML 文檔的格式。這樣可以提供更好的性能。 備份、恢復、導入等實(shí)用程序對含 XML 列的表的作用與其他表是一樣的??梢允褂?INSERT 語(yǔ)句或 IMPORT 實(shí)用程序(注意:DB2 LOAD 實(shí)用程序還不支持 XML)將 XML 數據插入 XML 列。在導入來(lái)自第三方的 XML 文檔之前,最好根據一個(gè)預定義的 XML 模式驗證這些文檔。為了注冊一個(gè) XML 模式,DBA 需要執行 REGISTER XML SCHEMA 命令,并以 COMPLETE XML SCHEMA 結束,以完成注冊過(guò)程。 DB2 9 還支持在一個(gè) XML 文檔的子集或整個(gè)文檔上創(chuàng )建索引。在創(chuàng )建索引時(shí),需要指定 XPATH,它將指向被建索引的特定元素/屬性。 在 DB2 9 中,有四種方法來(lái)訪(fǎng)問(wèn)關(guān)系數據和 XML 數據,如 圖 13 所示:
圖 13. 可能的 PureXML 查詢(xún) ![]() 表 3 比較了 DB2 9 與 Oracle 10g 的 XML 功能。
要看到更深入的討論,可以在 developerWorks 上找到更多關(guān)于 IBM pureXML 功能的文章,例如 使用 XQuery 查詢(xún) DB2 XML 數據 和 使用 SQL 查詢(xún) DB2 XML 數據。
DB2 的表分區(即區域分區)類(lèi)似于 Oracle 的分區。它基本上允許將一個(gè)邏輯表拆分成跨一個(gè)或多個(gè)表空間的多個(gè)物理存儲對象。每個(gè)對象對應于一個(gè) “分區”,允許每個(gè)表空間包含一定范圍的、很容易訪(fǎng)問(wèn)的數據。 在 DB2 中,有多種方法對數據進(jìn)行分區,您可以同時(shí)將這些方法應用于相同的數據。為了避免讀者感到困惑,下面簡(jiǎn)單地解釋一下提供這種分區的各種不同方法:
利用 DB2 9 中新引入的表分區特性,可以根據一個(gè)或多個(gè)表列中的特定值將表數據劃分到不同的表空間。 這些分區可以獨立地進(jìn)行備份和恢復,可以提高某些查詢(xún)的性能,因為 DB2 優(yōu)化器知道這些分區的存在,并且可以避免對查詢(xún)中不需要的分區進(jìn)行掃描。例如,如果按一年的四個(gè)季度對表進(jìn)行分區,并且查詢(xún)只需要第 4 季度的數據,那么 DB2 將不解析前三個(gè)季度,而是直接找到第 4 個(gè)季度并解析之。這被稱(chēng)作分區排除(partition elimination)。 如前所述,在 DB2 9 中,數據組織的三種方法,即數據庫分區(Database Partitioning)、表分區(Table Partitioning)和多維集群(Multi Dimensional Clustering)可同時(shí)使用。 下面的例子創(chuàng )建一個(gè) customer 表,其中 l_shipdate >= ‘01/01/2006‘ 且 l_shipdate <= ‘03/31/2006‘ 的行存儲在表空間 ts1 中,l_shipdate >= ‘04/01/2006‘ 且 l_shipdate <= ‘06/30/2006‘ 的行存儲在表空間 ts2 中,依此類(lèi)推。更詳盡的解釋可以參閱 developerWorks 文章 Table partitioning in DB2 9。
Oracle 提供了兩種壓縮特性:一種是索引級壓縮,另一種是表級壓縮。如果對這些特性沒(méi)有適當的規劃,就會(huì )對性能產(chǎn)生不良影響。 Oracle 從版本 8i 開(kāi)始就引入了索引壓縮??梢詨嚎s的索引有 bitmap、btree 和索引組織的表。索引壓縮使用起來(lái)很簡(jiǎn)單。例如,要用壓縮特性創(chuàng )建一個(gè)索引,可以使用如下代碼:
對于不是在內部用壓縮特性創(chuàng )建的索引,可以通過(guò)修改它們將它們轉換成壓縮索引。下面顯示了一個(gè)示例,這個(gè)示例展示了如何修改索引,以使其變成壓縮索引。 清單 5. 用壓縮特性修改索引
目前,Oracle 沒(méi)有提供任何自動(dòng)化的建議者程序來(lái)指出哪些索引應該被壓縮。大多數通過(guò)索引壓縮獲得的好處,都需要擁有嫻熟的 Oracle CBO 知識的資深 DBA 經(jīng)過(guò)適當規劃才能獲得。 另一方面,表壓縮是在 Oracle 9i release 2 中引入的。它可以用于壓縮整個(gè)表、表分區和具體視圖。壓縮可應用于所有分區或部分分區。雖然表壓縮也可以用于未分區的表,但是在 OLTP 工作負載中將表壓縮應用于未分區的表并不可取,因為插入和更新性能會(huì )受到影響。在 Oracle 表壓縮中,數據庫塊中重復的值將被去除,信息將被存儲起來(lái),以便在塊中重新創(chuàng )建未壓縮的數據。 下面的例子展示了如何用壓縮特性創(chuàng )建分區表。
為了將一個(gè)表轉換成壓縮表,可以使用 alter table <table name> move compress。但是,壓縮表不允許添加或刪除列。 至于 DB2,在 DB2 9 之前就有一些壓縮方法,但是,行壓縮是在 DB2 9 中才引入的。行壓縮要求創(chuàng )建一個(gè)目錄,用于存儲重復模式或條目以及數字鍵。壓縮算法足夠智能,不會(huì )壓縮那些對節省磁盤(pán)空間幫助不大的行。 DB2 的行壓縮不像 Oracle 的鍵壓縮,它不需要指定鍵。 可以通過(guò) CREATE TABLE 或 ALTER TABLE 命令在表級進(jìn)行壓縮。例如:
為了在 DB2 Control Center 中取得相同的效果,在列定義過(guò)程中(表創(chuàng )建向導中的第二步),應確保選中面板底端的復選框 Store table data in a compressed format(如下圖所示)。 圖 14. DB2 Control Center —— 以壓縮格式創(chuàng )建表 ![]() 只有在執行 REORG 的時(shí)候才構建表字典,之后便可以壓縮表中的數據。在隨后的每次 REORG 操作中,表字典隨之更新。被壓縮的數據同時(shí)存放在磁盤(pán)上和內存中,DB2 還壓縮存儲在日志文件中的用戶(hù)數據,以便減少日志文件大小。 注意,分區表的每個(gè)分區可以有不同的壓縮字典,在 DPF 中的一個(gè)表的每個(gè)分區也可以有不同的壓縮字典。 除了數據行壓縮,DB2 9 提供的其他壓縮機制還包括:
從 Oracle 9i 到 10g,Oracle 在調優(yōu)方面作了一些改進(jìn)。Oracle 將以下方面的調優(yōu)進(jìn)行了自動(dòng)化:
Oracle 還提供了一些 advisor,例如 segment advisor 和 undo advisor。segment advisor 根據對象內的空間拆分程度給出是否可以對一個(gè)對象執行新的在線(xiàn)壓縮操作的建議。而且,這個(gè) advisor 還給出關(guān)于段的歷史增長(cháng)趨勢的報告,特別是能為容量規劃提供有效的信息。 另一方面,Undo Advisor 則幫助管理員在調整 flashback 和非 flashback 中的表空間的大小時(shí)作出正確的判斷。它為管理員適當地設置 UNDO_RETENTION 提供建議,以避免快照過(guò)于陳舊的問(wèn)題。 DB2 9 引入了一些新的自治增強。例如,DB2 9 引入一種新的自調優(yōu)內存特性(使用 self_tuning_mem 數據庫配置參數),該特性自動(dòng)地設置一些內存配置參數的值,從而簡(jiǎn)化了內存配置任務(wù)。自動(dòng)調優(yōu)器充當調度器的角色,它算出可用的內存資源,動(dòng)態(tài)地將它們分發(fā)給數據庫的一些內存消費者。 除了自調優(yōu)內存,DB2 9 還引入了下面提到的其他一些增強。這份列表并不完整,但是其中列出的都是重要的增強。 DB2 8 引入了 Configuration Advisor,它可以檢測系統和數據庫的特征 —— CPU、內存、數據庫大小、表的數量等,并為配置參數給出建議的值。DB2 9 則更進(jìn)一步 —— 它在數據庫創(chuàng )建之后自動(dòng)運行 configuration advisor,并缺省地做出一些基本的調優(yōu)決定。例如,它配置缺省緩沖池的大小、I/O 清理程序和 I/O 服務(wù)器等。 這種初始的自動(dòng)調優(yōu)意味著(zhù),同使用之前缺省的數據庫配置參數值創(chuàng )建的數據庫相比,現在的數據庫將擁有更好的性能,并且有更好的即開(kāi)即用性。 缺省情況下,DB2 9 還允許對某些進(jìn)行中的任務(wù)進(jìn)行自動(dòng)化。通過(guò)該特性,DB2 確定需要哪些統計信息,以及哪些統計信息需要更新,然后自動(dòng)在后臺執行 RUNSTATS 實(shí)用程序。 DB2 9 擴展了在 DB2 V8.2.2 中首次引入的自動(dòng)存儲特性。自動(dòng)存儲自動(dòng)增長(cháng)跨磁盤(pán)和文件系統的數據庫的大小,由于它是自動(dòng)增長(cháng)數據庫大小的,因此 DBA 不需要管理存儲容器。當在 DB2 9 中創(chuàng )建數據庫時(shí),自動(dòng)存儲管理特性是缺省地啟用的。 自動(dòng)重組是從 8.2 版開(kāi)始引入的。但是,DB9 對其加以增強,從而允許做以下事情:
我們來(lái)看看不同領(lǐng)域的一些工具,例如數據庫創(chuàng )建和維護、網(wǎng)絡(luò )、管理 GUI、性能調優(yōu)、數據移動(dòng)和備份恢復工具。圖 15 顯示了這些 DB2 9 GUI 工具。 圖 15. DB2 9 GUI 工具 ![]() 讓我們看看類(lèi)似的任務(wù)在 Oracle 和 DB2 9 中分別是怎樣執行的。 數據庫創(chuàng )建和維護 Oracle 提供了 Database Configuration Assistant(dbca)作為創(chuàng )建數據庫的 GUI 工具。對于數據庫維護,Oracle 提供了 Oracle Enterprise Manager。DB2 數據庫則可以通過(guò) DB2 Control Center 創(chuàng )建和維護。 網(wǎng)絡(luò ) Oracle 提供了 Network Configuration Assistant(netca)來(lái)進(jìn)行網(wǎng)絡(luò )配置?;蛘?,也可以使用 Oracle Network Manager 來(lái)配置服務(wù)名、偵聽(tīng)器、配置文件和 Oracle 名稱(chēng)服務(wù)器。DB2 則使用 CATALOG 命令來(lái)編目節點(diǎn)和數據庫。此外還可以使用 DB2 命令行或 DB2 Configuration Assistant GUI 進(jìn)行編目。 管理 Oracle Enterprise Manager 提供了針對管理員日常任務(wù)的廣泛管理功能。DB2 Control Center 也提供了和 Oracle Enterprise Manager 類(lèi)似的功能。除了 DB2 Control Center 外,還可以使用 DB2 命令行處理器來(lái)發(fā)出 DDL 和 DML 語(yǔ)句。該實(shí)用程序類(lèi)似于 Oracle 的 SQLPLUS 實(shí)用程序。圖 16 顯示了 DB2 命令行處理器。 圖 16. DB2 命令行處理器 ![]() 還可以在 Command Center 中發(fā)出命令,如 圖 17 所示。 圖 17. Command Center GUI(DB2 命令行處理器的 GUI 版本) ![]() 性能調優(yōu) Oracle Enterprise Manager 附帶有 Change Management Pack、Tuning Pack 和 Diagnostic Pack。DB2 則提供了 Event Analyzer、Health Center、Indoubt Transaction Manager 和 Memory Visualizer 作為性能調優(yōu)任務(wù)的 GUI 工具。 數據移動(dòng) Oracle 提供了 SQL Loader(sqlldr)用于以定界文本格式裝載數據。Import(imp)和 export(exp)可用于執行邏輯導入和導出。DB2 提供了類(lèi)似的導入、導出和裝載實(shí)用程序。對于跨平臺的數據移動(dòng),DB2 提供了 db2move 實(shí)用程序。 備份和恢復 Oracle 提供了 Recovery Manager 作為熱備份的選項。在 DB2 中,可以使用 backup 命令或 DB2 Control Center 備份數據庫。 Oracle 10g Enteprise Manager 附帶了新的性能概要表。增強的 Oracle Enterprise Manager HTML 界面為所有與數據庫性能相關(guān)的統計信息提供了一個(gè)集中的訪(fǎng)問(wèn)點(diǎn),為全面的監控和診斷提供了方便。 除了隨 DB2 UDB version 8 發(fā)布的界面外,DB2 9 還引入了一種全新的免費應用程序開(kāi)發(fā)工具,這個(gè)工具叫做 DB2 Developer Workbench(DWB),它是基于 Eclipse 框架的。這個(gè)工具可以單獨下載,也可通過(guò)光盤(pán)獲得,它替代了 DB2 8 的 Development Center。 DWB 是用于創(chuàng )建、編輯、調試、部署和測試 DB2 存儲過(guò)程和用戶(hù)定義函數的一站式中心。此外,還可以使用 DWB 來(lái)開(kāi)發(fā) SQLJ 應用程序,以及創(chuàng )建、編輯和運行 SQL 語(yǔ)句和 XML 查詢(xún)。 DWB 有一些用于開(kāi)發(fā) DB2 業(yè)務(wù)對象的視圖,例如:
除了 DB2 8 的 Development Center 的功能外,新的 Developer Workbench 還包括對遷移報告、比較例程、XML 函數和使用 XQuery Builder 構建 XQuery 查詢(xún)等等的支持?,F在可以從網(wǎng)站下載DB2 Developer Workbench 。 要了解關(guān)于 DB2 Developer Workbench 的更詳細的信息,請閱讀 developerWorks 中的這篇 教程。要得到更詳盡的示例和特性,請參考 developerWorks 中的文章 DB2 9 入門(mén): 應用程序開(kāi)發(fā)方面的增強。 圖 18 展示了如何使用 DWB 創(chuàng )建存儲過(guò)程: 圖 18. DB2 Developer WorkBench ![]()
在本文中,我們借助您當前已有的關(guān)于 Oracle 10g Release 2 的知識,對 DB2 9 for Linux, UNIX and Windows 進(jìn)行了介紹。我們簡(jiǎn)要地描述了 DB2 9 架構、后臺進(jìn)程、內存模型、安全性、工具等方面。Oracle 與 DB2 9 之間有很多類(lèi)似之處,我們也指出了它們之間的一些不同之處,以便您能借助已有的知識,在 DB2 9 中獲得成功。 表 3 總結了我們討論過(guò)的 Oracle 與 DB2 9 之間的相同點(diǎn)與不同點(diǎn)。 表 3 —— Oracle 與 DB2 9 概念總結
學(xué)習
|
聯(lián)系客服