IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Information Management  >

利用 PostgreSQL V8.1 技能学习 DB2 Express-C

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论


级别: 初级

Ted J. Wasserman (tedwas.ibm@gmail.com), 数据库顾问, IBM

2006 年 4 月 20 日

利用您现有的 PostgreSQL 知识和技能快速掌握最新的 DB2® 技术。

简介

现在是您考虑切换到 DB2 的最佳时机。随着最近 DB2 for Linux®, Unix®, and Windows® 平台(32 位和 64 位)的一个全功能免费版本 —— DB2 Express-C V8.2 —— 的发布,越来越多的开发人员将会切换到一个已经得到证实的、具有最新技术和不断增长的开发人员社区基础的数据服务器。DB2 Express-C 与 DB2 UDB Express Edition V8.2 产品基于相同的核心技术。因此,它支持用广泛的编程语言构建和部署应用程序,包括 C/C++、Java™、.NET、PHP,等等。

学习一种新产品或系统,有时候可能是一项比较复杂且耗时的事情。本文的目的是消除这种陡峭的学习曲线,帮助已经熟悉 PostgreSQL V8.1 的数据库管理员 (DBA) 和开发人员快速掌握 DB2 的架构和工具。基本理解 DB2 架构以及它与 PostgreSQL 的不同之处。了解 DB2 中的不同工具和实用程序,以及哪些与您已经熟悉的 PostgreSQL 中的工具类似。然后探索 DB2 所有必须提供的、附加的、易于使用的特性和工具,看看为何值得切换。





回页首


高度系统概览

图 1 给出了 PostgreSQL 架构的一个高度概览。图 2 展示了 DB2 架构的高度概览。


图 1. PostgreSQL V8.1 架构
PostgreSQL V8.1 架构图



图 2. DB2 V8.2 架构
DB2 V8.2 架构图

两种架构既有类似的地方,也有不同之处。PostgreSQL 和 DB2 都基于一种客户机-服务器架构,其中客户机层独立于服务器。在两种架构中,一个希望使用数据库的客户机应用程序发出通过网络的请求,并由服务器上的一个进程作出响应(在 PostgreSQL 上使用 postmaster,在 DB2 上使用 db2agent)。PostgreSQL 使用一个简单的每用户进程(process-per-user)客户机/服务器模型,在这种模型中,一个客户机进程刚好连接到一个服务器进程。主要的进程叫做 postmaster,它侦听一个指定的 TCP/IP 端口,看是否有入站的连接,并在每请求一个连接时产生一个新的名为 postgres 的服务器进程。postgres 进程与每个其他使用信号量和共享内存的进程通信,以在并发的数据访问期间确保数据完整性。数据库文件是通过共享的磁盘缓冲区而访问的。

在 DB2 中,协调程序代理(db2agent)通过使用进程间通信 (IPC) 或远处通信协议,代表应用程序来协调工作并与其他代理通信。所有来自客户机应用程序的连接请求,不管是本地的还是远程的,都被分配给一个相应的协调程序代理。当启用了分区内并行时,协调程序代理会产生一些额外的叫做子代理(db2agentp)的工人代理(worker agent),来帮助并行地执行工作。在 DB2 中,一个数据库可以被分割在多个逻辑节点上,对应用程序是透明的。这些节点又可以遍布在一个或多个服务器机器上。DB2 通过缓冲池访问数据库文件。它可以使用预取器(db2pfchr)和页清除器(db2pclnr)进程,异步地将数据放入缓冲池和从缓冲池取出数据。日志编写器进程(db2loggw)将日志记录从日志缓冲区转储到磁盘上的日志文件,而日志读取器进程(db2loggr)则在事务处理(换句话说就是回滚)、重启恢复和前滚操作期间读取数据库日志文件。有关 DB2 进程模型的更多信息,请参阅文章 “DB2 通用数据库进程全接触”(developerWorks,2003 年)。





回页首


核心管理工具

在继续比较基本的架构区别之前,我们首先简单地来看一下 PostgreSQL 和 DB2 中使用的一些主要的管理工具,因为本文后面各节中将会用到这些工具。

PostgreSQL 的命令行接口是 psql 工具。psql 是一个基于终端的 PostgreSQL 前端,允许您交互式地键入查询,将它们发送到 PostgreSQL,并查看查询结果。另外,输入也可以来自文件。psql 接口展示在 清单 1 中。


清单 1. PostgreSQL 的 psql 命令行接口
				
$ psql mydb
Welcome to psql 8.1.3, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
mydb=#
mydb=# SELECT version();
version
----------------------------------------------------------------
PostgreSQL 8.1.3 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.4 20050721 
(Red Hat 3.4.4-2)
(1 row)
mydb=# SELECT current_date;
date
------------
2006-03-09
(1 row)
mydb=#

PostgreSQL 发行版没有附带图形化工具,尽管 PostgreSQL Web 站点上推荐了两个流行的开放源码图形化工具 GAdmin III 和 PhpPgAdmin。这些工具可以连接到 PostgreSQL 数据库,并有助于执行普通的任务。

DB2 附带有几个可以用于管理数据库的工具。命令行处理器(Command Line Processor,CLP)是从命令行管理 DB2 的主要工具。要从 Windows 启动该工具,可通过 Windows “开始” 菜单找到它(Programs > IBM DB2 > Command Line Tools > Command Line Processor),或者从 DB2 Command Window 输入 db2。在 UNIX 和 Linux 平台上,作为实例拥有者登录(简要地说)并在命令提示符下输入 db2。CLP 可以以交互式模式运行,如 清单 2 所示。它也可以以非交互式模式运行,在这种模式下,命令都带有 db2 前缀或者来自一个输入文件脚本。有关使用 CLP 的更多信息,请参阅文章 “DB2 基础: DB2 UDB 命令行处理器入门”(developerWorks,2005 年)。


清单 2. 交互式模式的 Command Line Processor
				
# db2
(c) Copyright IBM Corporation 1993,2002
Command Line Processor for DB2 SDK 8.2.3
You can issue database manager commands and SQL statements from the command
prompt. For example:
    db2 => connect to sample
    db2 => bind sample.bnd
For general help, type: ?.
For command help, type: ? command, where command can be
the first few keywords of a database manager command. For example:
 ? CATALOG DATABASE for help on the CATALOG DATABASE command
 ? CATALOG          for help on all of the CATALOG commands.
To exit db2 interactive mode, type QUIT at the command prompt. Outside
interactive mode, all commands must be prefixed with 'db2'.
To list the current command option settings, type LIST COMMAND OPTIONS.
For more detailed help, refer to the Online Reference Manual.
db2 => connect to sample
   Database Connection Information
 Database server        = DB2/LINUX 8.2.3
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPLE
db2 => values current_date
1
----------
03/09/2006
  1 record(s) selected.
db2 =>

图 3 所示的控制中心(Control Center)是 DB2 中的中央图形化管理工具。从控制中心,可以执行诸如以下这样的任务:创建数据库、备份数据库、查看查询执行计划、查看诸如表这样的数据库对象和配置数据库设置。要在 Windows 上启动控制中心,可通过 Windows “开始” 菜单找到它(Programs > IBM DB2 > General Administration Tools > Control Center),或者在命令提示符下输入 db2cc。在 UNIX 和 Linux 上,作为实例拥有者用户登录并在命令提示符下输入 db2cc




