oracle与db2的差别
系统结构概述 首先,我们需要理解 Oracle 使用的架构,并理解它与 DB2 的不同之处。 图 1 展示了 Oracle 的系统结构。将该图与 图 2 进行比较,后者显示了 DB2 的系统结构。在阅读本文的时候,为便于理解,可以参照这两个图。 图 1. Oracle on Linux, UNIX,
系统结构概述
首先,我们需要理解 Oracle 使用的架构,并理解它与 DB2 的不同之处。图 1 展示了 Oracle 的系统结构。将该图与 图 2 进行比较,后者显示了 DB2 的系统结构。在阅读本文的时候,为便于理解,可以参照这两个图。
图 1. Oracle on Linux, UNIX, and Windows Version 10.2 的系统结构
图 2. DB2 on Linux, UNIX, and Windows 系统结构
|
|
实例
在 Oracle 和 DB2 中,实例 的概念是类似的。在这两者之中,实例都是指后台进程与共享内存的组合。两者之间的主要差别在于,在 Oracle 中每个实例只能有一个数据库,而在 DB2 中多个数据库可以共享一个实例。
在 Oracle 中,由于数据库与实例是一对一的关系,因此用 CREATE DATABASE 命令创建一个数据库的同时便隐式地创建了一个实例。或者,为了在计算机上创建一个 Oracle 实例,也可以使用 Database Configuration Assistant,或者使用 ORADIM 实用程序,后者是 Oracle 9i 通过 NEW 选项提供的。另外还必须提供某些信息,包括系统标识符(System Identifier,SID)或一个服务名称、实例密码、最大用户数、启动模式等等。类似地,为了删除实例,可以使用 ORADIM 实用程序加 DELETE 选项。这里需要提供 SID 或服务名称。除非在安装过程中创建一个新的数据库,否则在以 fresh 方式安装 Oracle 的时候,不会创建缺省的实例。
在 DB2 中,当在 Windows 平台上安装了该产品之后,便缺省地创建了一个实例 “DB2″。在 Linux 和 UNIX 中,缺省的实例名称为 “db2inst1″。若要在同一台计算机上创建另一个实例,只需执行命令 de>db2icrt
图 3 展示了缺省的 DB2 实例 “DB2”(在 Windows 中)和从 DB2 Control Center GUI 中用 db2icrt 命令创建的另外两个实例。
图 3. 显示 DB2 实例的 DB2 Control Center GUI
若要在命令行接口中引用给定的 DB2 实例,可以使用环境变量 DB2INSTANCE。通过这个变量,可以指定当前活动实例,所有命令将应用到此实例。例如,如果 DB2INSTANCE 被设置为 PROD,然后您执行了命令 de>create database MYDB1de>,将创建一个与实例 PROD 关联的数据库。如果要在实例 DB2 上创建该数据库,那么必须首先将 DB2INSTANCE 变量的值改为 DB2。这类似于 ORACLE_SID (System Identifier),当用户想要在不同实例之间进行切换时,也是使用 ORACLE_SID。
还有一种标识要使用的实例的简单方法,那就是使用 DB2 Control Center GUI,如 图 3 所示。要在该工具中看到对应于新实例的条目,需要通过右击 Instances 并选择 Add 来将该实例添加到此工具中。要删除 DB2 中的一个实例,可以执行命令 de>db2idrop
总之,在 Oracle 中,可以使用 Database Configuration Assistant 来创建、修改、启动、停止和删除实例,而在 DB2 中则可以使用 Control Center GUI 做同样的事情。而且,Oracle 实例与数据库只能是一对一的关系,而在 DB2 中却不是这样。一个 DB2 实例中可以同时存在多个数据库,并且可以并发地使用这些数据库。
|
|
数据库
在 Oracle 中,可以用 CREATE DATABASE 命令手动创建数据库,也可以用 Database Configuration Assistant 创建数据库。手动创建数据库时,在执行 CREATE DATABASE 命令之前,需要执行一系列的步骤,包括设置 OS 变量,准备参数文件,以及创建密码文件。
元数据信息在 Data Dictionary 中存储和管理,由基本表和相应的视图组成。基本表是在数据库创建过程中自动创建的,而视图则是通过运行 catalog.sql 和 catproc.sql 脚本构造的。
因此,Oracle 数据库可看作包含 3 种类型的文件的一个集合:
- 数据文件(Data File):包含实际的数据,数据库的物理实现。(类似于 DB2 中的容器。)
- 重做文件(Redo File):相当于 DB2 中的事务日志(Transaction Log)。
- 控制文件(Control File):包含用于维护和验证数据库完整性的信息。
在 DB2 中,一个实例可以包含多个数据库,如 图 2 所示。每个数据库都是一个封闭的、真正独立的单元。每个数据库有其自己的编目表空间、临时表空间和用户表空间,这些表空间是在创建数据库时缺省创建的。DB2 包含一个称为系统数据库目录(system database directory) 的二进制文件,其中包含可从 DB2 机器上连接的所有数据库的条目。这个目录保存在实例级。
当创建一个实例时,缺省情况下不会创建数据库,您需要使用 create database 命令显式地创建一个数据库。此外还可以用 Control Center 创建数据库,如 图 4 和 图 5 所示。
图 4. 使用 Control Center GUI 创建 DB2 数据库
图 5. 使用 Control Center GUI 创建 DB2 数据库(续)
在 图 5 中,您也可以看看单击 Show Command 时会出现什么情况。所有的 DB2 Control Center GUI 屏幕都会显示实际上在后台执行的 SQL 语句或命令。这些命令可以保存在一个脚本中,以便在以后执行,或者也可以将它们复制到 Command Line Processor(CLP)或 Command Center GUI 工具中,在这些工具中执行。这些工具分别相当于 Oracle 的 SQL*Plus 和 iSQL *Plus。
可以使用 ‘DROP DATABASE’ 命令或者在 DB2 Control Center GUI 中删除一个 DB2 数据库。而在 Oracle 中却不是使用这样的命令。数据库的删除是通过删除所有相关数据文件来完成的。
同一个实例中的数据库通常不会相互进行交互。然而,如果应用程序需要与多个数据库交互,那么通过启用联邦(federation) 支持可以满足这一需求。在 参考资料 小节中有一篇关于联邦的文章。
|
|
容器、表空间、缓冲池和页
在 Oracle 中,在物理上数据是存储在被称作数据文件(Data File)的文件中的。这类似于 DB2 的容器(container),DB2 的容器也是数据实际存储的地方。每个 Oracle 数据库包含一个名为 SYSTEM 的表空间,这是在创建数据库时由 Oracle 自动创建的。其他用于用户数据、临时数据和索引数据的表空间则需要在创建数据库之后另行创建,并且在使用这些表空间之前,还需要为之指定一个用户。
在 DB2 中,表空间 是逻辑对象,作为逻辑表和物理容器之间的一层。当创建一个表空间时,可以将它与一个特定的缓冲池(数据库缓存)关联起来,并关联到特定的容器。这为性能管理带来了灵活性。例如,如果有一个 “hot” 表,那么可以在一个单独的表空间中定义它,而这个表空间又与一个独立的缓冲池相关联。这有助于确保此表中的数据连续地缓存在内存中。
在 DB2 中,使用 CREATE DATABASE 命令及其缺省值创建数据库时,同时也会自动创建三个缺省的表空间。表 1 描述了缺省的 DB2 表空间:
表 1. 用缺省值创建数据库时,缺省创建的 DB2 表空间
表空间名称 | 描述 |
SYSCATSPACE | 包含元数据的编目表空间 |
TEMPSPACE1 | 用于执行连接和排序等操作的系统临时表空间。这个表空间的名称可以更改 |
USERSPACE1 | 这个表空间是可选的,如果在创建表的时候没有显式地指定表空间,那么可以用这个表空间来存储用户表 |
在 DB2 中,由于数据库是独立的单元,因此表空间不能跨数据库共享。由于表空间只在一个数据库中是可知的,因此两个不同的数据库可以有具有相同名称的表空间。在 图 2 中可以看到这一点,其中数据库 MYDB1 有一个名为 MYTBLS 的表空间,而数据库 MYDB2 也有一个同名的表空间。
DB2 表空间可以分为 SMS(系统管理的表空间)与 DMS(数据库管理的表空间)两类。SMS 表空间由操作系统管理,它们只能是目录。SMS 表空间可根据需要自动增长,因此 SMS 可以提供很好的性能,并且需要的管理也很少。DMS 表空间由 DB2 管理,既可以是文件,也可以是原始设备。这种类型的表空间可以提供最佳性能,但是需要进行一些管理。例如,需要预先指定想要为这个表空间分配多大的空间,因为这种表空间不能自动增长。
Oracle 的存储模型中没有 SMS 的概念,但是它的数据文件类似于 DB2 DMS 表空间。也就是说,可以通过增加数据文件的大小,或为表空间添加数据文件,或者通过添加一个新的表空间,来增加数据库的大小。
表 2 显示了 Oracle 数据库或表空间与 DB2 数据库或表空间的对应关系。
表 2. Oracle 数据库与 DB2 数据库和表空间的对应关系
Oracle 数据库或表空间 | DB2 数据库或表空间 |
SYSTEM 是存放编目(数据字典)信息的表空间 | SYSCATSPACE(编目表空间);和在 Oracle 中一样,仅在数据库级保存该信息 |
Data Dictionary(包含表和视图形式的元数据),驻留在 SYSTEM 表空间中 | 系统编目表(由 SYSIBM 模式标识),系统视图(由 SYSCAT 或 SYSSTAT 模式标识),驻留在 SYSCATSPACE 表空间中 |
SCOTT 数据库 | SAMPLE 数据库 |
TEMP 表空间 | System Temporary 表空间(缺省情况下名为 tempspace1) |
UNDO 表空间 | N/A |
USER 表空间 | 用户表空间。缺省情况下,USERSPACE1 一般是在数据库创建之后才创建的 |
前面已指出,Oracle 的数据缓冲区概念相当于 DB2 的缓冲池。但是,DB2 允许多个缓冲池存在。在 DB2 中不需要预先定义可创建的缓冲池的数量,缓冲池的名称可以是任意的。
Oracle 中块(block) 的概念与 DB2 中的页最为相似。一个 DB2 页的大小可以为 4k、8k、16k 或 32k。表中的一个行只能放在一个页中,而不能像 Oracle 中那样跨多个页。
|
对象名称
Oracle 中的对象名称形式如下:
de>[Schema_name.]object_name[@database]de>
在 DB2 中,对象名称也是由两部分组成的结构:
de>Schema_name.object_namede>
和在 Oracle 中一样,DB2 模式名称用于在逻辑上组织对象。但是两者之间一个重要差异是,在 DB2 中,模式名称不一定与一个用户 id 相匹配。任何拥有 IMPLICIT_SCHEMA 权限的用户都可以用一个不存在的模式创建对象。例如,假设 “Peter” 具有 IMPLICIT_SCHEMA 权限,他执行以下命令:
de>CREATE TABLE WORLD.TABLEA (lastname char(10))de>
该命令创建表 WORLD.TABLEA,其中 WORLD 是新创建的模式。如果 Peter 没有显式地指定模式,那么该命令就会创建表 PETER.TABLEA,因为缺省情况下是使用连接 ID。
在 DB2 中,在发出与数据库相关的命令之前,总是要连接到数据库。因此,在这种架构下,对象名称不需要包括数据库名称。
|
|
表、视图和索引
在 Oracle 和 DB2 中,表、视图和索引基本上是一样的。
DB2 提供了一个名为 Design Advisor 的实用程序,可以用它来为特定的查询或工作负载推荐索引。Design Advisor 可以从 DB2 Control Center 中调用,也可以从 DB2 CLP 中使用 db2advis 命令来调用。在 DB2 中,索引是直接与表定义绑定的。例如,当使用 DMS 表空间时,可以用下面的语句指定索引存放在哪个表空间:
de>CREATE TABLE mytable (col1 integer, col2 char(10)) in tbls1 index in tbls2de>
上面的例子表明,表中的数据将存储在表空间 ‘tbls1′ 中,而索引页将存储在表空间 ‘tbls2′ 中。但在 Oracle 语法中,CREATE INDEX 语句有一个选项来指定索引存放在哪个表空间。
此外,在 DB2 中,索引一旦创建好,便不能修改索引定义中的任何子句。为了进行更改,需要删除索引,然后重新创建索引。
和在 Oracle 中一样,不同数据库中的 DB2 表、视图和索引可以有相同的名称。相同数据库中的表和视图则必须使用不同的名称,但是允许使用与已有的表或视图相同的名称创建索引。
|
|
存储过程、触发器和用户定义函数(UDF)
在 Oracle 环境中,有很多方法来创建和访问存储过程、触发器和函数。PL/SQL 是 SQL 的面向对象(OO)过程扩展,支持数据操纵(DML)、流控制、变量和常量的声明、过程和函数定义以及 OO 数据类型,例如嵌套表和变长数组(varray)。Oracle 还将 JVM 并入到它的引擎中。在 Oracle 数据库中,可以使用 SQLJ 将存储过程、函数和触发器,作为类来创建、存储和执行。Oracle 还支持 Type 1 至 4 的 JDBC 驱动程序。
DB2 存储过程可以用 DB2 预编译器支持的任何语言编写,包括 Java、C、C++、REXX、Fortran 和 COBOL。但是,我们推荐您使用 SQL Procedural Language(SQL PL),这种语言非常类似于 Oracle 的 PL/SQL。在开发 SQL PL 存储过程时,需要一个 C 编译器,因为这种存储过程首先要转换成 C。存储过程的 C 实现可以提供性能优势,因为代码只需编译一次(在 unfenced 模式下性能优点尤其明显)。但是,在开发这种存储过程时,开发系统上需要一个额外的 C 编译器。在 DB2 将来的版本中,有望出现不需 C 编译器支持的 SQL PL 存储过程。DB2 存储过程开发还利用 Type 1 至 4 的 JDBC 驱动程序来支持 SQLJ 和 Java。
触发器和函数的开发可以使用内联 SQL/PL,这种方法不需要 C 编译器。这种方法支持 SQL PL 语句的一个子集。另外还可以使用 DB2 Development Center Tool 来简化 DB2 存储过程和用户定义函数的创建、构建、调试和部署。
|
|
配置文件
传统上,Oracle 将所有与会话和系统相关的参数存储在一个文本文件中,这种文件通常被称做 initSID.ora。但是,由于这种文本文件不具有持久性,从 Oracle 9i 开始,Oracle 引入了 Server Parameter File(SPFILE),这是一种存储在服务器上的二进制参数文件。它在实例停止之后到启动之前这个过程中是持久存在的。不过,当 SPFILE 不可用的时候,仍然使用 initSID.ora 文件。引入 SPFILE 之前,任何对参数有影响的 ALTER SYSTEM 和 ALTER SESSION 命令都只能在实例或会话活动期间持久。每当数据库实例需要回弹(rebound)时,DBA 都必须手动修改 initSID.ora 文本文件。对于侦听器,网络访问配置通常存储在 listener.ora 中;对于客户机访问,网络访问配置通常存储在 tnsnames.ora 中。
在 DB2 中,配置参数也是存储在实例级和数据库级,在实例级是数据库管理器(database manager) 配置文件,在数据库级是数据库配置文件。这些参数大多数都可以动态地更改,也就是说,不需要为了使对参数值的更改生效而停止并重启实例或者重连所有连接。
如果想在 CLP 中手动更改特定的数据库管理器配置参数,可以使用命令 de>UPDATE DBM CFG USING
如果想在 CLP 中手动更改特定的数据库参数,可以使用命令 de>UPDATE DB CFG FOR
这两个命令分别相当于 Oracle 的 ALTER SYSTEM 和 ALTER SESSION。或者,也可以使用 Control Center 查看和修改这些参数的值。如果右键单击一个给定的实例,并选择 Configure Parameters,那么可以看到 图 6 中显示的窗口。
图 6. DB2 Database Manager 配置参数(实例级)
在数据库级,右击一个给定的数据库,并选择 Configure Parameters,则可以看到 图 7 中显示的窗口。
图 7. 数据库配置参数(数据库级)
DB2 提供了很多用于配置系统的参数。但是,如果想通过一种容易的方法自动配置系统,那么可以使用 de>autoconfigurede> 命令(或者 Configuration Advisor GUI),它会根据您提供的一些信息将数据库管理器配置参数和数据库配置参数设置成最佳值。图 8 显示了 Configuration Advisor。
图 8. DB2 Configuration Advisor
除了配置文件外,DB2 通常还为与平台相关的配置使用 DB2 注册表变量。注意,DB2 注册表变量与 Windows 注册表没有任何关系。可以使用命令 db2set 查看和更改这些变量。
连接(网络访问)信息存储在 System 数据库目录、本地数据库目录和节点目录中。这些都是二进制文件,只能用 CATALOG 和 UNCATALOG 命令修改。
|
|
内存架构和后台进程
接下来,我们来看看内存架构和后台进程,并且比较一下 Oracle 和 DB2 中内存架构和后台进程的不同之处。
图 9. Oracle 内存架构和后台进程
Oracle 中的 System Global Area(SGA)是一组共享内存块,用于存储与实例有关的信息。其中包括语句缓存、重做日志缓冲区和数据缓冲区缓存。Program Global Area(PGA)和 User Global Area(UGA)共享内存块,包含用于服务器进程和用户会话的数据和控制信息。
Oracle 支持在同一台计算机上存在多个实例,但不允许共享后台进程。例如,同一台计算机上的三个实例就需要三组后台进程。因此建议在一台计算机上包含一个数据库、一个实例和多个模式。
图 10. DB2 内存架构和后台进程
DB2 和 Oracle 都使用共享内存块,但是 DB2 与 Oracle 内存架构的实现方式略有不同。由于 DB2 实例可以包含多个数据库,因此存在两个级别的配置。在前一节已经提到,实例级的配置可以在 DBM CFG 文件中完成,而数据库级的配置则可以在 DB CFG 文件中完成。这两个级别上的配置参数都可以进行调整,以调优内存使用情况。后文将更详细地阐述 DB2 的内存结构和不同的后台进程。
Oracle 是在实例和数据库启动时将内存分配给它们的,而 DB2 则是在不同级别上分配内存。这主要是因为 DB2 实例可以包含多个数据库。DB2 中主要有三种内存结构:
- 实例共享内存:这是数据库管理器全局共享内存,是在使用 de>db2startde> 命令启动实例时分配给实例的,并且在发出 de>db2stopde> 命令停止实例之前,一直处于已分配状态。
- 数据库共享内存:这是数据库全局内存,是在激活数据库或者第一次连接到数据库时分配的。分配的内存包括缓冲池、锁列表、数据库堆、实用程序堆、包缓存和编目缓存。
- 应用程序共享内存:这是在应用程序连接到一个数据库时分配的内存,由处理连接到数据库的客户机所请求的工作的代理使用。每个连接到数据库的应用程序都会被分配内存;因此,对会影响应用程序共享内存的参数的正确配置就非常重要。
在 DB2 for Windows 中,服务器活动是以线程的形式进行的,而在 Linux 和 UNIX 环境中,这些活动是以后台进程的形式来实现的。DB2 有以下几种级别的进程:
- 实例级:这些进程是在实例启动时初始化的:
- DB2 Daemon Spawner(db2gds):全局守护处理程序,每个实例都对应一个这样的进程(仅在 UNIX 中)
- DB2 System Controller(db2sysc):DB2 主进程。
- DB2 Watchdog(db2wdog):所有其他进程的父进程。
- DB2 Format Log(db2fmtlg):类似于 Oracle 中的 ARCn 进程,为日志路径中的日志文件预先分配空间。
- 数据库级:这些进程是在建立到数据库的连接时初始化的:
- DB2 Log Reader(db2loggr):类似于 Oracle 的 PMON 进程的一个子集。该进程在回滚、重启恢复和前滚期间读取日志文件。
- DB2 Log Writer(db2logw):将日志从日志缓冲区刷新到磁盘上的事务日志文件中。相当于 Oracle 中的 LGWR 进程。
- DB2 Page Cleaner(db2pclnr):相当于 Oracle 中的 DBWR 进程,该进程在将页从磁盘上转移到 BP 中之前,清理缓冲池。
- DB2 Prefetcher(db2pfchr):将需要用到的页预先从磁盘取出到缓冲池中。
- DB2 Deadlock Detector(db2dlock):死锁检测器进程。
- 应用程序级:每个连接到数据库的应用程序,都具有属于它自己的应用程序级后台进程与之相关联。这些进程有:
- DB2 Communication Manager(db2ipccm):进程间通信进程,用于每个本地连接的客户机。
- DB2 TCP Manager(db2tcpcm):TCP 通信管理器进程,用于使用 TCP/IP 连接数据库的远程客户机。
- DB2 Coordinating Agent(db2agent):代表应用程序处理所有请求的进程。
- DB2 Subagent(db2agnta):空闲子代理。
- Active Subagent(db2agntp):在启用了 SMP 并行的情况下使用的活动子代理,它使一个任务可以使用多个进程。
要获得对 DB2 进程的完整解释,请参考文章 “DB2 通用数据库进程全接触”。
|
|
锁机制
Oracle 中的锁可以是手动的,也可以是自动的。Oracle Lock Manager 可以在行级隐式地锁定表数据,此外也可以使用以下 SQL 语句在事务或会话级覆盖缺省的锁:
de>1. SET TRANSACTION ISOLATION LEVELde>
de>2. LOCK TABLEde>
de>3. SELECT FOR UPDATEde>
Oracle 支持一种称为 Multi-Version Read Consistency 的机制,这是用 undo 段中的 undo 数据实现的。
DB2 实现 ANSI 标准隔离(Isolation)级别,例如未提交读(Uncommitted Read)、游标稳定性(Cursor stability)、读稳定性(Read stability)和可重复读(Repeatable Read)。除非使用未提交读隔离级别,否则用户只能看到已提交的数据。行锁是根据隔离级别隐式地获得的。可锁定的数据库对象有表空间、表和行,但是,只有表和表空间可以显式锁定。可使用 de>LOCK TABLEde> 命令来锁定一个表,而不是使用缺省的行锁定。
与 Oracle 不同,在 DB2 中,锁是存储在内存中的,而不是存储在数据页中。可以使用 LOCKLIST 数据库配置参数来配置锁可用的内存,而 MAXLOCKS 配置参数则定义用于一个特定应用程序的锁的最大内存。
|
|
安全性
Oracle 和 DB2 都是具有基本的和高级的安全特性的安全数据库。Oracle 中有 4 种不同的用户身份验证方法:
- 数据库:数据库执行对用户的识别和身份验证。
- 外部:操作系统或网络服务执行身份验证。
- 全局身份验证和授权:由 SSL 对用户进行全局身份验证。
- 代理身份验证和授权:中间层服务器执行身份验证。
身份验证方法是在使用 de>CREATE USERde> 命令创建用户时指定的。Oracle 中有一些 Data Dictionary 视图,其中包含了关于这些用户的信息。
在 DB2 中,用户不是存在于数据库中,而是由操作系统来管理。没有数据库登录信息存放在数据库表中。任何操作系统用户都有可能访问 DB2;但是,除非他们被授予了给定的 DB2 权限或特权,否则他们能做的事情不多。通过 Control Center GUI 很容易授予和撤销权限和特权。不过首先需要将可用操作系统用户或组中的一个用户或组添加到 Control Center。
在 DB2 中没有 “角色(role)” 这个术语。相反,DB2 使用术语 “权限(authority)”,它类似于 Oracle 的数据库角色,DB2 通过权限将特权授予某些组或用户。DB2 支持的权限有:SYSADM、SYSCTRL、SYSMAINT、DBADM 和 LOAD。
不能使用 GRANT SQL 语句授予 SYSADM、SYSCTRL 和 SYSMAINT 权限。这些特殊的权限只能在数据库管理器配置文件中设置。
DB2 还使用术语 “特权(privilege)”,它类似于 Oracle 的系统和模式对象特权。DB2 中有数据库特权(连接、创建表等)和数据库对象特权(模式、表、视图等)。图 11 显示了从 Control Center GUI 获得的 DB2 安全性信息。Change User 窗口中显示的大部分选项卡对应了 DB2 所支持的特权。
图 11. DB2 安全性
Oracle 10g 的安全性大体上没有变化,只有部分增强。下面是 Oracle 10g 中的增强的列表:
- FGA 的 DML 支持 —— 细粒度审计(fine-grained auditing,FGA)的 SQL 支持得到了增强,现在支持查询和 UPDATE、INSERT 和 DELETE 操作这些粒度上的审计。
- SASL 上的通信 —— 该特性为 Oracle Internet Directory(OID)与数据库之间或者两个数据库之间的通信提供了一种安全通道。如果您的企业部署通过密码进行身份验证的用户,那么也就不再需要在公共密钥基础设施(PKI)方面投入资金和管理工作。SASL(Simple Authentication and Security Layer)通信提供了等价的安全通道。
- 统一用户模型 —— 目录中定义的单点登录(single sign)用户现在可以使用 Enterprise User Security 提供的特性。不需要为供应和凭证管理而执行附加的任务。此外,Enterprise User Security 的管理组现在可以指派一个所有者,这促进了整体上更有力的安全性。
- 轻松的数据库注册 —— 该特性消除了对 RDBMS_SERVER_DN 参数的需要,使得企业用户的配置更为轻松。
- 扩展的、统一的审计跟踪 —— 该特性以标准的、细粒度的审计表的形式,为 RDBMS 审计提供了一致的审计跟踪,改进了安全性管理。事务和 SQL 信息也被添加到审计表中,以便进一步提高所有用户的可问责性(accountability)。
DB2 中的身份验证不仅涉及对用户名和密码进行加密,还允许对客户机与服务器之间传输的数据进行加密。身份验证的位置由数据库管理器配置参数 AUTHENTICATION 的值决定。
下面是用于启用 DB2 的身份验证的有效选项:
- SERVER_ENCRYPT —— 这个值规定身份验证发生在服务器上。首先加密连接期间指定的用户 id 和密码,然后将它们发送到服务器,在服务器上将它们与服务器端的用户和密码进行比较。如果匹配成功,那么用户就被允许访问数据库。
- KRB_SERVER_ENCRYPT —— 规定服务器接受 KERBEROS 身份验证或加密的 SERVER 身份验证模式。
- DATA_ENCRYPT —— 规定服务器允许 SERVER 身份验证,并且对客户机与服务器之间通过网络传输的数据进行加密。
- DATA_ENCRYPT_CMP —— 规定服务器接受加密的 SERVER 身份验证模式和用户数据的加密。 这种身份验证类型能与不支持 DATA_ENCRYPT 身份验证类型的下级产品兼容。
- GSS_SERVER_ENCRYPT —— 规定服务器接受基于 GSS API 的插件身份验证或加密的服务器身份验证模式。
若要更新 AUTHENTICATION 实例参数,例如将它的值设置为 DATA_ENCRYPT,可以使用以下命令:
清单 1. 更新 AUTHENTICATION 实例参数
UPDATE DBM CFG USING AUTHENTICATION DATA_ENCRYPT db2stop db2start |
-
创建安全策略。
安全策略描述用于决定谁可以访问特定数据的凭证。任何一个表只能由一个安全策略来保护,但是不同表可以由不同的安全策略来保护。这是通过使用 CREATE SECURITY POLICY 语句来实现的。安全策略的所有管理都是通过使用 SQL 语句来完成的。 -
除了特权和权限外,数据库安全性还包含其他方面。简单地说,Oracle 与 DB2 之间既有不同点,也有相同点:
用户身份验证和授权
Oracle 在创建用户之后,使用存储在目录中的加密密码。DB2 支持用于用户身份验证的密码,并使用底层的操作用户进行身份验证。Oracle 和 DB2 都支持 LDAP (Oracle Internet Directory 与 IBM Directory Server)。Oracle 和 DB2 都支持单点登录(SSO)。
数据加密
Oracle 支持数据加密,它可以对敏感数据,例如信用卡号和一些高度敏感的商业数据进行加密。DB2 允许列级的数据加密。
网络加密
Oracle 通过它的 Oracle Advanced Security 提供网络加密。Oracle 使用 DES、3DES 和 RC4 业界标准加密。DB2 本身不进行网络加密。但可以使用附带的 Tivoli SecureWay 实现网络加密。
审计跟踪
Oracle 允许审计跟踪用户和对象。还可以使用日志挖掘程序调查和分析有疑问的查询。DB2 也提供了类似的审计设施。在 DB2 中,可以使用 db2audit 实用程序进行审计跟踪。
|
|
DB2 9 pureXML 特性
在本节中,我们将 Oracle 对 XML 的支持与 DB2 对 XML 的支持进行比较。 Oracle XML DB 特性随 Oracle 9i Release 2 一起发布,借助该特性,通过定义 XMLTYPE 表和列,将它们存储为 CLOB 或拆分(分解)到关系表中,可以实现对 XML 存储、检索和模式的管理。 Oracle 10g 为管理 XML 文档提供了一些增强。例如,通过映射已有的数据,可以动态地反映模式的更改,而不必重新导入。Oracle 10g 包括一些工具包,例如:
- XML-SQL Util(XSU) —— 为 PL/SQL 和 Java 提供的接口。
- XML Developer’s kits(XDK) —— 用于受支持的语言,例如 PL/SQL、C++ 和 Java。
Oracle 10g 仍然是一种 支持 XML 的 数据库。它提供的所有接口、API 和包,都是为了减轻 XML 与关系表之间的相互转换和映射所带来的负担、复杂性和维护。支持 XML 的数据库,不管是使用 CLOB 还是分解方法,都不能提供良好的性能。例如,在使用 CLOB 的情况下,XML 文档作为镜像文件存储在数据库中。您可能已经知道,镜像文件的管理是很麻烦的。分解方法在性能方面也不如人意。将一个 XML 文档分解成小块并存储在多个表中之后,当需要将 XML 文档组合成原样时,就不得不使用一个 SQL JOIN 操作。SQL 中的 JOIN 是开销很大的,特别是表的数量较多时这一点尤其明显。保持数字签名的保真度同样也是一个挑战。
另一方面,DB2 9 pureXML 技术则是原生存储 XML 文档,也就是说,在内部以树型格式存储 XML 文档。它还允许同时使用 SQL 和 XML 扩展,即 Xquery 和 Xpath 来访问关系数据和 XML 数据。原生存储 XML 文档是一种更好的方法,IBM 的研究表明,使用该方法在 XML 文档的搜索和检索方面可以取得更好的性能,并且能减少某些程序中代码的行数。
要在数据库中使用 pureXML 特性,在创建数据库时要使用 UNICODE(例如使用编码集 UTF-8)。在创建一个表之前,如果没能创建一个 UNICODE 数据库,则会产生如下所示的错误:
SQL1239N XML features can only be used in a Unicode database with a single database partition. SQLSTATE=42997 |
DB2 与之前版本一样存储关系数据。但是,XML 数据是以分层格式存储的(作为使用 Xquery 数据模型的一棵树)。XML 与关系服务之间是紧密集成的。为了存储 XML 文档,用户需要创建一个表,并指定一个列使用一种新的数据类型,即 XML,如下面的例子所示。
清单 2. 用 XML 数据类型创建表
create table T (i int, doc xml) |
下图展示了这两列的显示效果:
图 12. DB2 存储模型
由于 XML 文档是以解析的分层格式存储在 XQuery Data Model (XDM) 中的,因此不需要进行转换或映射。用于存储 XML 文档的格式就是用于处理 XML 文档的格式。这样可以提供更好的性能。
备份、恢复、导入等实用程序对含 XML 列的表的作用与其他表是一样的。可以使用 INSERT 语句或 IMPORT 实用程序(注意:DB2 LOAD 实用程序还不支持 XML)将 XML 数据插入 XML 列。在导入来自第三方的 XML 文档之前,最好根据一个预定义的 XML 模式验证这些文档。为了注册一个 XML 模式,DBA 需要执行 REGISTER XML SCHEMA 命令,并以 COMPLETE XML SCHEMA 结束,以完成注册过程。 DB2 9 还支持在一个 XML 文档的子集或整个文档上创建索引。在创建索引时,需要指定 XPATH,它将指向被建索引的特定元素/属性。
在 DB2 9 中,有四种方法来访问关系数据和 XML 数据,如 图 13 所示:
- 纯 SQL(不涉及 XQuery)
- SQL/XML,也就是说嵌入在 SQL 中的 XQuery
- XQuery 作为独立的语言(不涉及 SQL)
- 带嵌入式 SQL 的 Xquery
图 13. 可能的 PureXML 查询
表 3 比较了 DB2 9 与 Oracle 10g 的 XML 功能。
XML 功能 | Oracle 10g | IBM DB2 9 for Linux, Unix and Windows |
---|---|---|
支持 XML 的存储 | √ | 不适用 |
XML 原生存储 | × | √ |
大环境的易维护性 | × | √ |
高度可伸缩性 | × | √ |
将 XML 文档存储为 CLOB | √ | √。但是从长远看,鼓励使用 XML 原生存储 |
分解 | √ | √。但是从长远看,鼓励使用 XML 原生存储 |
要看到更深入的讨论,可以在 developerWorks 上找到更多关于 IBM pureXML 功能的文章,例如 使用 XQuery 查询 DB2 XML 数据 和 使用 SQL 查询 DB2 XML 数据。
|
|
表分区
DB2 的表分区(即区域分区)类似于 Oracle 的分区。它基本上允许将一个逻辑表拆分成跨一个或多个表空间的多个物理存储对象。每个对象对应于一个 “分区”,允许每个表空间包含一定范围的、很容易访问的数据。
在 DB2 中,有多种方法对数据进行分区,您可以同时将这些方法应用于相同的数据。为了避免读者感到困惑,下面简单地解释一下提供这种分区的各种不同方法:
- DATABASE PARTITIONING —— 按照键散列将数据分布在数据库的多个逻辑节点上(DPF)。
- RANGE/TABLE PARTITIONING(DB2 9 提供) —— 根据键区域将数据划分到一个逻辑数据库分区中的多个物理对象上。
- MULTI DIMENSIONAL CLUSTERING(MDC) —— 根据多个键值组织表(或一个表中的区域)中的数据。
利用 DB2 9 中新引入的表分区特性,可以根据一个或多个表列中的特定值将表数据划分到不同的表空间。这些分区可以独立地进行备份和恢复,可以提高某些查询的性能,因为 DB2 优化器知道这些分区的存在,并且可以避免对查询中不需要的分区进行扫描。例如,如果按一年的四个季度对表进行分区,并且查询只需要第 4 季度的数据,那么 DB2 将不解析前三个季度,而是直接找到第 4 个季度并解析之。这被称作分区排除(partition elimination)。
如前所述,在 DB2 9 中,数据组织的三种方法,即数据库分区(Database Partitioning)、表分区(Table Partitioning)和多维集群(Multi Dimensional Clustering)可同时使用。
下面的例子创建一个 customer 表,其中 l_shipdate >= ’01/01/2006′ 且 l_shipdate = ’04/01/2006′ 且 l_shipdate Table partitioning in DB2 9