DB2支持以下两种类型的表空间:  
  1、 系统管理存储器表空间(SMS-SYSTEM   MANAGED   STORAGE)  
  2、 数据库管理存储器表空间(DMS-DATABASE   MANAGED   STORAGE)  
   
  SMS、DMS用户表空间的特性对照  
  特性                                                                       SMS                       DMS  
  能够在表空间中动态的增加容器数量                         n                     y            
  能够把索引数据存放到不同的表空间                         n                     y  
  能够把长型(LOB)数据存放到单独的表空间               n                     y        
  表可以分散存放到多个表空间                                     n                     y  
  只在需要的时候才分配空间                                         y                     n        
  表空间可以被定向到不同类型的磁盘空间                 y                     n    
  创建之后,区段大小(extent   size)能够改变       n                   n  
   
  默认表空间:  
  当创建数据库的时候,DB2将按照默认方式创建三个表空间:这些表空间缺省是SMS模式。他们是:  
  SYSCATSPACE:   包含系统编目  
  TEMPSPACE1:保存临时表  
  USERSPACE1:包含用户数据  





DB2 基本概念
  在DB2中由上至下的几个概念:
  实例(Instance),
  数据库(Database),
  表空间(TableSpace),
  容器(Container)
  在一个操作系统中,DB2数据服务可以同时运行多个实例(有别于Oracle在一个系统内只能起一个实例).
  数据库定义在实例中,一个实例可以包含多个数据库。在同一个实例中的不同数据库是完全独立的,分别拥有自己独立的系统编目表。
  表空间有2种管理方式:
  DMS(Database management Space)方式
  SMS(System manegement Space)方式
  DMS与SMS方式在表空间建立时指定,建好后不能转换。对于DMS方式,一个表空间对应了一个或多个容器(Container),容器指定了数据的物理存储位置。对于SMS方式,只能够指定一个目录,不能够增加。
  表空间具有以下类型:
  系统编目表空间(SysCatSpace)
  系统临时表空间(SysTempSpace)
  用户表空间(UserSpace)
  用户临时表空间(UserTempSpace)
  一个数据库中必须存在两个系统基本的表空间,分别是系统编目表空间与系统临时表空间。在数据库中创建的任何对象都以在系统编目表空间中增加记录的方式体现,对于临时表空间,其占用磁盘大小是根据使用情况动态伸缩的,即仅在需要时才分配磁盘空间,并在使用后进行回收。此外,若用户需要创建表,则需要创建用户表空间,若需要使用临时表,则需要创建用户临时表空间。
  容器分为三种类型:
  Files 文件
  Devices 设备
  Directory 目录
  文件与设备,用于DMS方式的表空间;
  目录,用于SMS方式的表空间,此种方式不需要人工管理数据存储文件,DB2可根据情况在目录中自动增加存储文件,只要磁盘空间允许。
  实质上,表空间是数据存储的逻辑位置定义,容器则是数据存储的物理位置定义。
  数据库的性能
  影响一个数据库的性能主要有以下因素:
  磁盘(Disk)
  内存(Memory)
  处理器(CPU)
  网络(Network)
  其中以磁盘最为显著,90%的性能瓶颈可能来自于磁盘的IO竞争;
  其次是内存,一方面是指物理内存的总量要满足需求,另一方面是指与内存相关的配置参数应正确配置;
  当然处理器的性能也很重要,多路CPU会对哪些依赖计算能力的复杂SQL查询起到显著的效果;
  网络不属于主要因素,属于客观的环境因素,是指过慢的网速会对数据的传输造成影响。以下列出一些对于提高数据库性能有效的方法:
  对于运行数据库服务的服务器可以尽可能的配置多块物理磁盘,每块的容量不必太大,这样可以有效的分担数据存储与读取操作过程的磁盘IO竞争。即采用多块小容量的磁盘在性能上要优于仅采用一块大容量的磁盘。
  如果条件允许,尽量使数据存储服务与操作系统分别运行在物理分开的磁盘上。
  采用DMS(Database Management Space)管理方式的表空间。
  在物理不同的磁盘上创建多个表空间。然后可以将数据和索引分别存放在不同的表空间,这样可以显著的提高性能。还可以把一个使用频繁的大表纵向拆成多个小表,分别存放在不同的表空间中,然后用一个视图进行联合。
  DB2服务器可以管理裸设备,即除系统以及DB2服务运行磁盘以外,为DB2数据存放单独准备磁盘,可以是多块,分区后不需要格式化,创建裸设备后直接交给DB2进行管理,用于存储数据。
  系统的临时表空间对数据库性能影响很大,当由管理的物理内存不能满足数据库操作的需要时,DB2便会把临时数据写到磁盘上,这时便用到了系统临时表空间,并且这种情况会经常发生。
  尽量在磁盘靠近最内层磁道的位置安放数据,因为此处磁盘的访问速度较快。
  与性能相关的主要参数
  DB2的参数配置分为两个级别,一个是实例级别,另一个是数据库级别。对数据服务性能影响较大的参数主要在数据库级别配置。以下是三个比较重要的内存配置参数:
  bufferpagelocklistsortheap
  bufferpage: 由同一个数据库中的所有对象共享。
  sortheap: 用于排序的内存交换区,非共享,不宜设置太大,否则,很容易引起内存耗尽,因为每一个事务都会申请独立的内存用于排序。

  locklist: 共享内存,用于记录数据服务运行中建立的锁。建议设置20Mb左右,需要时根据实际情况进行调整。DB2默认使用行级锁,如果设置太小,当锁的记录太多时,则会导致内存不足,此时DB2会把多个行锁升级为一个表锁,这样就会大大降低应用程序的并发性能。如果设置太大,则多分配的内存很少会被用到,导致浪费。