图 3. Control Center
Control Center




回页首


数据库集群和 DB2 实例

在 PostgreSQL 中,在可以创建任何数据库之前,必须首先在磁盘上初始化一个数据库存储区域。这个存储区域称为数据库集群。数据库集群是由正在运行的数据库服务器的单个实例(换句话说就是 postmaster 进程)管理的数据库集合。用文件系统的术语来讲,数据库集群是单个目录,所有的数据都存储在其中。通常,一个叫做 Postgres 的特殊用户帐户用于拥有服务器及其数据。许多操作要求您作为该用户登录,比如启动服务器时。

初始化之后,数据库集群就包含有一个叫做 postgres 的数据库,这是实用程序、用户和第三方应用程序使用的默认数据库。另一个叫做 template1 的数据库被创建来用作创建新数据库的模板。在用户可以访问数据库之前,服务器必须已启动。服务器可以通过发送不同的信号给 postmaster 进程而停止。

DB2 具有一个有些类似于数据库集群的概念,叫做实例。实例也称为数据库管理器 (DBM),是创建和处理数据库所需要的逻辑服务器环境。它实际上只是一个进程集合,提供对数据库的访问。如果您创建了不只一个实例,那么每个实例充当一个独立的服务器环境,可以独立地停止和启动。与 PostgreSQL 一样,您可以同时具有多个活跃的实例,以及在每个实例中具有多个活跃的数据库。在 UNIX 和 Linux 平台上安装 DB2 期间,您可以选择创建一个通常叫做 db2inst1 的默认实例。在这些平台上,一个特殊的用户帐户通常被创建来 “拥有” 该实例,该用户称为实例拥有用户。在 Windows 上安装 DB2 期间,总是会创建一个叫做 DB2 的实例。默认情况下,安装期间不会在实例中创建数据库,您必须显式地创建它们。要查看系统上定义的实例列表,可以使用 db2ilist 命令,该命令可在 DB2 安装文件夹的 instance 子目录中找到。清单 3 展示了该命令在 Linux 上的示例输出:


清单 3. db2ilist 命令的示例输出
				
$ /opt/ibm/db2/V8.1/instance/db2ilist
db2inst1
$

另外,也可以在控制中心中查看已定义的实例。展开左边窗格对象树中的 Instances 文件夹,如 图 4 所示。


图 4. 在控制中心中查看已定义的实例
Control Center 中的 Instances 文件夹

要在 UNIX 和 Linux 上启动或停止 DB2 实例,可作为实例拥有用户登录或者切换到该用户,并发出 db2start 命令。要停止实例,可使用 db2stop 命令。在 Windows 上,也可以使用这些命令来启动和停止实例。但是您用来发出这些命令的用户帐户必须是为该实例定义的 SYSADM 组的成员。

也可以从控制中心启动和停止实例。右击左边窗格对象树中的目标实例,并分别选择 StartStop 选项。为了停止实例,必须保留所有到该实例中数据库的连接。

可以用 db2icrt 命令创建新实例,用 db2idrop 命令删除实例。

有关安装 DB2 时创建的用户帐户的更多信息,请参阅文章 “DB2 UDB 安全性: 了解用户和组帐户与 DB2 UDB 的交互”(developerWorks,2005 年)。





回页首


数据库

在 PostgreSQL 中,数据库是一个命名的数据库对象集合。一般来说,每种数据库对象(表、函数,等等)都属于惟一一个数据库。但是有几个属于整个集群的系统编目(例如,pg_database),并可从集群中的每个数据库访问到。数据库在物理上是分离的,访问控制是在连接级管理的。使用 CREATE DATABASE 命令创建数据库,用 DROP DATABASE 命令销毁数据库。

在 DB2 中,数据库是表的集合,包括数据和相关对象,比如索引、视图、触发器、函数和存储过程。多个数据库可以存在于同一个实例中,但是每个数据库都是与其他数据库完全独立的,因为它们都具有自己的系统编目表(包含数据库元数据)、配置文件和恢复日志。

数据库在对象和数据上都是相互独立的。例如,应用程序在默认情况下不能发出从两个不同数据库获取数据的查询。可以设置一种叫做联邦(federation)的特殊技术来实现这种功能。创建在相同实例中的数据库共享相同的实例进程集合。

有好几种创建数据库的方式,但是最常见的方式是使用 CREATE DATABASE 命令,比如下面这样:

CREATE DATABASE MYDB ON /database/mydb

发出该命令之后,一个名为的 MYDB 的数据库就使用默认选项创建在 /database/mydb 路径中了。该命令还有许多其他选项您可以指定,所以一定要看看 DB2 文档 中的命令语法图。

创建数据库的另一个容易的方式是从控制中心使用 Create Database 向导。该向导展示在 图 5 中。要启动该向导,可展开左边窗格中的对象树状视图,直到看到 Databases 文件夹。右击 Databases 文件夹,并选择 Create Database 选项,然后选择 StandardWith Automatic Maintenance 选项。遵循向导中的步骤,完成数据库创建过程。


图 5. Create Database 向导
Create Database 向导




回页首


配置文件

PostgreSQL 具有许多配置参数,影响着数据库系统的行为。可以在好几个地方设置这些参数。最常见的地方是 postgresql.conf 文件,该文件通常保存在 data 目录中。清单 4 展示了该文件的示例内容:


清单 4. postgresql.conf 文件的示例内容
				
# This is a comment
log_connections = yes
log_destination = 'syslog'
search_path = '$user, public'

第二种设置这些参数的方式是把它们当成 postmaster 服务器的命令行选项,比如:

postmaster -c log_connections=yes -c log_destination='syslog'

最后,一个命令行选项只可以应用于一个特定的会话。环境变量 PGOPTIONS 可以在客户端用于此目的:

env PGOPTIONS='-c geqo=off' psql

DB2 也必须在各种级别上进行配置,如 图 6 所示。


图 6. 配置 DB2 的不同级别
配置 DB2 的不同级别

首先,某些设置可在实例级配置,比如通信和安全性。要查看所有的实例级配置参数,可以发出 GET DB CFG 命令。清单 5 展示了该命令的一个输出片断。


清单 5. GET DBM CFG 命令的示例输出
				
db2 => get dbm cfg
 Database Manager Configuration
 Node type = Enterprise Server Edition with local and remote clients
 Database manager configuration release level            = 0x0a00
 CPU speed (millisec/instruction)             (CPUSPEED) = 4.251098e-07
 Communications bandwidth (MB/sec)      (COMM_BANDWIDTH) = 1.000000e+02
 Max number of concurrently active databases     (NUMDB) = 8
 Data Links support                          (DATALINKS) = NO
 Federated Database System Support           (FEDERATED) = NO
 Transaction processor monitor name        (TP_MON_NAME) =
 Default charge-back account           (DFT_ACCOUNT_STR) =
 Java Development Kit installation path       (JDK_PATH) = /opt/IBMJava2-142
 Diagnostic error capture level              (DIAGLEVEL) = 3
 Notify Level                              (NOTIFYLEVEL) = 3
 Diagnostic data directory path     (DIAGPATH) = /home/db2inst1/sqllib/db2dump
 .....
 .....

