原文地址:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0602tham2/index.html
简介
管理不同类型的数据库是大多数数据库管理员的一种工作方式。很少出现 DBA 只管理一组同类数据库的情形。在企业的数据中心,会有各种不同的后端存储库来存放数据,比如数据库中的电子表格、图像、视频/音频形式的数据,而这些后端存储库包括 DB2 Universal Database™、Oracle、Microsoft® SQL Server、Informix®、Sybase 或者诸如 MySQL 之类的开放源码数据库。大多数公司要求 DBA 具有跨数据库管理这些不同的数据库的技能,对于企业数据中心而言,对各种数据源具有丰富知识的人才是不可或缺的。
本系列文章将帮助您根据现有的 MySQL DBA 技能学习 DB2 Express。本文是这一系列的第一部分,将带领您快速了解 DB2 Express,文中主要将介绍 DB2 Express 的特性和功能,以及与开放源代码数据库 MySQL 相比 DB2 Express 所具有的优势。
本文对一般性管理任务进行了比较,但并没有深入讨论可管理性、稳定性和可伸缩性的问题,也不会讨论两种数据库引擎的编写方式,或者优化程序的工作方式。本文的目的是通过概括开始了解技能转移过程,或者为那些希望进行这种比较的人描述一下这两种产品。
对于关心成本的入门级用户,IBM 提供了 DB2 Express 的免费版本,该版本称为 DB2 Express-C。DB2 Express-C 与 DB2 Express、Workgroup Edition 和 Enterprise Edition 具有相同的代码基础。随着业务的增长,客户往往转而采用 DB2 Workgroup 或 Enterprise,这些产品通过 Data Partitioning Feature (DPF) 和 High Availability Disaster Recovery (HADR) 提供了真正满足企业需求的高可用性和高性能。DB2 Express-C 适合 C/C++、Java™、.NET® 和 PHP 开发人员,可以免费 下载 使用。不过要注意的是,DB2 Express-C 有 2-WAY CPU 和 4GB RAM 的限制。关于不同版本的比较,请参阅 DB2 UDB 分布式平台的 比较表 来获得版本比较。
主题
本文包括以下内容:
- 安装
- 系统结构
- 可执行文件
- 数据库表的类型
- 数据库配置
- 图形用户界面(GUI)
- 命令行处理程序(CLP)
- SQL 比较
- 授权和权限
- 锁定机制
- PHP 开发支持
- LOB 和视频/音频管理
- 数据类型
- 备份和恢复
下面我们来详细说明各个主题。
安装
首先来看看 MySQL 和 DB2 Universal Database Express 的安装步骤。两者的安装过程都很简单。
MySQL 安装
与 DB2 Express 相比,安装 MySQL 服务器的步骤略多一些(安装代码后还需要配置)。不过,两种数据库服务器都很容易安装。MySQL 和 DB2 Express 都允许在安装后使用 GUI 管理工具配置数据库。
关于 MySQL 安装程序的一点说明 —— 包含内容
对于 MySQL 5.0.18 Windows® 安装程序,服务器安装没有包含 GUI 管理程序或查询浏览器。安装 MySQL 服务器后,机器上将包括:
- MySQL Command Line Client
- MySQL Manual
- MySQL Server Instance Configuration Wizard
如下面的 图 1 所示:
图 1. MySQL 安装内容
要使用 GUI Administrator 和 Query Browser,则必须单独下载安装程序。要注意的是,不同平台需要下载不同的安装程序。而 DB2 Express 一次就安装了所有必需的管理工具和设施,无需另外下载。
DB2 Universal Database 安装
DB2 Universal Database Express 安装非常简单,参照下列步骤即可。
- 在欢迎屏幕上单击 Install Product。
图 2. 欢迎屏幕
- 单击 Next。
图 3. 选择要安装的产品
- 单击 Next。
图 4. 安装向导
- 接受许可协议,然后单击 Next。
图 5. 接受许可协议
- 作为例子,我选择了 Typical。您还可以选择 Custom 或 Compact。然后单击 Next。
图 6. 安装选项 —— Typical、Compact 和 Custom
- 需要安装的驱动器和目录。可以保留默认值。
图 7. 安装目录
- 输入 db2admin 口令。db2admin ID 是为 DB2 服务器管理创建的默认用户。
图 8. 用户信息
- 单击 Next。注意,在这里可以配置协议和启动选项。
图 9. 配置实例
- 单击 Next开始安装。
图 10. 开始安装
- 单击 Next。注意,在这里可以配置协议和启动选项。
图 11. 完成安装
完成安装后,DB2 Express 的安装布局如下表所示(概括性的)。默认的 DB2 Express 安装目录是 C:\Program Files\IBM\SQLLIB
。下表只是 DB2 Express 在 Windows 平台上的布局,Linux® 和 UNIX® 具有不同的路径设置。
目录名 | 内容 |
---|---|
/adsm | 包括用于口令加密的 dsmapipw.exe |
/BIN | 包含启动、停止和管理数据库所需的所有二进制文件 |
/bnd | 包含所有的绑定包 |
/conv | 包含代码页的转换表 |
/DB2 | DB2 实例相关文件,比如,其中包括 db2 日志文件 db2diag.log |
/DB2DAS00 | 包含 DB2 Admin Server- (DAS) 相关文件,如 dump 目录中的 db2dasdiag.log。如果有多个 DAS,该目录名将带有数字,如 DB2DAS01 等。通常一个 DAS 就足够用了 |
/java | 包含 JDBC™ 驱动程序 |
/samples | 包含大量实例代码 |
/TOOLS | 包含 DB2 工具的多数 JAR 文件 |
/tutorials | 包含各种教程 |
系统结构
本文中将讨论两种系统结构:
- 内存结构
- 容器
首先来看看 DB2 Express 主要内存布局的基本结构。关于内存管理的详细说明,请参阅 developerWorks 文章 “The DB2 UDB memory model: How DB2 uses memory”(链接请参见 参考资料 部分)。
内存结构
图 12. DB2 Express 内存结构
各部分的功能如下:
- Package Cache —— 用于存储静态和动态 SQL 语句的内存
- Buffer Pool —— 用于在写入磁盘之前暂存数据的内存
- Log Buffer —— 在日志写入磁盘前存储所有数据库更改的内存
容器
根据使用的表类型不同,MySQL 可以使用单个文件、多个文件或者表空间来存储数据。在这一节的最后,表 2 总结了 MySQL 和 DB2 Express 使用的容器。
图 13. MySQL 容器
与 MySQL 不同,DB2 Express 总是存储在表空间中。表空间是文件系统中的物理容器的逻辑表示。下面是表空间的一些特点:
- 一个数据库至少要有一个表空间。默认情况下,标准 DB2 Express 安装将创建三个表空间:
- Syscatspace —— 存储系统目录信息
- Tempspace1 —— 存储系统临时表。临时表空间可以是系统定义的,也可以是用户定义的。最好从系统临时表空间创建用户临时表空间
- Userspace1 —— 存储系统临时表。临时表空间可以是系统定义的,也可以是用户定义的。最好从系统临时表空间创建用户临时表空间
物理文件系统中的 DB2 Express 容器布局如下。
C:\DB2\
是数据库管理的默认数据库路径。也可以使用命令list active databases
找到数据库路径。DB2 数据库结构是按以下这种方式安排的,其中每一层分别表示:图 14. DB2 Express 容器布局
- Drive/Directory —— CREATE DATABASE 命令中指定的驱动器或目录
- DB2 Instance Name —— DB2 Instance 所有者的名字
- NODE0000 —— 数据库分区号,0 表示没有分区的数据库
- SQL00001 —— 数据库 ID,从 1 开始编号
- SQLOGDIR —— 数据库的默认日志目录
- SQLT0000.0 —— 目录表空间,SYSCATSPACE
- SQLT0001.0 —— 临时表空间,TEMPSPACE1
- SQLT0002.0 —— 用户表空间,USERSPACE1
管理员可以随时创建更多的表空间,例如使用 清单 1 和 清单 2 中所示命令。(关于完整的 创建表空间的语法,请访问 Information Center。)
清单 1. 在 DB2 Express 中创建系统表空间
Create System Temporary Tablespace systemp1_space managed by system using ('c:\systemp1_space','d:\systemp1_space')
清单 2. 在 DB2 Express 中创建用户表空间
Create User Temporary Tablespace usertemp1_space managed by database using (file 'c:\userdata1\usertemp1_space' 10000, file 'd:\userdata2\usertemp1_space' 20000)
- 可以将表分解到不同的表空间中。
- 视图、触发器和存储过程也可以保存在表空间中。
- 管理员可以根据需要创建任意多个表空间和任意多个容器。支持自动扩展特性。
- 表空间可以是系统管理的(SMS),也可以是数据库管理的(DMS)。
DB2 数据库管理员经常要决定容器是由系统管理,还是由数据库管理。这种决策由几方面因素决定,如可管理性、业务需求(如数据库的规模和增长速度)和性能问题。通常 SMS 更适合较小的环境,需要的时候,系统可以提供更多的空间。对于更繁琐庞大的环境,最好使用 DMS,因为管理员可通过自动扩展特性来分配空间。不过在一个数据库中结合使用两种方法的例子也不少见,比如把目录和临时表放在 SMS 中,而索引和数据则放在 DMS 中。
表 2 MySQL 和 DB2 Express 容器的差别。
数据库 | 表类型 | 说明 |
---|---|---|
MySQL | MyISAM | 索引文件用 .MYI,数据文件用 .MYD。索引和数据分别使用一个文件。 |
MySQL | InnonDB | 在路径参数 innodb_data_file_path 指定的表空间中存储数据。默认情况下该值为 ibdata1:10M:autoextend。可使用多个数据文件。 |
MySQL | Merge | .MRG 文件包含应该只作为一个表使用的表的名称,.FRM 包含表的定义。使用多个数据文件。 |
DB2 Express | 所有类型 | 存储在可跨越多个磁盘的表空间中。有两种类型的容器:
要确定使用哪一种表空间,SMS 还是 DMS,请阅读 DB2 Information Center 上的 SMS 与DMS 的比较。 |
可执行文件
首先看一看 MySQL 中主要的可执行文件和 DB2 Express 中的对应文件。然后重点介绍后者特有的可执行文件。本文主要讨论 Windows 操作系统上的可执行文件。这两种数据库在 Linux 和 UNIX 上的可执行文件可能不一样。
MySQL 的可执行文件名 | DB2 Express 的可执行文件名 | 说明 |
---|---|---|
MySQLInstanceConfig.exe | DB2 Control Center | MySQLInstanceConfig 用于配置实例。DB2 使用 Control Center 配置实例。请参阅本文中的 数据库配置 一节。 |
myisamchk.exe | 检查 MyISAM 表的完整性 | DB2 使用 Control Center 完成同样的检查。对于索引可使用 Index 窗口中的 Check Index,或者使用 Tablspace 窗口中的 Check Index。对于表,可以使用CHECK 约束来确保完整性。SET INTEGRITY 也用于表的完整性。比如通过对表执行 Control Center 操作可以设置表的完整性。 db2dart 工具可用于检查数据库的结构完整性。与 db2dart 类似的是 inspect。检查备份镜像的完整性使用 db2ckbkp 命令。要检查整个数据库的健康状况,可使用 Health Center GUI。 |
myisampack.exe | 压缩 MyISAM 表 | 在创建表的语句中使用 VALUE COMPRESSION ,可以在列或表级别上使用节省空间的行格式来减少空间占用。需要使用 Backup & Restore 数据库 API 来提供压缩,从而减少空间。 |
mysql.exe | MySQL 的 Windows 客户机 | DB2 Runtime Client —— 一种单独的产品,可访问远程 DB2 数据库单独安装。 |
mysqladmin.exe | MySQL Admin 客户机 —— 使用该命令可以执行的管理任务包括:
| DB2 命令提示符基本上可用于客户机和管理任务。要访问 DB2 命令提示符,可切换到 All Programs -> IBM DB2 -> Command Line Tools。 |
mysqlbinlog.exe | Mysqlbinlog 至少有三种用途:
| DB2 Express 支持联机日志和存档日志。出于 MySQL 相同的目的,所有事务都被记录下来。DB2 Express 支持单个事务的无限多个活动日志,所以长期事务永远不会失败(只要物理磁盘空间足够)。支持的最大日志空间为 256 GB。 此外,默认情况下 DB2 把错误记录到 db2diag.log 中。可使用工具 db2diag 分析这个日志文件。根据严重程度,错误可分为以下级别:
|
mysqlcheck.exe | 检查数据库是否健康,比如检查、修复、分析或优化表。比如mysqlcheck -u root -p awt | DB2 没有直接匹配的程序检查表错误。所有的表错误都被写入 db2diag.log 文件,用时间戳指向转储记录。这个转储文件不是为胆小的人准备的,它们是供 DB2 支持代表使用的。不过可以对表执行一些操作,比如:
|
mysqld.exe | 运行 MySQL 服务器 —— 有很多选项(若想了解更多信息,请输入mysqld --help --verbose) | 可使用 db2start 启动 DB2 Express 数据库实例。也可通过将 db2instance 环境参数设置为需要启动的实例来启动多个实例。停止实例使用 db2stop。 注意,启动和停止 DB2 实例需要 SYSADM、SYSCTRL 或 SYSMAINT 权限。 |
mysqldump.exe | 该工具导出表、表中的某些行、整个数据库或者一组数据库 | DB2 Export —— DB2 Express 支持导出四种格式的表或表中的某些行。受支持的四种文件格式为:
导出操作很简单,比如要从 Employee 表导出数据:export to employee.del of del messages emp.log select * from allanwtham.employee。 |
mysqlimport.exe | 该工具用于在纯文本文件中导入数据 | DB2 Import —— 支持与 DB2 Export 相同的四种格式 |
NA | Load | DB2 Load —— 向数据库中高速加载数据 |
NA | Audit | db2audit —— 用于检查未知的或者意料之外的数据访问的审计设施 |
NA | Explain | db2expln —— 解释静态 SQL 语句选择的访问计划 |
NA | Configuration Assistant | db2ca —— 配置远程访问 |
NA | db2admin | DB2 Admin Server (DAS) —— 有关的管理任务 |
数据库表类型
MySQL 对不同的用途使用不同的表。可以在一个数据库中混合使用这些不同的表。具体使用哪种表取决于用户的需要。表类型如下(最常见的是 MyISAM 和 InnoDB):
- SAM
SAM 是较早期的表类型。这种表类型主要用于支持遗留数据库。它已经被 MyISAM 表类型代替,并且计划不再支持这种表类型。
- MyISAM
MyISAM 是默认的表类型。要在 MyISAM 中创建表,可以保留默认值或者用 ENGINE 关键字明确指定,比如:
清单 3. 使用 MyISAM 创建表
Create table employee ( empno int not null auto_increment primary key, firstnme varchar(30), lastname varchar(30), deptno int ) engine=MYISAM;
MyISAM 表类型是非事务安全的表类型。对于高度并发的多重读/写,不应该选择这种表类型。MyISAM 不能保证原子性、一致性、隔离和持久性 (ACID)。不过,MyISAM 允许进行压缩和全文搜索。对于 MyISAM 类型,索引存储在 .MYI (MyIndex) 文件中,数据本身存储在 MYD(MyData) 文件中。MyISAM 表类型没有表空间的概念 —— 所有的数据/索引都存储在文件中。检查/修复 MyISAM 使用工具 myisamchk,压缩表使用 myisampack。MyISAM 中只有一种锁定机制,即表级锁定,因此不适用于访问比较频繁的环境。
- InnoDB
越来越多的企业需要使用这种表类型。InnoDB 是一种兼容 ACID 的表类型。InnoDB 表类型在表空间中存储数据和索引,允许使用不同文件系统中的多个表。最初由 InnoBase Oy 开发的这种表类型适合于快速、高性能、事务安全的环境。InnoDB 使用更小粒度的锁定机制 —— 行级别的锁定。详情请参阅 锁定机制 一节。
创建 InnoDB 类型的表要在 ENGINE 表创建语句选项中指定关键字 Innodb,请参阅下面的例子。
ENGINE
Create table employee ( empno int not null auto_increment primary key, firstnme varchar(30), lastname varchar(30), deptno int ) engine=InnoDB;
- BerkeleyDB (BDB)
这种表类型的用途与 InnoDB 相同。由 Sleepycat 开发的这种表类型存储在 B 树中,它支持页级锁定。
- Merge
Merge 类型是 MyISAM 的衍生物,用途是绕开单个巨大文件问题。它允许位于不同磁盘上的多个 MyISAM 文件根据创建表语句中的 MERGE规范来执行查询。要插入合并表,则必须将 INSERT_METHOD 选项指定为 first 或 last。默认情况下只能执行 Select、Update 和 Delete。
- Heap
将整个表保存在内存中。使用这种类型速度很快,但是一旦崩溃就会造成数据丢失。最好暂时性地使用这种类型。
DB2 Express 将数据存储在容器中,无论该容器是系统管理的容器,还是数据库管理的容器。默认情况下,在 DB2 Express 中创建的表与 ACID 兼容。没有用于创建与 ACID 不兼容的表的选项。创建表的语法非常类似。
比如要创建表 employee:
清单 5. 在 DB2 Express 中创建表
Create sequence sq1; Create table employee1 (empno int not null default next_value of sq1, firstnme varchar(30), lastname varchar(30), deptno int, primary key (empno))
DB2 Express 支持四种表类型,即:
- 临时表 ——
也称为公用表表示,这种表是 SQL 语句执行期间存在的临时表。可以根据需要引用任意多次,不需要重新计算。可使用这种表类型代替视图。
- 类型化的表 ——
使用结构化类型定义的表。结构化类型是包含一系列属性的数据类型。
- 概括表 ——
定义从查询中派生的表。主要在数据仓库环境中使用。
- 物化查询表 ——
定义从多表查询中派生的表。主要用于数据仓库环境。
除了表以外,还有其他类型的数据库对象,如索引、函数、触发器和存储过程等,这些对象共同组成了实用的关系数据库。表 4 比较了两种数据库的这些对象:
对象名 | MySQL 中的可用对象 | DB2 Express 中的可用对象 | 说明 |
---|---|---|---|
用户定义表 | × | √ | 两种类型的用户定义表
|
用户定义函数 | √ | √ | 两者都支持标量和列用户定义函数 |
用户定义数据类型 | × | √ | 三种用户定义的数据类型 ——
|
存储过程 | √ | √ | DB2 Express 支持 SQL 和 Java 存储过程 |
视图 | √ | √ | MySQL 从版本 5 开始支持视图 |
可更新视图 | √ | √ | DB2 Express 还支持类型化视图 |
触发器 | √ | √ | MySQL 从版本 5 开始支持触发器 |
递归 SQL | × | √ | 与递归函数类似,DB2 Express 的递归 SQL 可递归地使用结果集来得到最终结果 |
序列 | × | √ | MySQL 本身不支持序列,但是可以 模拟一个序列 |
数据库配置
MySQL 中需要在配置文件 my.cnf 的 [mysqld] 节指定配置参数。Windows 系统上提供了多个配置样板,如 my-medium.ini,还提供了其他 my-xxx.ini 文件。MySQL 在 Windows 上提供了示例配置文件 *.ini。下面给出了 my-medium.ini 中的一节。注意,不需要取消所选相关表类型的注释。
清单 6. MySQL 示例配置文件
... # The MySQL server [mysqld] port = 3306 socket = /tmp/mysql.sock skip-locking key_buffer = 16M max_allowed_packet = 1 M table_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M ... # Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = /usr/local/var/ #innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = /usr/local/var/ #innodb_log_arch_dir = /usr/local/var/ # You can set .._buffer_pool_size up to 50 - 80 % # of RAM but beware of setting memory usage too high #innodb_buffer_pool_size = 16M #innodb_additional_mem_pool_size = 2M # Set .._log_file_size to 25 % of buffer pool size #innodb_log_file_size = 5M #innodb_log_buffer_size = 8M #innodb_flush_log_at_trx_commit = 1 #innodb_lock_wait_timeout = 50
对于 DB2 Express,可使用 Control Cenrter 或者命令行处理程序(CLP)获取和设置数据库或者实例的配置文件。要使用 Control Center 配置数据库,请右击选中的数据库并选择 Configure Parameters。
图 15. 右击配置参数
可以动态改变这些值(一些参数只有在数据库管理程序停止并重新启动后才生效)。配置参数可分为以下几类:
- 应用程序
- 环境
- 日志
- 维护
- 性能
- 恢复
请参阅 DB2 Information Center 中完整的 参数列表。
图 16. DB2 Express 数据库配置参数
也可用 CLP 查询和设置配置参数。更新数据库配置的语法如下:
清单 7. 更新 db 配置的语法
>>-UPDATE--+-DATABASE-+--+-CONFIGURATION-+----------------------> '-DB-------' +-CONFIG--------+ '-CFG-----------' .----------------------. V | >--+---------------------+--USING----config-keyword value-+-----> '-FOR--database-alias-' .-IMMEDIATE-. >--+-----------+----------------------------------------------->< '-DEFERRED--'
比方说,如果要查询管理服务器参数,可使用 db2 get admin cfg
命令。要获得数据库 SAMPLE
的 db 配置,则可以使用 db2 get db cfg for SAMPLE
命令。
因为 IBM 也在致力于 DB2 UDB 产品的自动化研究,DB2 UDB Express 通过 DB2 Control Center 提供了自动化特性。使用向导(如 Create Database with Automation、Design Advisor、Configuration Advisor、Configure Automatic Maintenance 等)是自动化常见管理任务所采用的步骤,这些管理任务包括备份、配置和数据库对象自动维护等。比如,管理员可使用 Configuration Advisor 配置数据库。这一特性就避免了管理员费尽心思地去寻找最适合数据库的配置参数。Configuration Advisor 能够建议最适用的配置参数。为了获得最优的数据库性能,建议管理员尽量使用该特性。
图形用户界面 (GUI)
GUI 管理不可避免将成为很多管理员的首选。GUI 不仅能够快捷方便地执行某些任务,而且可以在忘掉了命令语法(或者如果根本没有学习过这种命令)的时候提供帮助。通常,易用性是推动用户使用 GUI 管理工具的主要因素。
MySQL 提供的两种主要 GUI 是 MySQL Administration 和 Query Browser。那些原来管理 MySQL 的管理员并不是非常喜欢 GUI 管理。命令行通常仍然是他们的最爱。目前最新的 MySQL Administrator 是 1.1.6 版。图 17 中显示了 MySQL 的登陆页面:
图 17. MySQL Admin —— 登录
登录后就可以在 GUI Administrator 中执行下列任务(只是一部分):
- 服务控制 —— 启动和停止服务
- 启动参数 —— myISAM 和 InnoDB 的参数、缓冲区和缓存、日志文件、安全和网络设置
- User Admin —— 为用户和组分配权限,口令管理
- Health —— 内存和连接的健康性检查
- 备份和恢复
图 18. MySQL Admin —— 任务
也可使用 WAMP(目前为 1.6.0 版)提供的 phpMyAdmin。
关于 DB2 Express GUI,有很多方面值得一说。所有的管理任务都可使用该 GUI 完成,其中包括一般管理、健康检查和设置等,如 图 19 所示:
图 19. DB2 Express GUI 管理 —— 不同的方面
在所有的管理 GUI 工具中,您可能会发现 DB2 Control Center 是最常用的。可以通过单击 Windows 桌面上右下角托盘上的绿色硬盘启动 DB2 Control Center:
图 20. DB2 Express GUI Administration - Control Center
DB2 Express Control Center 是与上下文有关的。右击一个项目会根据上下文产生不同的下拉菜单。比如,右击某个数据库会看到下列任务选项:
图 21. DB2 Express Control Center —— 与数据库有关的任务列表
DB2 Control Center 的一个优点是可使用 SHOW COMMAND 按钮查看对该任务等效的命令。有时候可以选择将命令保存到脚本中,让它在指定的时候运行。事实上,很多有用的特性这里没有提到,其中包括 Design Advisor 和 Configuration Advisor。这些特性将在后面的文章中介绍。
命令行处理程序
MySQL 提供了命令行控制台 (mysql.exe)。可以使用这个控制台执行管理任务。
图 22. MySQL 命令提示符
DB2 Express 提供了与 MySQL 类似的控制台。启动该控制台的一种方法是 All Programs -> IBM DB2 -> Command line tools -> Command Windows。
所有管理任务都可以在这个控制台中执行。
图 23. DB2 Express 命令提示符
SQL 比较
必须承认,并非所有的 SQL 语句都能够真正从一个数据库移植到另一个数据库。对于将 SQL 从 MySQL 迁移到 DB2 Express 而言也是如此。本文将通过下面几个方面说明 SQL 语句的差别。这些只是为了缓解两种系统之间的区别、避免手足无措而进行的小小尝试。此外要注意的是,并不是 DB2 Express 支持的所有数据库特性目前都获得了 MySQL 的支持。比如,外键约束能力只能在为 MySQL 5.1 提供以下支持的情况下用于 InnoDN,如下所示:
- 适用于除 InnoDB 之外的所有表类型的外键
- MyISAM 表的热备份
- 重命名数据库
- 列级约束
我们从以下角度看一看两者的异同:
- Select 语句
标准 SQL 支持 DISTINCT、GROUP BY、ORDER BY 和 HAVING 这些关键字。MySQL 和 DB2 Express 都在这一点上提供了很好的支持。但是为了限制返回的结果集,MySQL 使用了关键字 LIMIT,而 DB2 Express 使用 FETCH FIRST n ROWS 来限制返回的结果集。如 图 24 中显示的示例 fetch:
图 24. 在 DB2 Express 中使用 Fetch n Rows
MySQL 和 DB2 Express 都支持在 SQL 语句中使用 CASE 表达式进行条件检查。例如,可以指定符合特定条件的查询结果。下面的示例将根据收入对雇员进行分类:
清单 7. Set Transaction 的语法
Select empno, firstnme, lastname, case when integer (salary) > 40000 then 'High' when integer (salary) > 30000 and integer (salary) < 40000 then 'Medium' else 'Low' end from employee
此外,DB2 Express 还支持嵌套表表达式。嵌套表可以看成是在一个 SQL 语句中定义和使用的局部临时表。
MySQL 中的单值子查询 (single value subquery) 等同于 DB2 Express 中的标量全选择 (scalar full select)。
- 连接 —— 下表总结了 MySQL 和 DB2 Express 中的连接特性:
表 5. 连接类型 连接类型 MySQL DB2 Express 说明 内连接 √ √ 内连接表示存在于连接表中的行。传统上两者都对这种连接使用逗号。它是指定表的笛卡尔积。但在 MySQL 中也称为叉积。DB2 Express 不使用关键字 cross。 交叉连接 √ √ 与内连接相同。 左[外]连接 √ √ 左连接或左外连接表示匹配值和只出现在左表中的的值。比如在 MySQL 中,如果需要从 tableA 中选择所有不在 tableB 中的行,则使用的 SQL 语句是: select tableA.* from tableA left join tableB on tableA.id=tableB.id where tableB.id is null。 右[外]连接 √ √ 与左连接正好相反。表示连接表中出现的匹配值和那些仅在右表中出现的匹配值。 全[外]连接 × √ 全外连接表示连接表中出现的匹配值和那些仅在左表或右表中的某一个表中出现的匹配值。其使用具有惟一性。 直接连接 √ × MySQL 中的 Straight join 等同于 join,只不过左表总是先于右表读取。虽然 DB2 Express 中没有使用这个关键字,但在 DB2 Express 可以完成同样的目标。 自然连接 √ × MySQL 中的自然连接 相当于内连接。虽然 DB2 Express 中没有使用这个关键字,但在 DB2 Express 可以完成同样的目标。 可使用 GUI SQL Assist 指定连接类型。下面的例子说明如何使用 SQL Assist 设置连接选项。
图 25. 使用 SQL Assist 建立 DB2 连接
授权和权限
MySQL 中有两种级别的权限 —— 管理和用户。所有权限都可分别使用 GRANT 和 REVOKE 语句授予和收回。可以授予用户 create、select、update、delete、insert、execute、index 等权限,也可授予 alter、drop 和 shutdown 等系统权限。(请参阅 MySQL 提供的权限。)根用户在默认情况下具有下列权限:
图 26. MySQL 中的权限
DB2 Express 同时提供了授权(authorization)和权限(privileges)。授权是一组预定义的更高的管理权限,可以授予执行一般任务的用户或用户组,比如连接数据库、创建、撤销、备份和恢复数据库,而权限则包括用户权限和系统权限,通常用于对象操作。新安装的 DB2 Express 提供下列授权级别:
- SYSADM - System Administration
- SYSCONTROl - System Control
- SYSMAINT - System Maintenance
- DBADM - Database Administrator
虽然 SYSADM 具有最高的权限,但用户执行备份和恢复这类任务通常只需要 SYSMAINT 授权。因此,充分了解授权对为用户分配适当的权限非常重要。了解发出 get authorizations
命令需要什么权限,该命令用于查询系统编目表 SYSCAT.DBAUTH。图 27 显示了使用 get authorizations
命令的结果:
图 27. DB2 Express —— 当前用户的授权
DB2 Express 权限和 MySQL 非常类似。权限(包括用户和系统权限)可使用 GRANT 或 REVOKE 命令授予和收回。有三种类型的权限:
- 控制权限 —— 该权限通常保留给对象的创建者。这是所有者权限。比如,如果用户 A 创建了表 B,用户 A 就被自动授予表 B 的控制 权限。
- 一般权限 —— 该权限允许执行特定的任务。可通过明确或暗中授予该权限来对数据库对象执行 SELECT、UPDATE、DELETE 等任务。
- 暗含权限 —— 在将更高的权限授予用户时授予该权限。比如当用户执行一个包时,虽然没有明确授权,但为了使包能够成功执行,应立即自动授予隐含权限。
图 28 显示了一些可授予用户的权限。
图 28. DB2 Express —— 使用 Control Center 管理权限
注意,也可用 CLP 执行 GRANT 和 REVOKE 语句。
锁定机制
MySQL InnoDB 提供了事务安全的语句,支持标准 SQL-1992 中所述的四种隔离级别。为了达到事务安全,MySQL 实现了 ACID 的要求。默认情况下,MySQL 对所有事务使用 Repeatable Read 隔离级别。但可使用 Set Transaction
语句更改后续会话的隔离级别。也可在 SQL 语句中使用 SESSION 或 GLOBAL。SESSION 表示下一个链接将使用特定的隔离设置,而 GLOBAL 表示以后的所有连接都是某个隔离设置。Set Transaction
语法如 清单 8 中所示:
清单 8. Set Transaction 的语法
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
针对受支持的四种隔离级别,表 6 列出了出现幻像读、脏读或不可重复读的可能性(从高到低)。
- √ —— 会发生
- × —— 不会发生
隔离级别 | 幻像读 | 不可重复读 | 脏读 |
---|---|---|---|
可序列化 | × | × | × |
可重复读 | √ | × | × |
读取提交的结果 | √ | √ | × |
读取未提交的结果 | √ | √ | √ |
DB2 Express 提供了类似的隔离级别。按照从强到弱的次序分,DB2 Express 支持的四种隔离级别依次为:
- 可重复读 —— RR
- 读稳定 —— RS
- 游标可靠性 —— CS
- 未提交读 —— UR
每种隔离级别都提供了特定的事务安全,隔离级别的选择是根据更严格的隔离级别对性能的影响进行的一种权衡。比如,读取只读的查找表不需要可重复读级别,未提交读级别就足够了。嵌入式 SQL 语句的默认隔离级别为游标可靠性 (CS)。更改隔离级别的方法有两种(视情况而定):
- 在标准 DML 语句中可使用关键字 With 来更改级别。比如
select * from employee with UR
。 - 如果使用命令行,那么可以输入
change isolation level
命令。 - 如果使用 DB2 调用级接口,那么可在 db2cli.ini 文件中指定隔离级别。
表 7 列出了 DB2 的隔离级别和读特征,按照从强到弱的顺序依次为:
- √ —— 会发生
- × —— 不会发生
隔离级别 | 幻像读 | 不可重复读 | 脏读 |
---|---|---|---|
可重复读(RR) | × | × | × |
读稳定(RS) | √ | × | × |
游标可靠性(CS) | √ | √ | × |
未提交读(UR) | √ | √ | √ |
DB2 Express 支持表空间和表的显式锁定。如果 DB2 发现锁定某一个表比锁定该表中多个行的代价要小,那么 DB2 Express 会提供锁扩展。Locklist 和 Maxlocks 这些参数会影响锁扩展的方式。
PHP 开发支持
随着 PHP 在 Web 开发平台上的应用越来越广泛,开发人员常常希望获得能够快速安装且功能强大的开发环境,以避免争议。MySQL 在分发包中提供了一种快速安装工具 WAMP(目前版本为 1.6.1)。IBM 和 Zend Core 共同提供了类似的 PHP 开发组合。
Zend Core for IBM 是一种无缝集成、开箱即用、易于安装并且支持 PHP 的开发和生产环境。该产品包括与 IBM DB2 Universal Database 和 IBM Cloudscape® 的紧密集成、对 XML 和 Web 服务的本机支持、支持日渐广泛被采用的 Service Oriented Architectures (SOA)。Zend Core for IBM 为数据库驱动的应用程序提供了快速开发和部署的基础。通过提供一致的 API,它提供了从易于使用的轻量级 Cloudscape 数据库到战略数据库 DB2 的升级路径。有关的更多信息,请参阅 Zend Core for IBM 页面。
LOB、视频/音频管理
虽然目前数据管理领域中呼声最高的是企业内容管理(ECM)领域,但 MySQL 在很大程度上是一种结构化数据管理产品。ECM 用户必须设法找到支持 MySQL 作为后端系统的 ECM 处理程序。MySQL 使用 BLOB 数据类型系列处理非结构化数据。
另一方面,IBM 提供了 DB2 Content Manager 作为结构化和非结构化数据的内容资料库。为了满足目前的随需应变业务要求 —— 80% 的数据都是非结构化形式的,人们认为企业内容管理(ECM)在企业环境中是不可或缺的。如果对企业内容¹管理(ECM)有正确的理解,那么您可能认为从头建立一个企业内容管理系统很简单。我们来看看一家典型企业中的各种数字内容、遇到的困难以及 IBM DB2 Content Manager 提供的丰富功能如何满足这些需要。
内容可能指:
- 发票、结算表、报告
- 传真和扫描的书面内容
- SCM、CRM 和 ERP 数据
- 电子邮件和桌面文档
- 音频、视频和图片
- Web 内容
客户经常面临的问题是数据使用不同的格式,存在于不同的位置。没有集中的资料库,用户就无法有效地共享数据,更不用说通过协作确保畅通的业务连续性了。无法使用业务过程工作流,用户就很难创建或者搜索 Web 内容。这是多数企业都会遇到的困境。
构建时要考虑可伸缩性,DB2 Content Manager 采用了一个三层的体系结构,其中包括 Library Server 中的几种索引和 Resource Manager 中的对象存储。灵活的用户授权许可允许为适应业务的需要部署任意多个 Resource Managers。比方说,纽约的总部可使用两个 Resource Manager,而西雅图、亚特兰大和范库弗各有一个 Resource Manager。为降低网络通信量,可以提供局域网缓冲。IBM DB2 Content Manager 支持层次化存储管理,可以按照适当的周期定期将对象迁移到外部设备上。比方说,可以在 DASD 上保存六个月后将对象迁移到外部磁盘上,保存三年后再迁移到磁带上保存七年。
IBM DB2 Content Manager 还提供了身份验证、权限和访问控制,保证用户和用户组操作的安全。从文档级动作,创建、读取、更新、删除、打印的细粒度权限和注释修改,到 Resource Manager 集合访问控制,IBM DB2 Content Manager 都可以保证正确实现访问和使用。用户可打开事件日志来进一步审计内容系统。
从内容的创建到管理和分发,IBM 生命期管理主要依赖于 IBM DB2 Content Manager 提供的丰富特性。下面是 IBM DB2 Content Manager 的一些特性:
- 即时扫描
- 成批装载不同格式的内容
- 通过 Windows 客户机、web 客户机和 portlet 提供了本机内容查看器
- 检入/检出
- 过程工作流(可用 GUI 工作流创建程序建立)
- 版本化
- 注释
- LDAP 集成
- 事件日志(用户活动和管理活动)
- 与 SAP & Siebel 的集成
- 与记录管理(如 IBM DB2 Record Management)的集成,以确保符合规章
- 与客户现有业务线的集成
- 包括在应用程序内部或者其他 Web 服务中使用的 Web 服务接口
- XML 模式映射
如果进行内部内容系统开发,IBM DB2 Express 会为此提供 LOB/CLOB 数据类型。
数据类型
MySQL 和 DB2 Express 具有类似的数据类型。要注意的是,DB2 Expess 同时支持内建数据类型和用户定义数据类型(前面已经提到)。关于 DB2 Express 数据类型如何组织的概述,请参见 图 29:
图 29. DB2 Express —— 数据类型层次结构
在进行了上面的查看之后,现在让我们将 MySQL 数据类型映射到 DB2 Express 中的等效类型(或者最匹配的类型),然后比较以下三个主要种类。
- 数字
- 字符串
- 时间和日期
关于数据库对象的异同,请参阅 表 8。
关于 DB2 SQL Limits 的完整说明,请参阅 Information Center。
备份和恢复
备份和恢复是在介质失效的情况下确保业务连续性的基本要求。MySQL 备份和恢复选项在很大程度上依赖于底层的表类型。比如 MyISAM 和 InnoDB 表类型都允许进行数据库冷备份。不过从 MySQL 4.0 版开始,还以商业附件的形式提供了 InnoDB 热备份(InnoDB 是 Oracle Corp. 的产品),但 MySQL 5.1 仍然不支持 MyISAM 的热备份。
DB2 Express 从一开始就提供了冷备份和热备份。所谓冷备份,就是当用户处于离线状态时,不访问正在备份的数据库。这就意味着,使用冷备份时,如果遇到介质失效的情况,上一次备份以后的数据将丢失。而热备份允许事务继续写入日志,无需关闭正在备份的数据库。通过适当的规划,热备份可以确保介质失效的情况下不损失数据。24x7 环境需要这种备份。
DB2 Express 有两种记录法,即循环记录法和存档记录法。循环记录法(循环写入,写满后覆盖)可以进行冷备份,档案记录法(存档已经提交的内容)支持热备份。
选择冷备份还是热备份取决于在 db config 中设置的参数:
- LOGFILSIZ —— 日志文件大小。总数为 4KB(默认 250)
- LOGPRIMARY —— 主日志个数(模认为 3)
- LOGSECOND —— 主日志填满时可以分配的次级日志个数。
- NEWLOGPATH —— 更改后续日志文件存储的位置。只在数据库重新激活时生效。
- MIRRORLOGPATH —— 写入日志的后备路径,以免单点失效。
- OVERFLOWLOGPATH —— 指定前滚操作中的日志位置,以便在多个位置访问日志。
冷备份很简单。首先关闭数据库,然后发出备份命令,如 db2 backup database <db_name> to c:\backup。
热备份同样简单。首先打开日志保留参数,然后发出命令,如 db2 backup database online <db_name> to c:\backup。
冷备份和热备份都可以通过在 DB2 Express Control Center 中点击几下鼠标来完成。另外,DB2 Express 还提供了增量备份和 delta 备份。
- 增量备份 —— 备份最近一次成功的完全备份以后的所有更改。
- Delta 备份 —— 备份上一次成功的完全备份、增量备份或 delta 备份以后的所有更改
关于备份和恢复问题,将在以后的文章进行更详细的讨论。
结束语
本文考察了 MySQL 和 DB2 Express 数据库服务器的某些方面,并从安装、系统结构(如内存和容器)、备份和恢复方法等方面进行了简单的比较。前面已经提到,本文的目的是让现在的 MySQL 数据库管理员对 DB2 Express 有一般性的了解。