在DB2中有关实例(Instance), 数据库(Database),表空间(TableSpace),容器(Container)等概念:

其他的一些配置参数:

numdb: 同时可以启动的实例数目


DB2的常用命令:

db2ilist 列出当前系统中定义的DB2实例
daslist 列出系统中的DAS
db2 list database directory 列出当前实例中定义的数据库
db2 list tablespaces 列出当前数据库中定义的表空间
db2 list tabses [for all] 列出当前数据库中的表
db2 list active db 列出活动的数据库

db2 get dbm config
get db cfg for databasename
db2 update db cfg for databasename using bufferpage 600M
db2 alter bufferpool IABMDEFAULTBP size =1
db2 list applications show detail

以上命令可以在后面加 " show detail" 参数,显示详细信息。


DB2数据存储的页大小只能在表空间级别统一指定(区别于Oracle,可以定义在表级别), 并且建好后不能修改。

可以手工建立一个页大小为4K的DMS用户临时表空间,然后把系统默认的SMS系统临时表空间删除。为满足应用需求,一般还应再建立一个页大小在8K以上的用户临时表空间。

DB2 UDB V8.1 对RedHat Linux 9 的支持不好,默认情况下无法启动GUI安装程序(可以通过设置环境LD_ASSUME_KERNEL=2.2.5解决),并且不会安装Sample数据库,控制中心也无法正常启动。


当使用COUNT()函数时,如果表中的记录数 > 2 147 483 647行,则函数可能返回错误的结果,这时可以使用返回类型为DECIMAL(31, 0)的COUNT_BIG()函数。

DISTINCT 关键字可以用在COUNT()函数中,如:SELECT COUNT(DISTINCT id) FROM TABLE,这代表将不对id列的重复值进行计数。

ORDER BY子句后面如果写了多个列名,需要分别指定升序或是降序。

可以在load大量数据时,暂时关闭表的日志选项。使用:ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY

DB2的几个特殊寄存器:CURRENT DATE, CURRENT TIME, CURRENT TIMESTAMP, USER(用户ID).

有关日期的操作:CURRENT TIMESTAMP + 2 DAYS(or HOURS, SECONDS, MONTHS, YEARS, etc.)