要更新实例参数,可使用 UPDATE DBM CFG 命令:

UPDATE DBM CFG USING <parameter_name> <value>

用参数名取代 <parameter_name>,用参数值取代 <value>。有些参数是动态的,也就是说任何更改都会立即生效。另外一些参数则需要您停止并重启实例才能使更改生效。

其他一些设置可在数据库级配置,比如日志记录、排序内存和 SQL 语句缓存。要查看所有的数据库配置参数,可发出 GET DB CFG FOR <db_name> 命令,其中 <db_name> 是您的数据库名。清单 6 展示了该命令的一个输出片断。


清单 6. GET DB CFG 命令的示例输出
				
db2 => get db cfg for sample
       Database Configuration for Database sample
 Database configuration release level                    = 0x0a00
 Database release level                                  = 0x0a00
 Database territory                                      = US
 Database code page                                      = 1208
 Database code set                                       = UTF-8
 Database country/region code                            = 1
 Database collating sequence                             = BINARY
 Alternate collating sequence              (ALT_COLLATE) =
 Database page size                                      = 4096
 Dynamic SQL Query management           (DYN_QUERY_MGMT) = DISABLE
 Discovery support for this database       (DISCOVER_DB) = ENABLE
 Default query optimization class         (DFT_QUERYOPT) = 5
 Degree of parallelism                      (DFT_DEGREE) = 1
 Continue upon arithmetic exceptions   (DFT_SQLMATHWARN) = NO
 Default refresh age                   (DFT_REFRESH_AGE) = 0
 Default maintained table types for opt (DFT_MTTB_TYPES) = SYSTEM
 Number of frequent values retained     (NUM_FREQVALUES) = 10
 Number of quantiles retained            (NUM_QUANTILES) = 20
 Backup pending                                          = NO
 Database is consistent                                  = YES
.....
.....

要更新参数,可使用 UPDATE DB CFG 命令:

UPDATE DB CFG FOR <db_name> USING <parameter_name> <value>

用您的数据库名取代 <db_name>,用参数名取代 <parameter_name>,用参数值取代 <value>。一些参数是动态的。另外一些则需要取消激活(deactivate)数据库(如果它是被显式激活的话),或者在重新连接之前必须等待数据库的所有连接都断开。

实例和数据库参数也可以使用 Control Center 来更新。右击目标实例或数据库(这取决于您想要更新的参数),并选择 Configure Parameters 选项。这将启动 图 7 所示的 Instance/Database Configuration 对话框窗口。


图 7. Database Configuration 对话框窗口
Database Configuration 对话框窗口

最后,某些参数可在 DB2 注册表级配置。每个 DB2 服务器具有一个注册表(registry),您可以在其中设置激活新特性的标志以及一些特定于平台的特殊优化选项。不要把这个注册表与操作系统的注册表混淆起来。DB2 注册表值存在和应用于 DB2。

要查看当前的注册表设置,可使用 db2set 命令。您可以将一些附加的标志添加到该命令,以提供附加的输出。例如,-all 标志展示所有当前设置的注册表变量。-lr 标志列出每个可为当前平台设置的注册表变量。清单 7 展示了 db2set 命令的示例输出。


清单 7. db2set 命令的示例输出
				
 # db2set -all
[i] DB2COMM=TCPIP
[g] DB2SYSTEM=localhost.localdomain
[g] DB2ADMINSERVER=dasusr1

要设置或更改一个注册表参数,可使用 db2set 命令:

db2set <parameter_name>=<value>

请确保不要在等号 (=) 的两端留有空格,否则您的更改就不会生效。注册表变量可以在各种级别设置和应用。您可以全局地设置它们,以便它们应用于所有实例。也可以针对特定实例设置它们。另外,也可以在环境级别设置它们,这意味着在 Windows 中使用 SET 命令和在 UNIX 和 Linux 中使用 EXPORT 命令在 DB2 之外设置它们。没有什么例外,要使所作的更改生效,必须重启实例。

一个叫做 Configuration Advisor 的实用程序也可用于建议环境的一个初始基线配置。该实用程序可以使用 AUTOCONFIGURE 命令从命令行运行,也可以从控制中心作为向导运行。要从控制中心启动它,可右击目标数据库并选择 Configuration Advisor 项。





回页首


缓冲区和缓冲池

PostgreSQL 使用系统共享的内存作为缓冲区。postgresql.conf 文件中的 shared_buffers 配置参数设置数据库服务器使用的共享内存缓冲区数量。默认值一般为 1000,但是如果内核设置不支持它的话,也可以小于这个数。每个缓冲区是 8192 字节,除非在构建服务器时选择了一个不同的 BLCKSZ 值。

DB2 使用叫做缓冲池的数据库对象作为表和索引数据的缓存。缓冲池是在数据库级别创建的,不能由多个数据库共享。当创建缓冲池时,必须指定想要使用的页大小和分配的页数。DB2 支持 4K、8K、16K 和 32K 等页大小。根据您的工作负载复杂性,可以决定只使用一个大缓冲池。您也可能想使用多个缓冲池,每个具有不同的页大小。要创建缓冲池,可使用 CREATE BUFFERPOOL 语句。例如:

CREATE BUFFERPOOL bp16k SIZE 1000 PAGESIZE 16K

也可以从控制中心创建缓冲池。展开目标数据库,然后右击 Buffer Pools 文件夹,并选择 Create 选项。这将启动 Create Buffer Pool 对话框窗口,如 图 8 所示。


图 8. Create Buffer Pool 对话框窗口
Create Buffer Pool 对话框窗口

默认情况下,当创建新数据库时,就会创建一个 4K 页大小的名为 IBMDEFAULTBP 的缓冲池。该缓冲池通常不够大,所以将想要增加它的大小或者创建另外的更大的缓冲池。

注意 图 8 所示窗口底部的 Show Command 按钮。大多数控制中心对话框窗口都允许您查看在后台实际执行的 SQL 语句或命令。这些命令可以保存在脚本中以备以后执行。这也是学习 DB2 语法的一种好方式。





回页首


表空间

PostgreSQL 中的表空间允许数据库管理员定义表示数据库对象的文件可以存储在文件系统的什么位置。表空间一旦创建好,就可以在创建数据库对象时用名称来进行引用。通过使用表空间,管理员可以控制 PostgreSQL 安装的磁盘布局。表、索引和整个数据库都可以分配给特定的表空间。为此,给定表空间上一个具有 CREATE 特权的用户必须将表空间名作为参数传递给相关命令。

在 DB2 中,表空间是一个数据库对象,用作表(和索引)和存储文件的物理磁盘之间的一个抽象层。当创建表空间时,必须将它与一个特定的缓冲池以及一些特定的容器相关联。容器是一个目录、文件或原始的设备。这种架构在控制性能方面给予您很大的灵活性。例如,如果具有一个 “热” 表,您可以将它放在它自己的表空间中,并给它一个自己的缓冲池。这有助于确保该表中的数据总是缓存在内存中。

