SMS、DMS用户表空间的特性对照
特性 SMS DMS
能够在表空间中动态的增加容器数量 n y
能够把索引数据存放到不同的表空间 n y
能够把长型(LOB)数据存放到单独的表空间 n y
表可以分散存放到多个表空间 n y
只在需要的时候才分配空间 y n
表空间可以被定向到不同类型的磁盘空间 y n
创建之后,区段大小(extent size)能够改变 n n
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
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
执行增量备份要求设置数据库配置参数“trackmod”的值为“YES”
执行在线备份要求设置数据库配置参数“logretain”的值为“YES”,在线备份语法:
db2 backup db dbname online to path