case 语句的使用:case when 条件一 then 动作一 else 动作二 end; 可以欠套使用。

在视图的创建语句中无法使用order by 子句与 fetch n rows 子句。但对于order by可以用如下方法替代实现,不过会影响效率。

create view v_name1(c1, c2, c3) as 
  
select * from ( 
  
select column1, column2, column3 
  
from t1 
  
order by column1 ) as t1;


表空间类型分为SMS和DMS,分别是system management space, database management space. SMS使用方便,简单,无需手工创建和维护数据存储文件。DMS需要手动指定container和存储数据的文件名,并保证有足够磁盘空间可用。
对于一个数据库,至少存在一个page size为4K的系统临时表空间,可以额外建立具有更大page size的用户临时表空间,系统会自动进行使用。

无法用alter语句更改一个字段的数据类型,对某些字段可以更改数据长度,这一点上相对于Oracle,DB2的限制要多一些。
可以使用: select 表达式 from sysibm.sysdummy; 替代的,以下语句是等价的:values 表达式;


表和视图的创建、更新、删除操作,都写日志,因此可以commit或rollback。

在update语句中,如果没有对定义了默认值的某个字段显式赋值,则更新时,此字段不会重新执行默认值中定义的表达式。为了让其重新执行默认值定义的表达式,可以采用以下方式:

create table t1 (c1 varchar(32), lastupdatetime with default current timpstamp); 
  
update t1 set c1 = 'new string', lastupdatetime = default;



对于DB2数据库可以在创建时指定codepage参数,创建后不可修改。当应用程序访问数据库时,DB2会比较两者的codepage是否一致,不一致则进行代码页的自动转换。为了减少转换所带来的开销,应尽量保证应用程序所采用的代码页与数据库一致。

可以对DB2 CLP工具的codepage进行设置,使用:db2set DB2CODEPAGE= 1386,本例中设置的是中文GBK字符集在Windows平台对应的值。注意,这个数字值是由DB2自己定义的。有关各种字符集在相应平台所对应的代码页值可在IBM网站查找。

在DB2 CLP中,对远程数据库编目的操作:
DB2 CATALOG TCPIP NODE local_node_name REMOTE hostname|ip SERVER service_name 首先把远程主机映射为本地节点,节点名自己指定,本例采用TCPIP连接。service_name一般定义在远程主机的/etc/services文件中。
DB2 CATALOG DATABASE db_name AS local_alias AT local_node_name USER username USING password 然后把已知的远程主机的数据库映射到本地别名,注意本地别名在主机级别不能重复。节点名指定上面刚编目的节点。
DB2 CONNECT TO local_alias USER username USING password 用刚才编目中定义的别名连接远程主机数据库
DB2 GET CONFIGURATION SHOW DETAIL 获取数据库详细配置信息

对于DB2返回的错误号,可以用以下方法查阅说明(以sql 10008为例):
db2 ? sql10008


数据库的备份与恢复:

使用备份与恢复工具可以完成在不同的服务器见完整的转移数据库的工作,命令行方式如下:

备份
DB2 BACKUP DATABASE db_name USER user_name USING password to backup_dir_name
DB2 BACKUP DATABASE dlhdb USER dlh USING admindlh TO d:\backups

恢复
DB2 RESTORE DATABASE source_db_name USER user_name USING password FROM backup_dir_name TAKEN AT backup_file_create_time TO driver_letter INTO new_db_name
DB2 RESTORE DATABASE dlhdb USER dlh USING admindlh FROM d:\backups TAKEN AT 20031209141056 TO d: INTO newdb

有关实例的操作:
设置默认实例环境变量
DB2 SET DB2INSTANCE=inst_name
启动当前实例
DB2START
停止当前实例
DB2STOP [FORCE]
连接到某个实例
DB2 ATTACH TO ANSTANCE inst_name
获取实例的配置参数
DB2 GET DBM CFG SHOW DETAIL