表空间可定义为系统管理的空间 (SMS) 或数据库管理的空间 (DMS)。SMS 表空间由操作系统管理并按需增长。它们减少了管理,却降低了性能。DMS 表空间是由 DB2 预分配和管理的。这种类型的表空间通常要好于 SMS,但是需要进行更多的管理。DMS 表空间也更加灵活,因为它们允许您将表的数据、索引和大对象分开到不同的表空间。

要创建表空间,可使用 CREATE TABLESPACE 命令,比如:

CREATE TABLESPACE USER_16K
PAGESIZE 16K
MANAGED BY SYSTEM
USING ('d:\usp3_cont1', 'e:\usp3_cont2', 'f:\usp3_cont3')
BUFFERPOOL bp16k

该命令创建一个 16K 页大小的表空间,并将它与 bp16k 缓冲池相关联。该表空间跨越三个容器,每个容器都在其自己的驱动器上。

也可以使用控制中心创建表空间。展开目标数据库,右击 Table Spaces 文件夹,并选择 Create 选项。这将启动 Create Table Space 向导,如 图 9 所示。


图 9. Create Table Space 向导
Create Table Space 向导

当用默认选项创建数据库时,会创建三个表空间,如 表 1 所述。


表 1. 创建数据库时默认创建的表空间
表空间名描述
SYSCATSPACE编目表空间,包含系统编目表。
TEMPSPACE1系统临时表空间,由 DB2 用作一个工作区域,来执行诸如联结和排序这样的操作。
USERSPACE1当没有在创建表时显式地指出表空间时,该表空间存储用户表。

您可以使用这些默认的表空间或者创建自己的表空间。此外,如果想要使用声明的全局临时表,需要在创建临时表之前创建一个用户临时表空间。这种类型的表空间不是在创建创建新数据库时默认创建的。





回页首


模式

模式(schema)在 PostgreSQL 和 DB2 中是类似的。每个数据库都包含一个或多个命名的模式,而模式又包含表和其他数据库对象。可以使用 CREATE SCHEMA 命令来创建模式。例如:

CREATE SCHEMA myschema

另外,DB2 允许在指定的模式不存在时 “动态地” 创建模式。只有被授予 IMPLICIT_SCHEMA 数据库权限的用户才可以这样做。

要删除模式,可使用 DROP SCHEMA 命令。例如:

DROP SCHEMA myschema

PostgreSQL 和 DB2 之间主要的区别在于没有指定模式时发生的事情。在 PostgreSQL 中,当您不指定模式名创建对象时,对象会被自动放入一个名为 public 的模式中。每个新数据库都包含该模式。换句话说,下面的语句是 PostgreSQL 中的等价物:

CREATE TABLE products ( ... )

CREATE TABLE public.products ( ... )

当没有指定模式时,系统通过查看一个搜索路径 来确定创建什么对象,该路径是所查看的模式列表。搜索路径中列出的模式中的第一个匹配对象被当成您想要创建的对象。如果搜索路径中没有匹配的对象,就会报告一个错误,即使匹配对象名存在于数据库中的另一个模式中亦是如此。搜索路径中指定的第一个模式是当前模式。默认情况下,它是public 模式。除了是第一个搜索到的模式之外,它还是 CREATE <object> 命令没有指定模式名时在其中创建新对象的模式。这就是为什么新对象创建在public 模式中的原因,因为它默认为列在搜索路径中的第一个。可以使用 SET 语句改变该路径,比如:

SET search_path TO myschema,public;

一旦目标模式在路径中,您就可以访问该模式中的数据库对象,无需限定它们。对于其他对象来说,搜索路径的工作方式是一样的,比如数据类型名、函数名和操作符名等对象。

在 DB2 中,默认情况下,当前模式与用于连接数据库的用户 ID 相同。因此,如果一个叫做 ACCTREP 的用户连接到数据库,那么用于非限定数据库对象的默认模式是 ACCTREP。所有限定的数据库对象引用使用显式指定的模式。

要更改默认模式,可使用 SET SCHEMA 语句。例如,下面这个语句:

SET SCHEMA JIM

为连接期间将默认模式更改为 JIM,直到用一个不同的值再次发出该语句,模式才会改变。DB2 中没有跟 PostgreSQL 中一样的模式路径的概念。只能为当前模式指定一个值。另一方面,存储过程和用户定义函数却具有类似于 PostgreSQL 中模式搜索路径的函数路径。





回页首


表、索引和视图

表、视图和索引在 PostgreSQL 和 DB2 中是类似的。在 DB2 中,在创建任何类型的数据库对象之前,必须首先连接到您想要在其中进行创建的数据库。可以使用命令语法或者使用控制中心中的向导来创建这些对象。图 10 展示了 Create Table 向导。要启动 Create Table 向导,可右击目标数据库下面的 Tables 文件夹并选择 Create Table 选项。


图 10. Create Table 向导
Create Table 向导

尽管创建对象的语法非常类似,但是每种数据库实现它们的方式不同。例如,在 PostgreSQL 中,可以指定创建哪种类型的索引,比如 B-Tree、R-Tree 或 Hash 索引。在 DB2 中,则没有这种选择。但是,DB2 可以在需要时自动创建特殊类型的索引,比如在执行某些类型的查询时创建位图索引,在处理多维集群 (MDC) 表时创建块索引。DB2 也具有 PostgreSQL 没有的对象的特殊实现,比如 MDC 表和物化查询表(Materialized Query Tables)。





回页首


数据库应用程序对象

本文的主要目的是描述 DB2 环境与 PostgreSQL 环境的比较。数据库服务器逻辑(包括存储过程、触发器和用户定义函数)是一个非常广泛的主题,因此这里只作简要介绍。

PostgreSQL 是可扩展的,因为它的编目表可以由用户修改。扩展包括诸如类型、用户定义操作符和用户定义函数等组件。

PostgreSQL 提供四种函数:

  • 查询语言函数(用纯 SQL 编写的函数)
  • 过程语言函数(用 PL/pgSQL 或 PL/Tcl 等编写的函数)
  • 内部函数(用 C 编写的已经静态链接到 PostgreSQL 服务器的函数)
  • C 语言函数(用 C 或者可与 C 兼容的语言编写的函数,可动态编译成可加载对象并由服务器按需加载)

PostgreSQL 也支持触发器。触发器代码实际上由触发器函数组成,触发器函数是一种特殊的函数,包含在触发器中执行的逻辑。触发器函数必须在创建触发器本身之前就创建好了。触发器函数可用大多数可用的过程语言编写,这些语言包括 PL/pgSQL、PL/Tcl、PL/Perl 和 PL/Python。

DB2 支持存储过程、用户定义函数和用户定义存储过程。存储过程可用 C/C++、Java、OLE、COBOL(这是一种支持 Microsoft CLR 的语言)或 DB2 的 SQL Procedural Language (SQL PL) 编写。当创建一个 SQL 存储过程时,它的过程语句被转换成一个存储在数据库编目中的本机表示,与对待其他 SQL 语句一样。当调用该过程时,就会从编目中加载本机表示,并在 DB2 引擎中执行。

