下图描述了DB2的进程模型,长方形代表处理进程,椭圆形代表处理线程,DB2的主进程是db2sysc,在这个处理进程下有许多线程,最主要的线程也是叫db2sysc,这个主要的线程派生了其他子线程。当一个远程的应用程序比如采用sql connect语句链接服务器时,通讯协议的远程监听器将接收这个请求,并联系db2agent,agent是一个代表DB2实现一些小操作的处理程序,当发出请求的应用程序是本地的,也就是和DB2服务器在同一服务器上,如果不在同一个服务器上,那么采用db2tcpcm处理本地请求,如果在一台服务器上采用db2ipccm线程来处理请求。如果发生本地和异地并行的情况,db2agent会生成其他线程的代理db2agntp线程。其他的线程如db2pfchr、db2loggr、db2dlock它们应用到不同的目的。
DB2 DB2 9.5 进程信息:
db2sysc (Linux)
db2syscs (Win)
DB2的主系统控制器或者引擎,对于一个完整的分区其中只有一个包含多线程的主引擎进程。所有的引擎可以分派单元都是进程中的线程。没有这个进程数据库服务器是无法工作的。
db2acd:
主管运行状况监视器和自动维护实用程序的自主计算守护程序。此进程以前称为db2hmon
Db2wdong:
DB2的看门狗,是db2sysc的父进程。如果db2sysc集成非正常终止,它将清除所占用的资源。
Db2vend:
在主进程之外的围栏进程,所有db29.5的第三方代码都在这个进程中运行。
Db2fmp:
围栏进程,在防火墙外运行用户的存储程序和用户定义函数代码。此进程代替了db2老版本中的db2udf和db2dari进程。
DB2V9.5的线程信息:
Db2sysc:系统控制线程。负责实例的启动关闭和管理正在运行的实例。
Db2tcpcm:tcoip交互监听器
Db2agent:协调代理代表应用程序实现数据库操作
Db2agntp:如果intra-parallel的属性是yes,那么会产生活动的副代理。它会为应用程序执行数据库操作。Dbagent将协调不同的db2agntp副代理的工作。
Db2pfchr:db2异步io数据读取
Db2pclnr:db2异步io数据写入
Db2内存模型由不同区域构成,这里的内存是存在于实例层、数据库层、应用程序和代理层中的内存。
当一个实例启动后,系统就为数据库管理器分配共享的内存。这需要花费很大的空间。当第一次连接数据库时,就会分配数据库全局内存database global memory。在此内存块中,缓冲池是最重要的一个部分,尤其体现在改善系统查询的操作时。缓冲池的大小决定整个DGM的大小。每个代理可以使用大约3-5M内存,在没有连接集中器的情况下,几个链接可以使用一个代理。连接集中器一般可以理解为JDBC
Db2存储模型
数据页和扩展数据块:页是在db2中的最小存储单元。数据页大小允许为4k、8k、16k、32k。扩展数据块是一组数据页。由于每次处理一页会影响数据库的性能,所以db2以扩展数据块为单位进行处理。页大小和扩展数据块大小在使用缓冲池和表空间的时候定义。
缓冲池:是表和索引数据在内存中的缓存。减少持续直接的io存取,提供异步读取和写入来提高系统的性能。也就是说db2预测那些需要用到的数据页,然后再使用它们之前预先将它们读取到缓冲池。每个数据库至少需要一个缓冲池,而且对于每个表空间,至少必须存在一个符合制定大小的缓冲池。
Non-blocked和blocked区域表示数据页以块或者非块存在的数目。基于块的缓冲池保证硬盘上连续的移动块区域中,能够提高性能,页面数必须小于98%的缓冲池页面数目。
表空间:处于逻辑的数据表和系统物理内存缓冲池以及硬盘之间的逻辑接口。用create tablespace语句创建一个表空间,创建时制定如下的参数:页大小,缓冲池名称,扩展的大小,读取的大小。
表空间有三种
1、 常规表空间:用于用户的数据表,比如默认创建的userspace1
2、 大型表空间:可以作为原有数据表中分离lob数据的可选表空间。如果创建时指明purexml的支持,它也可以作为存储xml数据,在这种情况下,大型表空间是默认的表空间。
3、 临时表空间:系统临时和用户临时,系统临时用于db2的内存操作,比如排序比如tempspace,用户临时用于创建用户定义全局临时表,内存中的临时表。
表空间的管理有几种方式:
1、 系统管理,也成为system managed storage表空间,也就是SMS。由操作系统来管理。表空间使用的是操作系统文件系统的文件夹,存储空间不是预先分配的,但是表空间文件能够动态增长,当指定了容器后,它就在创建表空间时固定,以后不能再添加其他表空间容器,除非使用转向存储。
2、 由数据库管理,也叫数据库管理存储(DMS),它由db2来管理表空间的存储。这种表空间的管理需要数据库管理员的人工干预,能够预先分配容器或者裸设备。使用裸设备时,数据是直接写入到设备中而没有使用io缓存。这种管理方式能够增加、删除改变容器,性能好。
3、 自动存储管理,具备sms的自主管理特点又具备DMS的灵活性和高性能表现。所以从DB2V9.5开始这是默认的表空间类型。使用这种类型,用户首先指明一个逻辑存储设备组,不需要指明容器,容器在存储路径中自动创建。
数据是怎么存储在表空间的?
默认情况下,也就是自动存储管理,DB2每次写入到硬盘都会跨越若干个容器,例如,使用4K大小的dms表空间,扩展数据块页数为8,使用3个容器。这就是说,在写入下一个容器之前,会将32K数据(4k×8页/扩展块=32K)。
DB2目录也就是常见的DB2编目,它显示了所有您可以连接到的本地和远程数据库。对于本地数据库,将会有一个指针指向这个本地数据库目录。对于远程数据库,它将有一个指向结点目录。使用以下命令查看目录内容:
C:/IBM/SQLLIB/BIN>db2 list db directory
系统数据库目录
目录中的条目数 = 6
数据库 1 条目:
数据库别名 = EXPRESS2
数据库名称 = EXPRESS2
本地数据库目录 = C:
数据库发行版级别 = c.00
注释 =
目录条目类型 = 间接
目录数据库分区号 = 0
备用服务器主机名 =
备用服务器端口号 =
数据库 2 条目:
数据库别名 = TARGET
数据库名称 = TARGET
本地数据库目录 = C:
数据库发行版级别 = c.00
注释 = q复制目标数据库
目录条目类型 = 间接
目录数据库分区号 = 0
备用服务器主机名 =
备用服务器端口号 =
数据库 3 条目:
数据库别名 = EXPRESS
数据库名称 = EXPRESS
本地数据库目录 = C:
数据库发行版级别 = c.00
注释 =
目录条目类型 = 间接
目录数据库分区号 = 0
备用服务器主机名 =
备用服务器端口号 =
数据库 4 条目:
数据库别名 = GSDB
数据库名称 = GSDB
本地数据库目录 = C:
数据库发行版级别 = c.00
注释 = Version 2.1 for DSA2.1
目录条目类型 = 间接
目录数据库分区号 = 0
备用服务器主机名 =
备用服务器端口号 =
数据库 5 条目:
数据库别名 = NEWDB
数据库名称 = NEWDB
本地数据库目录 = C:
数据库发行版级别 = c.00
注释 =
目录条目类型 = 间接
目录数据库分区号 = 0
备用服务器主机名 =
备用服务器端口号 =
数据库 6 条目:
数据库别名 = SAMPLE
数据库名称 = SAMPLE
本地数据库目录 = C:
数据库发行版级别 = c.00
注释 =
目录条目类型 = 间接
目录数据库分区号 = 0
备用服务器主机名 =
备用服务器端口号 =
节点目录,node directory
这个目录包含的信息是关于如何连接到一个给定的数据库。例如,如果使用的是TCP一个TCP节点项将包含您试图连接的DB2数据库所在服务器的IP地址。
C:/IBM/SQLLIB/BIN>db2 list node directory
SQL1037W 节点目录为空。 SQLSTATE=01606
配置助手很容易,一般需要关注的是服务器端的两处设置:DB2COMM和SVCENAME。
Schema 模式
模式是一组数据库对象的命名空间。可以理解为定义、范式等。它主要用于提供对象所有权的标识或某个应用的关系。以及,合理将相关对象组合在一起。
所有DB数据库对象标识名都有可以一分为二,模式就是此名字的前半部分。
模式名.对象名
Db2支持的数据类型:
大对象数据类型LOB:
二进制大对象是BLOB,字符大对象CLOB,双字节字符大对象DBCLOB
用户定义类型:DB2允许使用自己的数据类型,称为UDT,UDT一般用在以下情况:
1、 需要为值建立上下文
2、 需要使DB2执行的数据类型
系统目录表:
1、 SYSIBM:基本表,对DB2使用进行最优化
2、 SYSCAT:基于SYSIBM表的视图,对平常轻浮和进行优化。
3、 SYSSTAT:数据库分析
视图是表中多个数据的一次描述。视图中的数据不是单独存储在一起的,但当视图被调用的就可以被获得。嵌套视图是基于其他视图创建的视图,所有有关视图的信息保存在DB2的目录视图中:SYSCAT.VIEWS,SYSCAT.VIEWDEP和SYSCAT.TABLES
一些列在一起可以用作索引,这种索引一般称为混合索引。
数据迁移工具
使用EXPORT工具可以将数据库中的表导出为文件,文件格式可以是:
1、 ASC = ASCII 文本格式
2、 DEL = Delimited ASCII 文本格式
3、 WSF = Worksheet 可以迁移到电子表格软件中,如Excel和Lotus1-2-3
4、 IXF = integrated exchange format 包括了数据表的数据描述语言DDL和里面的数据。利用IXF格式可以重建数据表,而其他格式没法办到。
当导出到文件后,使用import可以将数据由文件导入到数据表中,如果使用ASC,DEL,WSF格式的文件作为中间文件,在它们导入之前数据表必须存在。而使用IXF格式的文件在导入前不需要存在相应的数据表。将数据导入到表的另外一种方法就是使用load语句。
Load比import快,因为不与DB2数据引擎交互而直接操作数据库页面。
Load不会检查数据的约束,也不会引发触发器,为了保证load后的数据一致性,在使用load后通常会运行set integrity命令
EXPORT TO employee.ixf OF IXF
SELECT * FROM employee
FETCH FIRST 10 ROWS ONLY
------------------------------ 输入的命令 ------------------------------
connect to SAMPLE user xujm using ********;
------------------------------------------------------------------------------
connect to SAMPLE user xujm using
数据库连接信息
数据库服务器 = DB2/NT 9.5.2
SQL 授权标识 = XUJM
本地数据库别名 = SAMPLE
与目标的 JDBC 连接已成功。
------------------------------ 输入的命令 ------------------------------
EXPORT TO employee.ixf OF IXF
SELECT * FROM employee
FETCH FIRST 10 ROWS ONLY;
------------------------------------------------------------------------------
EXPORT TO employee.ixf OF IXF SELECT * FROM employee FETCH FIRST 10 ROWS ONLY
SQL3104N EXPORT 实用程序 正在开始将数据导出至文件 "employee.ixf"。
SQL3105N Export 实用程序已经完成导出 "10" 行。
导出的行数:10
DB2MOV命令不可以通过控制中心来调用。
案例:Linux上的DB2服务器的一个数据库克隆到windows平台的DB2服务器上
1、 在Linux的DB2上运行DB2LOOK,得到数据库的结构并将这个结构存储在脚本文件中。然后将这个脚本文件copy到windows平台的DB2服务器上运行,运行后得到一个克隆的数据库。这一步完成后,windows和Linux上的DB2数据库有了相同的结构。
2、 在DB2的Linux上运行带export选项的db2move工具,并将所产生的所有文件拷贝到DB2 windows服务器上,再次运行db2move工具,利用import或load选项将所有的文件导入到克隆的数据库中,执行完毕后,这2个数据库就一模一样了。
C:/IBM/SQLLIB/BIN>db2 connect to sample
数据库连接信息
数据库服务器 = DB2/NT 9.5.2
SQL 授权标识 = XUJM
本地数据库别名 = SAMPLE
C:/IBM/SQLLIB/BIN>db2cc
C:/IBM/SQLLIB/BIN>db2look -d sample -l -e -o sample.ddl
-- USER 是: XUJM
-- 正在创建表的 DDL
-- 输出被发送到文件: sample.ddl
-- 正在自动绑定程序包 ...
-- 绑定成功
-- 正在自动绑定程序包 ...
-- 绑定成功
如果在同一个操作系统环境下,使用备份和恢复命令。
db2look -d EXPRESS -t "BOOKS" "CUSTOMERS" "SALES" -z XUJM -u XUJM -e -l -x -c ;
-- 此 CLP 文件是使用 DB2LOOK 版本 "9.5" 创建的
-- 时间戳记: 2009-4-18 23:24:07
-- 数据库名称: EXPRESS
-- 数据库管理器版本: DB2/NT Version 9.5.2
-- 数据库代码页: 1208
-- 数据库整理顺序为: IDENTITY
触发器、函数、过程的结尾都使用了一个特殊字符@。@是为了区分create 语句和在这些对象中的过程性语句。
脱机备份sample到C:
CONNECT TO SAMPLE;
QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS;
CONNECT RESET;
BACKUP DATABASE SAMPLE TO "C:/" WITH 2 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING;
CONNECT TO SAMPLE;
UNQUIESCE DATABASE;
CONNECT RESET;
命令成功完成。
说明:
此命令的执行期间没有遇到错误。
用户响应:
不需要执行任何操作。
联机备份:
BACKUP DATABASE SAMPLE ONLINE TO "C:/" WITH 2 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING;
备份与恢复:
如上采用日志记录数据库时发生的情况。
DB2有三个主要的维护任务,重组reorg、运行统计runstats、重绑定rebind
Reorg命令。伴随着时间流逝,您不断在数据库上执行update、delete和insert等操作,您的数据在数据库页之间变得越来越破碎。Reorg命令回收浪费的空间并重新组织数据,从而获得更高的运行效率,被频繁修改的表能从reorg命令中获得最大的利益。您可以R重组索引,改命令在离线和在线都可以执行,离线reorg更快但不允许访问数据表,而在线的reorg命令允许对表的访问,但会消耗大量系统资源,这对小表很有利。
重组
CONNECT TO SAMPLE;
REORG TABLE XUJM.CUSTOMER INPLACE ALLOW WRITE ACCESS START ;
CONNECT RESET;
运行统计
CONNECT TO SAMPLE;
RUNSTATS ON TABLE XUJM.CUSTOMER ON ALL COLUMNS ALLOW WRITE ACCESS ;
COMMIT WORK;
CONNECT RESET;
重组完整性
CONNECT TO SAMPLE;
SET INTEGRITY FOR XUJM.CUSTOMER ALLOW NO ACCESS IMMEDIATE CHECKED;
CONNECT RESET;
并行与锁定
锁定越多,并行的可能性就越小。反之,锁定越少,并行的可能性越大。
锁定会需要一个事务时被自动获取,在事务终止时被释放,使用一条commit或rollback。锁定可以针对行或列。
锁定有2种。
1、 共享锁,S锁定:当程序企图读并且其他程序修改同一行时被获取的锁定。
2、 互斥锁定,X锁定:当一个程序修改,插入或删除被获取。
当优化器认为一次锁定整个表格比锁定多个更好的时候,就出现了锁定升级。
有2个数据库配置参数与锁定升级有关:
Locklist-预留存储空间的数量,该空间用于管理所有连接的进程的锁定。
Maxlocks-单个程序在整个锁定列表中可以占用的最大比例,默认22%
通过查看db2diag.log文件,可以在SQLLIB/DB2中查看用于检测锁定升级的发生情况。
C:/IBM/SQLLIB/BIN>db2 update monitor switches using lock on
DB20000I UPDATE MONITOR SWITCHES 命令成功完成。
我来导演一个死锁:使用sample数据库
1、 开2个CLP
2、 1号CLP:db2 +c update employee set firstnme = 'Mary' where empno = '000050’
3、 2号CLP:db2 +c update employee set firstnme = 'Tom' where empno = '000030'
4、 1号CLP:db2 +c select firstnme from employee where empno = '000030' 这一步执行完毕,看起来挂起了,其实没有挂起,在等待2号CLP在步骤3中对这一行的释放。如果这里locktimeout是默认-1,那么CLP1就会永远等待下去。
5、 2号CLP:db2 +c select firstnme from employee where empno = '000050'
1号:
C:/IBM/SQLLIB/BIN>db2 connect to sample
数据库连接信息
数据库服务器 = DB2/NT 9.5.2
SQL 授权标识 = XUJM
本地数据库别名 = SAMPLE
C:/IBM/SQLLIB/BIN>db2 +c update employee set firstnme = 'Mary' where empno = '00
0050'
DB20000I SQL 命令成功完成。
C:/IBM/SQLLIB/BIN>db2 +c select firstnme from employee where empno = '000030'
FIRSTNME
------------
SALLY
1 条记录已选择。
C:/IBM/SQLLIB/BIN>
2号CLP:
C:/IBM/SQLLIB/BIN>db2 connect to sample
数据库连接信息
数据库服务器 = DB2/NT 9.5.2
SQL 授权标识 = XUJM
本地数据库别名 = SAMPLE
C:/IBM/SQLLIB/BIN>db2 +c update employee set firstnme = 'Tom' where empno = '000
030'
DB20000I SQL 命令成功完成。
C:/IBM/SQLLIB/BIN>db2 +c select firstnme from employee where empno = '000050'
SQL0911N 因为死锁或超时,所以当前事务已回滚。原因码为 "2"。 SQLSTATE=40001
C:/IBM/SQLLIB/BIN>
避免死锁的建议:
1、 使事务尽可能的短小,可以多使用commit来实现。
2、 只有必要的时候才记录事务信息
3、 快速清理数据:ALTER TABLE ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE
4、 成批量的修改数据:DELETE FROM ( SELECT * FROM tedwas.t1 WHERE c1 = !- FETCH FIRST 3000 ROWS ONLY)
5、 利用DB2的转移工具中的并行特性。
6、 设置数据库的locktimeout参数时间,建议在30秒,不要为-1默认值。
7、 不要检索不需要的数据库,在select中使用fetch first n rows only子句。
存储过程
存储过程是一个可以封装SQL语句和业务逻辑的数据库应用对象。应用程序和数据库的大量交互会产生网络堵塞,而将应用逻辑的一部分保存在数据库中会使交互造成网络堵塞减少。另外,存储过程提供一个集中的位置存储代码,因此其他应用可以重用相同的程序。
安全性方面,存储过程可以让DBA限制用户只能通过存储过程来访问表和视图,这样可以锁定数据库而防止用户存取无权操作的那部分数据。用户通过存储过程存取数据表或者视图的时候不需要显式的赋予权限,而只需要得到运行存储过程的权限。
CREATE PROCEDURE MYPROCEDURE ( )
DYNAMIC RESULT SETS 1
------------------------------------------------------------------------
-- SQL 存储过程
------------------------------------------------------------------------
P1: BEGIN
-- 声明游标
DECLARE cursor1 CURSOR WITH RETURN FOR
SELECT PROCSCHEMA, PROCNAME FROM SYSCAT.PROCEDURES;
-- 游标对客户机应用程序保持打开
OPEN cursor1;
END P1
调试存储过程中,SQLCODE是RDBMS特有的,比SQLSTATE更具体,SQLSTATE在各个数据库中是相同的标准,但比较笼统。通常几个SQLCODE可能对应一个SQLSTATE。任何SQL语句都有一个状态,这个状态和SQLSTATE匹配。
C:/IBM/SQLLIB/BIN>db2 connect to sample
数据库连接信息
数据库服务器 = DB2/NT 9.5.2
SQL 授权标识 = XUJM
本地数据库别名 = SAMPLE
C:/IBM/SQLLIB/BIN>db2 insert into cl_sched (class_code,day,starting) values ('ab
c',1,current time)
DB20000I SQL 命令成功完成。
C:/IBM/SQLLIB/BIN>db2 select * from cl_sched
CLASS_CODE DAY STARTING ENDING
---------- ------ -------- --------
042:BF 4 12:10:00 14:00:00
553:MJA 1 10:30:00 11:00:00
543:CWM 3 09:10:00 10:30:00
778:RES 2 12:10:00 14:00:00
044:HD 3 17:12:30 18:00:00
abc 1 01:00:22 -
6 条记录已选择。
CONNECT TO SAMPLE;
CREATE TABLE XUJM.SALESLOG ( USERID VARCHAR (128) NOT NULL , DAYTIME TIMESTAMP NOT NULL ) ;
COMMENT ON TABLE XUJM.SALESLOG IS '触发器开发';
CONNECT RESET;
-- This script has been created using ^ as the termination character.
-- If you wish to execute this script through the CLP, you will need
-- to add the CLP option -td"^" to your command line, for example:
-- db2 -td"^" -f filename.ddl
CONNECT TO EXPRESS^
CREATE TRIGGER XUJM."AUDIT" AFTER UPDATE ON XUJM.SALES FOR EACH STATEMENT MODE DB2SQL
WHEN ( 1=1 )
BEGIN ATOMIC
insert into saleslog(userid,daytime) values(current user,current timestamp);
END^
COMMENT ON TRIGGER XUJM."AUDIT" IS '记录sales表的所有更新'^
CONNECT RESET^
PureXML
XML数据库有2种类型,分别是:启用XML的数据库和原生的XML数据库
启用XML的数据库:
使用关系模型作为核心数据,需要在XML(层次型)数据模型和关系模型中建立映射,或者把XML数据存储为字符大对象,尽管显得这个技术比较陈旧,很多数据库都是这个方式。
上图描述了启用XML的数据库的2种存储XML的方式。
左边:使用字符大对象爱那个和变长字符存储XML,把XML存储为未经过解析的字符串,如果XML以这种方式存储,那么要获取部分内容就必须获取整个字符串才能完成解析。这种方式缺少灵活性。
右边:把XML文档分为存储在数据表中的小块。通过这种方法,XML层次型被转化为关系型。非常灵活,XML文档的一处改动不能让人满意,当您需要取回原始XML文档,您必须执行代价可观的SQL操作,牵扯到更多的表时,这个代价将更加惊人。
原生XML数据库
在内部使用层次数据模型存储,处理XML数据。存储格式与处理格式一致。
DB2V9.1和DB2V9.5的区别:V9.1pureXML仅支持unicode数据库,V9.5解除了这个限制,无论是否unicode都可以支持。