导出数据库完整的定义到脚本文件,包括表,视图,函数,数据库参数等
db2look -d sample(数据库) -a -e -l -x -m -f -o(参数)samplesql.out(输出文件)


load 一个表的数据时,有可能导致表空间处于backup pending(0x0020)状态。比如把整形数据load到double型的字段中。
处于backup pending状态的表空间不能被访问。
可以通过对此表空间运行一次backup操作,恢复到正常状态(0x0)。

对于自增字段,可以通过两种方式指定:
generated by default as identity
generated always as identity
区别是,第一种方式在插入数据时允许手工指定自增字段的值,只要不重复即可,并且数据库会自动设置下一个值;
第二种方式则不允许指定,只能由数据库自动分配并插入。


DB2 sql语句中转义符的使用:
select * from t1 where a like '%abc\%def' escape '\';

创建数据库时,出现SQL1043C错误,可能的问题:
指定容器所在的磁盘空间不足,
当容器为file类型时,后面的long-num参数不对,比如25600代表256Mb,但如果指定256则会导致以上错误。


平台 RH Linux 8
DB2 UDB v8.1
在WAS 5中建立到db2的数据源,但连接失败,返回以下错误:
[Servlet Error]-[SQLConnect]: java.lang.UnsatisfiedLinkError: SQLConnect
原因是没有为运行was服务的用户设置以下环境变量:
LD_LIBRARY_PATH
LIBPATH
DB2INSTANCE
...
以上环境变量定义在 $INSTHOME/sqllib/db2profile文件中,可以采用的解决方案:
sh stopServer.sh servername
. $INSTHOME/sqllib/db2profile
sh startServer.sh servername
也可以把db2profile放到was启动脚本中首先执行。

如果只设置了LD_LIBRARY_PATH,LIBPATH两个环境变量,DB2会返回以下错误:
CLI0600E Invalid connection handle or connection is closed.
SQLSTATE S1000


对应于Oracle的Job包功能,DB2通过一个GUI工具-任务中心(task center)实现。使用任务中心前需要进行必要的工具设置,需要创建一些数据库对象,可以创建在已有的一个数据库中,也可以单独创建一个数据库。通过以下命令实现:
create catalog tools schema_name create new database db_name
此命令为编目工具创建一个名为db_name 的数据库,并指定了一个模式名。
注意:无法用using 子句指定一个codeset,系统会默认使用ISO8859-1字符集。


Quest Center for DB2带有数据库性能诊断功能,动态监视db内存,磁盘io, 表空间,负载等等。

DB2客户端的类型:
DB2运行时客户端 DB2 Runtime Client
DB2管理客户端 DB2 Administrator Client(包含运行时客户端的所有内容)
DB2应用程序开发客户端 DB2 Application Development Client(包含管理客户端的所有内容)
DB2瘦客户端 DB2 Thin Client

DB2 Relational Connect 联邦数据库,用于连接异种数据库。

db2idrop -f instance_name 强制断开已有连接,停止实例并删除。
db2imigr instance_name 用于在UNIX下迁移实例。
db2iupdt instance_name 更新实例,用于实例获得一些新的产品选项或修订包的访问权。
db2 get instance 获取当前所处的实例。

当更新实例级别或数据库级别的参数后,有些可以立即生效,有些需要重新启动实例才可生效。immediate 显式指明更改立即生效,deferred 显式指明更改在重起实例后生效。


当需要配置许多台客户机与DB2服务器的连接时,可以用配置助手将服务器的概要文件导出,然后在每个客户机使用配置助手导入概要文件。若客户端只安装了运行时客户端,则可以使用
db2cfimp access_profile_name
导入概要文件。
疑问:是否应该由已配置好的一台客户机导出概要文件?

db2 list applications 列出所有的数据库连接
db2 force application (2) 终止指定的连接句柄,事务被中断并回滚。同时操作多个句柄可以用逗号分开,或者指定关键字 all。此命令只终止指定的连接,不会阻止新的应用连接到数据库。


创建数据库时可以指定排序方式:collate using identity