DB2 提供使用 DB2 的 SQL PL 语言创建定制的用户定义函数 (UDF) 的能力。UDF 也可以用诸如 C 或 Java 这样的外部语言来编写。UDF 可以封装经常使用的逻辑,以降低应用程序开发的复杂性。DB2 用于 UDF 的过程语言实际上是 DB2 的 PSM 过程语言的一个子集。因此,SQL 存储过程中支持的某些 SQL PL 元素在 UDF 中并不受支持。

最后,DB2 为 INSERT、UPDATE 和 DELETE 操作支持触发器。DB2 也支持定义在视图上的触发器,这种触发器称为 INSTEAD OF 触发器。注意,DB2 用于触发器的过程语言实际上是 DB2 PSM 过程语言的一个子集。因此,SQL 存储过程中支持的某些 SQL PL 元素在触发器中并不受支持。





回页首


安全性

PostgreSQL 和 DB2 都具有认证和授权机制。认证是验证用户凭证的过程。授权是确保一个用户具有适当的数据库特权来执行给定动作的过程。

PostgreSQL 提供很多不同的客户机认证方法。可以根据客户机的主机地址、数据库和用户来选择用于认证某个客户机连接的方法。客户机认证由一个配置文件控制,该文件一般名为 pg_hba.conf,并且存储在数据库集群的 data 目录中。pg_hba.conf 文件的一般格式是一个记录集,每行一个记录。每个记录指定一种连接类型、一个客户机 IP 地址范围(如果与连接类型相关的话)、一个数据库名、一个用户名和用于与这些参数匹配的连接的认证方法。第一个具有匹配的连接类型、客户机地址、请求的数据库和用户名的记录用于执行认证。如果没有这样的记录匹配,访问就会被拒绝。清单 8 展示了 pg_hba.conf 文件的一个示例片断。


清单 8. pg_hba.conf 文件的示例内容
				
# Allow any user on the local system to connect to any database under
# any database user name using Unix-domain sockets (the default for 
# connections).
#
# TYPE	DATABASE	USER	CIDR-ADDRESS		METHOD
  local	all		all					trust
# The same using local loopback TCP/IP connections.
#
# TYPE	DATABASE	USER	CIDR-ADDRESS		METHOD
  host	all		all	127.0.0.1/32		trust
# Allow a user from host 192.168.12.10 to connect to database
# "postgres" if the user's password is correctly supplied.
#
# TYPE	DATABASE	USER	CIDR-ADDRESS		METHOD
  host	postgres	all	192.168.12.10/32	md5

其他认证和连接设置保存在 postgresql.conf 文件中。

在 DB2 中,应用程序或数据库用户帐户不存在于数据库中,而是由一个外部安全性设施来管理,比如操作系统。在数据库中,特定数据库对象上的特权可以分配给这个外部设施中定义的用户或组帐户。

默认情况下,认证发生在 DB2 服务器上。DB2 还支持很多其他认证方法,包括客户机上执行的认证(允许 “单点登录” 访问)、Kerberos 安全性设施或用户定义 Generic Security Service (GSS) 插件。附加的认证选项包括加密用户名和密码及其数据的能力,因为它们要在客户机和服务器之间的网络上传输。可以更新名为 AUTHENTICATION 的 DB2 实例参数的值来更改整个实例的认证设置。该实例中所有的数据库都使用这个值。

PostgreSQL 使用角色的概念管理数据库访问权限。一个角色可以看成一个数据库用户或者一组数据库用户,这取决于角色是如何设置的。角色可以拥有数据库对象(例如表)并将这些对象上的特权分配给其他角色。角色在概念上是与操作系统用户分离的,并且在数据库集群安装上是全局的,而不是针对每个单独的数据库。

在 DB2 中,因为没有数据库或应用程序用户的概念,所以有必要创建任何操作系统用户,应用程序使用这些用户来连接数据库,然后授予他们特定的数据库对象特权。为了促进管理和操作,也可以创建用户组,并给这些组授予特定的数据库特权。这些组中的用户继承分配给组的特权。可以使用标准的 GRANTREVOKE 语句来授予和撤销特权。也可以从控制中心管理特权。可在 DB2 文档 中找到可被授予和撤销的特权的列表。特权是在数据库级别授予的,只适用于特定的数据库,而不适用于实例中的所有数据库。如果想要让用户具有多个数据库的相同特权,必须在每个数据库中显式地授予这些特权。

DB2 UDB 也提供系统级管理权限(SYSADM、SYSCTRL、SYSMAINT、SYSMON)的一个层次结构。这些权限允许用户执行诸如创建/删除数据库和强迫用户退出系统之类管理任务的一个子集。权限是通过在关联的实例级参数(SYSADM_GROUP、SYSCTRL_GROUP、SYSMAINT_GROUP、SYSMON_GROUP)中指定组名而在实例级分配的。该组中的用户为实例中的所有数据库继承这个权限。

有关用户帐户和特权/权限的附加信息,请参阅文章 “ DB2 UDB 安全性: 了解用户和组帐户与 DB2 UDB 的交互”(developerWorks,2005 年)和 “ DB2 UDB 安全性: 理解在 DB2 UDB 中如何实现权限和特权”(developerWorks,2006 年)。





回页首


并发性

与传统的使用锁来进行并发控制的数据库系统不同,PostgreSQL 通过使用一个多版本的模型(Multiversion Concurrency Control,MVCC)来维护数据的一致性。这意味着在查询数据库时,每个事务看到的是一段时间前的数据快照,而不管底层数据的当前状态是什么。这防止了事务查看到由另一个事务更新同一个数据行所导致的不一致的数据。

SQL 标准描述了四个事务隔离级别和每个级别中可能出现的并发性问题。在 PostgreSQL 中,可以请求四个标准隔离级别中的任何一个,但是在内部只有两个隔离级别,对应于 Read Committed 和 Serializable 级别。当选择级别 Read Uncommitted 时,实际得到的是 Read Committed,当选择 Repeatable Read 时,实际得到的是 Serializable,所以实际的隔离级别比您选择的要严格。

Read Committed 是 PostgreSQL 中的默认隔离级别。当事务运行在该隔离级别时,SELECT 查询只看到查询开始之前已提交的数据,从来不会看到未提交的数据和查询执行期间由并发事务更改了的已提交数据。但是 SELECT 语句可以看到在其自己的事务中执行的以前的更新的效果,即使它们还没有提交。实际上,SELECT 查询看到的是该查询开始运行时的那一瞬间的数据库快照。如果其他的事务在第一个 SELECT 执行期间提交了更改的话,那么两个连续的 SELECT 命令即使处于单个事务中可能看到不同的数据。

DB2 的并发模型完全不同于 PostgreSQL 的。在任何时刻,一个行只存在一个副本或实例。DB2 使用行和表锁定来确保数据完整性和一致性。每当请求对一行进行读或更新时,DB2 就会获得一个锁,除非请求行的应用程序使用的是 Uncommitted Read 隔离级别,在这种情况下,不会为读操作获得锁。更新操作总是需要一个独占锁。在事务提交或回滚时,锁就会被释放。锁设置是可配置的,包括多少内存用于保存锁信息(LOCKLIST 数据库配置参数)、应用程序应该在超时之前等待多长时间的锁(LOCKTIMEOUT 数据库配置参数)和应用程序可以消耗的锁内存的最大百分比(MAXLOCKS 数据库配置参数)。

DB2 支持不同级别的并发控制,可满足大多数应用程序的需求。应用程序应该使用提供适当并发性的隔离级别。隔离级别由每个数据库连接指定,这意味着数据库的不同连接可以使用不同的隔离级别。在很多情况下,DB2 的默认设置 Cursor Stability 就足够了。DB2 也允许在 SQL 语句级别指定隔离级别,从而覆盖数据库的默认隔离级别。例如,假设一个应用程序需要得到一个表中的 “大约” 行数。性能是极其重要的,除了这个 SQL 语句之外,到处都需要 Cursor Stability 隔离级别。可以使用下面这个 SQL 语句来获得该信息:

SELECT COUNT(*) FROM tab1 WITH UR

因为这种情况中读脏数据是可以接受的,所以为该语句选择 Uncommitted Read 隔离级别将有助于改善性能,因为没有获得读锁。

要增加系统的并发性,可经常提交事务,包括只读事务。如果可能的话,应该重新安排竞争访问同一个表的应用程序。此外,为读一致性不是问题的事务使用 Uncommitted Read (UR) 隔离级别。

您也可能想要启用三个相对新的注册表变量(DB2_EVALUNCOMMITTED、DB2_SKIPINSERTED 和 DB2_SKIPDELETED)来改善该系统的并发性。当从诸如 PostgreSQL 这样的 MVCC 系统切换而来时,这些注册表变量将尤其有益。有关这些注册表变量的更多信息,请参阅文章 “Lock avoidance in DB2 UDB V8”(developerWorks,2005 年)。





回页首


备份和恢复

有三种通常用于备份 PostgreSQL 数据库的方法:SQL 转储、文件系统备份和在线备份。SQL 转储方法用 SQL 命令生成一个文本文件,这些命令在取回到服务器时,会以转储时的相同状态重新创建数据库。转储方法是用一个叫做 pg_dump 的实用程序来实现的。为了备份整个数据库集群,提供了 pg_dumpall 程序。另一个替代的备份策略是,使用任何您喜欢用来进行文件系统备份的方法,直接将 PostgreSQL 用于存储数据的文件复制到数据库中。最后,您也可以组合文件系统级别的备份和预写式日志文件的副本,将数据库还原到一个特定的时间点。

在 DB2 中,每个数据库必须使用 BACKUP 命令分别备份。该命令得到备份时数据库状态的一个二进制副本,以后将用于把数据库还原到同一状态。DB2 支持三种备份:完全(full)、增量(incremental)和差异(delta)。完全备份是数据库当前状态的一个完整快照。增量备份允许您只备份自上次备份以来已发生更改的索引和数据页。差异备份基于自最后一次增量或差异备份以来已发生更改的数据。此外,DB2 还支持在线和离线备份,给您灵活性以保持系统 24x7 运行。

要进行备份,可使用 BACKUP 命令。例如:

backup database sample to /dev1/backup

该命令对 SAMPLE 数据库进行一次完全的离线备份,并将备份文件放在 /dev1/backup 路径中。

也可以使用控制中心来进行备份。右击左边窗格对象树中的目标数据库,并选择 Backup 选项。将会出现 图 11 所示的 Backup Wizard,您可以在这里定制备份设置。


图 11.控制中心中的 Backup Wizard
Control Center 中的 Backup Wizard

DB2 也可以自动化所有的备份需求,如果您选择这样做的话。DB2 可以跟踪何时应该进行备份,并根据需要在用户定义维护窗口中开始一次备份。

有关 BACKUP 实用程序的更多信息,请参阅文章 “DB2 基础: IBM DB2 Universal Database for Linux, UNIX and Windows 备份实用程序”(developerWorks,2005 年)。

可以使用 RESTORE 命令还原备份映像。例如:

RESTORE DATABASE SAMPLE

另外,也可以从控制中心中使用 Restore Database 向导还原数据库。要启动该向导,可右击 All Databases 文件夹,然后选择 Create Database 选项,再选择 From Backup 选项。

数据库还原操作需要一个独占的连接,RESTORE 实用程序防止其他应用程序访问该数据库,直到还原操作成功完成。但是表空间还原操作可以在线执行。参阅 DB2 文档,了解有关 RESTORE 命令的更多信息。

除了 BACKUP 实用程序之外,DB2 还具有另一个名为 db2look 的实用程序,用于重新生成数据库对象定义。这些定义然后可以用于在不同的数据库中重新创建相同的对象。注意,该实用程序只生成对象定义 (DDL),而不生成数据。您也可以从 Control Center 访问该实用程序。右击一个对象(即表、数据库,等等)并选择 Generate DDL 选项。有关 db2look 实用程序的更多信息,请参阅 DB2 文档





回页首


数据库维护

PostgreSQL 有两个实用程序用于维护数据库的健康和性能。VACUUM 命令必须经常运行,以恢复由更新或删除的行占用的磁盘空间,更新 PostgreSQL 查询计划器使用的数据统计信息。此外,有时,用 REINDEX 命令定期地重新构建索引很有用。

在 DB2 中,有好几个实用程序可用于维护数据库的健康和性能。第一个且最重要的一个是 RUNSTATS 实用程序。RUNSTATS 实用程序收集表和索引的统计信息,这些信息在查询优化提出优化的查询访问计划时可派上用场。一定要经常更新统计信息,在表中加载或删除很多行或者添加新索引后也要更新统计信息。runstats 命令用于收集表的统计信息。例如,下面这个 runstats 命令收集 EMPLOYEE 表及其所有索引的统计信息:

runstats on table tedwas.employee with distribution indexes all

该实用程序也可在控制中心中得到。右击目标数据库下的 Tables 文件夹中的一个表,并选择 Run Statistics 选项。将会出现 图 12 所示的 Run Statistics 对话框窗口,您可以在这里定义收集统计信息期间使用的选项。


图 12. runstats 对话框窗口
runstats 对话框窗口

尽管您可以在您喜欢的任何时刻收集统计信息,但是 DB2 也可以自动化该过程。DB2 可以跟踪何时应该更新统计信息,并在需要时在一个用户定义维护窗口中进行更新。要找到有关该功能和更具体的 runstats 命令的更多信息,请参阅文章 “ DB2 UDB Version 8.2 中的 RUNSTATS”(developerWorks,2005 年)。

DB2 中另一个重要的维护实用程序是 REORGREORG 实用程序用于更有效地安排表和索引中的数据。例如,它会重构行以消除断开的数据和压缩的信息。对于索引来说,它会通过将索引数据重新构建到不断开的、物理上连续的页中,来重新组织定义在表上的所有索引。例如,下面这个命令重新组织 EMPLOYEE 表:

REORG TABLE tedwas.employee

REORG 实用程序也可从控制中心访问到。右击目标数据库下的 Tables 文件夹中第一个表,并选择 Reorganize 选项(或 Reorganize Indexes 选项以重新组织索引)。将会出现 图 13 所示的 Reorganize Table 对话框窗口,您可以在这里定义用于重新组织的选项。