系统模式集是和每个数据库一起创建的,并且它们被放置到 SYSCATSPACE 表空间中:
SYSIBM:
基本系统目录
建议不要进行直接访问
SYSCAT:
PUBLIC 被授予该模式的 SELECT 权限
对只读视图编目
这是获取目录信息的推荐方式
SYSSTAT:
可更新的目录视图 - 影响优化器
SYSFUN:
用户定义的函数

如果表中的现有行不满足约束,则不能定义该约束。可以关闭约束检查以加快大量数据的添加,但是该表处于检查暂挂(CHECK PENDING)状态。


在创建表时,可以使用选项来指定一个或多个表空间,表和索引将被放置到其中:

CREATE TABLE TEST ( 
  
column 1 definition, column 2 definition, ... 
  
) IN <tablespace name> INDEX IN <index space name>

这条命令为您提供了一个选项:指定创建表和索引的位置。如果没有指定单独的索引表空间,那么将在表所在的同一表空间中创建索引。创建表之后,就没有机会在不同的表空间中创建索引了。创建索引要提前作规划!

CREATE <UNIQUE> INDEX <index name> ON <table name> 
  
( 
  
column 1 <ASC | DESC> , 
  
column 2 <ASC | DESC> ... 
  
)


UNIQUE 属性告诉 DB2,索引必须强制所有插入值的唯一性。
如果结果集是以升序和降序两种方式排序的,ALLOW REVERSE SCANS 会告诉 DB2 在索引中包括附加的指针,以允许在记录中有效地进行正向和反向链接。

DB2 能够向正在创建的索引中添加另外的列。CREATE INDEX 命令允许用户指定那些不属于实际索引但因为性能原因而保存在索引记录中的列。
CREATE UNIQUE INDEX ON EMPLOYEE (EMPNO) INCLUDE (LASTNAME,FIRSTNAME)
对于索引中包含的列而言,索引必须是 UNIQUE 的。当创建索引时,另外的列被添加到索引值中。索引不使用这些值进行排序或确定唯一性,但可以在满足 SQL 查询时使用它们。例如,下列 SELECT 语句将不需要读取实际数据行:
SELECT LASTNAME, FIRSTNAME FROM EMPLOYEE WHERE EMPNO < '000300'

要在表上创建群集索引,将 CLUSTER 关键字附加到 CREATE INDEX 命令的末尾,例如:
CREATE INDEX DEPTS-IX ON EMPLOYEE(WORKDEPT) CLUSTER

使用下列通用规则来决定为表定义的索引的经典数量。索引数量取决于数据库的主要用途:
对于在线事务处理(OLTP)环境,创建一到两个索引。
对于混合查询和 OLTP 环境,创建两到五个索引。
对于只读查询环境,创建五个以上索引。


在Windows平台上的DB2的命令行模式下,或者在类Unix平台下,使用命令db2cc启动控制中心。

db2move提供了在数据库之间批量移动数据的能力,可以指定某个表,也可以指定整个数据库的表。
db2move dbname action

action 可以指定为:export, import或者load
使用 -l 参数指定lob对象存储的文件夹


执行增量备份要求设置数据库配置参数“trackmod”的值为“YES”
执行在线备份要求设置数据库配置参数“logretain”的值为“YES”,在线备份语法:
db2 backup db dbname online to path


当删除了das用户的home目录,未先drop掉das服务,则再执行dasdrop则不成功,提示:
db2admin 命令无法找到,原因是db2admin命令保存在das的home目录中。
可以删除干净das用户的home目录后,重起服务器解决此问题。

dasupdt dasName 升级das
db2iupdt instName 升级实例
db2licd end 停止许可证守护进程

在Linux系统安装DB2 V8.1后,db2fmcd进程会自动启动,即使不启动实例和DAS,

在中文Linux环境下安装了DB2数据库服务,并使用GBK代码页(codepage)创建了一个数据库,完成后可以正常连接操作,若更改操作系统代码页为英语,则使用“db2 connect”时会报错,连接时无法转换代码页