图 13. Reorganize Table 对话框窗口
Reorganize Table 对话框窗口

一个名为 REORGCHK 的特殊实用程序可用于确定表或索引是否需要重新组织。例如,下面这个命令的输出(没有展示)有助于确定 EMPLOYEE 表是否需要重新组织:

REORGCHK CURRENT STATISTICS ON TABLE tedwas.employee





回页首


监控

PostgreSQL 的统计收集器是一个子系统,支持关于服务器活动的信息的收集和报告。几个预定义的视图(例如 pg_stat_activitypg_stat_database,等等)对查询可用,并显示统计收集的结果。此外,您也可以使用底层的统计函数构建定制的视图。

在 DB2 中,监控可以在各种级别上执行。可以使用快照监视器来捕获特定时刻关于数据库和所连接的应用程序的信息。快照对于确定某个时间点的数据库系统状态很有用。定期捕获快照也有助于观察趋势和预见潜在的问题。在捕获快照之前,您可能想要设置一些开关,以捕获更详细的信息,如果基本的信息不够的话。参考 DB2 文档,了解如何设置这些开关。当您准备捕获快照时,可发出 GET SNAPSHOT 命令。清单 9 展示了 GET SNAPSHOT FOR ALL DATABASES 命令的部分输出。


清单 9. GET SNAPSHOT FOR ALL DATABASES 命令的输出
				
Database Snapshot
Database name                              = SAMPLE
Database path                              = /home/db2inst1/db2inst1/NODE0000/SQL00001/
Input database alias                       =
Database status                            = Active
Catalog database partition number          = 0
Catalog network node name                  =
Operating system running at database server= LINUX
Location of the database                   = Local
First database connect timestamp           = 03/09/2006 11:03:58.417363
Last reset timestamp                       =
Last backup timestamp                      =
Snapshot timestamp                         = 03/09/2006 11:41:55.957502
Number of automatic storage paths          = 0
High water mark for connections            = 5
Application connects                       = 47
Secondary connects total                   = 1
Applications connected currently           = 2
Appls. executing in db manager currently   = 0
Agents associated with applications        = 2
Maximum agents associated with applications= 5
Maximum coordinating agents                = 5
Locks held currently                       = 0
Lock waits                                 = 0
Time database waited on locks (ms)         = Not Collected
Lock list memory in use (Bytes)            = 1920
Deadlocks detected                         = 0
Lock escalations                           = 0
Exclusive lock escalations                 = 0
Agents currently waiting on locks          = 0
Lock Timeouts                              = 0
Number of indoubt transactions             = 0
Total Private Sort heap allocated          = 0
Total Shared Sort heap allocated           = 0
Shared Sort heap high water mark           = 0
Total sorts                                = 20
Total sort time (ms)                       = Not Collected
Sort overflows                             = 1
Active sorts                               = 0
...
...

使用相应的 SNAPSHOT_xxxx() 表函数,您也可以使用 SQL 检索快照信息。在 DB2 文档 中可找到这些函数的一个列表。

事件收集器用于收集特定事件发生时有关数据库和所连接的应用程序的信息。这些事件代表数据库活动中的某些事务,比如死锁情形或者当应用程序连接数据库时。这种类型的信息很难用快照监视器来捕获,因为您必须对发生事件的确切窗口捕获快照。可以按事件类型或者您想要监控的事件来定义事件监视器。例如,死锁事件监视器等待死锁的出现;当出现一个死锁时,它就会收集关于所涉及的应用程序和处于争用的锁的信息。

可使用命令行语法或控制中心来创建事件监视器。例如,下面这些语句为应用程序连接创建并激活一个事件监视器,并将其输出写到路径 /tmp/conevents 中的一个文件中:

CREATE EVENT MONITOR conmon FOR CONNECTIONS WRITE TO FILE '/tmp/conevents'
SET EVENT MONITOR conmon STATE 1

当监控过程完成时,可使用下面这些语句来清除事件监视器缓冲区并停止监视器:

FLUSH EVENT MONITOR conmon
SET EVENT MONITOR conmon STATE 0

可使用 db2evmon 实用程序来格式化原始的事件监视器数据:

db2evmon -db sample -evm conmon

清单 10 展示了已格式化事件监视器输出的一个片断。


清单 10. 针对连接事件的已格式化事件监视器输出的一个片断
				
--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: CONMON
  Server Product ID: SQL08024
  Version of event monitor data: 7
  Byte order: LITTLE ENDIAN
  Number of nodes in db2 instance: 1
  Codepage of database: 1208
  Territory code of database: 1
  Server instance name: db2inst1
--------------------------------------------------------------------------
--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: /home/db2inst1/db2inst1/NODE0000/SQL00001/
  First connection timestamp: 03/09/2006 12:00:22.473810
  Event Monitor Start time:   03/09/2006 12:02:39.125790
--------------------------------------------------------------------------
3) Connection Header Event ...
  Appl Handle: 9
  Appl Id: *LOCAL.db2inst1.060309170022
  Appl Seq number: 0007
  DRDA AS Correlation Token: *LOCAL.db2inst1.060309170022
  Program Name    : db2bp
  Authorization Id: DB2INST1
  Execution Id    : db2inst1
  Codepage Id: 1208
  Territory code: 1
  Client Process Id: 16627
  Client Database Alias: SAMPLE
  Client Product Id: SQL08024
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: localhost.localdomai
  Connect timestamp: 03/09/2006 12:00:22.473810
4) Connection Header Event ...
  Appl Handle: 11
  Appl Id: *LOCAL.db2inst1.060309170318
  Appl Seq number: 0001
  DRDA AS Correlation Token: *LOCAL.db2inst1.060309170318
  Program Name    : DB2HMON
  Authorization Id: DB2INST1
  Execution Id    : db2inst1
  Codepage Id: 1208
  Territory code: 0
  Client Process Id: 16323
  Client Database Alias: SAMPLE
  Client Product Id: SQL08024
  Client Platform: Unknown
  Client Communication Protocol: Local
  Client Network Name: localhost.localdomain
  Connect timestamp: 03/09/2006 12:03:17.225823
...
...

要从控制中心创建事件监视器,可右击目标数据库下的 Event Monitors 文件夹并选择 Create 选项。将会出现 图 14 所示的 Create Event Monitor 对话框窗口,您可以在这里配置事件监视器的属性。


图 14. 在控制中心中创建事件监视器
Create Event Monitor 对话框窗口

要启动或停止监视器,可右击 Event Monitors 文件中创建的新监视器,并分别选择 Start Event MonitoringStop Event Monitoring 选项。要查看监视器输出,可再次右击您创建的新监视器,并选择 Analyze Event Monitor Records 选项。图 15 展示了 Event Analyzer 对话框窗口。


图 15. 使用 Event Analyzer 查看事件监视器输出
Event Analyzer 对话框窗口

事件监视器也可以配置成将其输出记录到管道或表中。





回页首


命令/实用程序映射和其他工具

PostgreSQL 包含几个实用程序和命令,用于执行数据库的维护。表 2 对它们进行了总结,并提供了 DB2 中对应的实用程序和命令(如果存在的话)。


表 2. PostgreSQL 和 DB2 中的命令及实用程序的映射
PostgreSQL 命令/实用程序描述DB2 中的对应物
clusterdb 一个用于重新集群数据库中的表的实用程序。再次在上一次使用的同一索引上重新集群它们。 REORG 命令。该功能也可通过控制中心得到。
createdb CREATE DATABASE 命令的一个包装器。 CREATE DATABASE 命令。该功能也可通过控制中心得到。
pg_config 输出当前安装的 PostgreSQL 版本的配置参数。 db2level 实用程序。
pg_dump 一个用于备份 PostgreSQL 数据库的实用程序。转储可以脚本或档案文件的格式输出。BACKUPdb2look 命令。DB2 备份是数据库的一个二进制转储,只可以与 RESTORE 命令一起使用。db2look 命令用于用也包含数据的选项转储结构 (DDL)。该功能也可通过控制中心得到。
pg_dumpall 一个实用程序,用于将实例中的所有 PostgreSQL 数据库写出(“转储”)到一个脚本文件。该脚本文件包含可用作 psql 的输入以还原数据库的 SQL 命令。DB2 中没有对应物。实例中的每个数据库必须使用 BACKUP 实用程序来单独备份,或者使用 db2look 实用程序来抽取它的结构。
pg_restore 一个实用程序,用于从 pg_dump 创建的非纯文本格式的档案文件还原 PostgreSQL 数据库。 RESTORE 命令。如果使用 BACKUP 命令进行了备份,则可使用该命令来还原。如果使用 db2look 命令转储了数据库结构和数据,那么该文件可以作为 Command Line Processor 的输入文件,以重新创建所有的数据库对象和数据。
psql 一个基于终端的 PostgreSQL 前端。允许交互式地发出查询,并显示查询结果。另外,输入也可来自文件。 db2 命令。在操作系统提示符下输入 db2 命令会以交互式模式加载 DB2 Command Line Processor。
reindexdb REINDEX 命令的一个包装器。 REORG 实用程序。该功能也可通过控制中心得到。
vacuumdb VACUUM 命令的一个包装器。 REORG 命令重新组织表和索引。RUNSTATS 命令收集表和索引的统计信息。该功能也可通过控制中心得到。
initdb 创建一个新的 PostgreSQL 数据库集群。数据库集群是由单个服务器实例管理的数据库集合。 db2icrt 命令。该命令创建一个新的 DB2 实例。然后就可以在该实例中创建数据库了。
pg_controldata 输出在 initdb 期间初始化的信息,比如编目版本和服务器位置。
  • GET DBM CFG 命令显示关于实例的信息。
  • GET DB CFG FOR <db_name> 命令显示关于数据库的信息。
该功能也可通过控制中心得到。
pg_ctl 一个实用程序,用于启动、停止或重启 PostgreSQL 后台服务器(postmaster),或者显示正在运行的服务器的状态。
  • db2start 命令启动一个 DB2 实例。
  • db2stop 命令停止一个 DB2 实例。
该功能也可通过控制中心得到。
pg_resetxlog 清除预写的日志 (WAL) 并可选地重置存储在 pg_control 文件中的一些其他控制信息。如果这些文件被破坏的话,该功能有时还是很需要的。 RECOVER DATABASE 命令。该命令可用于将数据库返回到一致的状态。RESTORE 命令也可用于从备份映像还原数据库或表,或者还原数据库的历史文件。
postgres 处理查询的实际 PostgreSQL 服务器进程。它通常不是直接调用的;而是启动一个 postmaster 多用户服务器。 db2sysc 是主要的 DB2 实例进程。它在发出 db2start 命令时启动,在发出 db2stop 命令时停止。
postmaster PostgreSQL 多用户数据库服务器。为了客户机应用程序能访问数据库,它连接到(通过网络或者本地)一个正在运行的 postmaster。postmaster 然后启动一个独立的服务器进程(postgres)来处理连接。postmaster 也管理服务器进程之间的通信。 db2sysc 是主要的 DB2 实例进程。它在发出 db2start 命令时启动,在发出 db2stop 命令时停止。db2sysc 在需要时生成其他进程。

DB2 也带有许多其他工具,本文没有对这些工具进行讨论。图 16 所示的 Command Editor 是 Command Line Processor 的一个图形化版本,喜欢在图形化环境中工作的人可以使用它。


图 16. Command Editor
Command Editor

图 17 所示的 Configuration Assistant 可以帮助您配置到您的远程数据库的客户机连接,方法是自动地检测通过网络的连接并为您配置它们。也可以使用该工具手动地配置连接。


图 17. Configuration Assistant
Configuration Assistant

图 18 所示的 Task Center 用于调度任务,比如进行备份或者运行维护脚本。


图 18. Task Center
Task Center

最后,图 19 所示的 Development Center 是一个完全的集成开发环境,用于构建 SQL 和 Java 存储过程和用户定义函数。


图 19. Development Center
Development Center

在 Windows 中,所有这些工具都可以通过从 Windows 开始 菜单导航到它们而启动。它们也可以通过单击控制中心中的相应工具栏按钮而启动,或者通过从控制中心的 Tools 菜单选择它们而启动。我们强烈建议您去探索这些工具,有助于增加生产效率,缩短学习曲线。





回页首


结束语

在本文中,我们比较了 PostgreSQL 与 DB2 之间在架构和环境方面的主要区别。复习了重要的 DB2 概念,比如实例、数据库、缓冲池和表空间,以及一些重要的工具,比如 Control Center、Command Line Processor 和各种向导。

除了本文之外,还有各种其他资源可以帮助您。有一个新的交互式的 论坛 能帮助回答您关于 DB2 Express-C 的问题。该论坛里主要是 IBM 的 DB2 专家,而很快就会成为开发人员和管理人员的强大社区。Porting Zone 网站提供关于将您现有的数据库移植到 DB2 的广泛信息,并描述了一种实际的方法以及一些最佳实践。最后,DB2 Migration Station 也包含各种资源可以帮助您切换到 DB2。



参考资料

学习

获得产品和技术

讨论


关于作者

Ted J. Wasserman 的照片

Ted J. Wasserman 是位于加州 San Jose 的 IBM 硅谷实验室的数据库顾问。Ted 在 DB2 Business Partner Technical Enablement 团队中工作,专门帮助 IBM 业务伙伴将其应用程序和数据库迁移到 DB2 UDB。Ted 从 Queen University (Kingston, Ontario, Canada) 获得了计算机科学学士和硕士学位。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

将您的建议发给我们或者通过参加讨论与其他人分享您的想法.




回页首


IBM、DB2 和 DB2 Universal Database 是 IBM 公司在美国和/或其他国家的商标。 Java 和所有基于 Java 的商标是 Sun 公司在美国和/或其他国家的商标。 Linux 是 Linus Torvalds 在美国和/或其他国家的商标。 Microsoft、Windows、Windows NT 和 Windows 徽标是 Microsoft 公司在美国和/或其他国家的商标。 UNIX 是 The Open Group 在美国和其他国家的注册商标。 其他公司、产品或服务名称可能是其他公司的商标或服务标志。 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。

IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款