【IT168 技术文章】
DB2 SQL 相关
当使用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中,对远程数据库编目的操作,首先把远程主机映射为本地节点,节点名自己指定,本例采用TCPIP连接。service_name一般定义在远程主机的/etc/services文件中。
db2 CATALOG TCPIP NODE local_node_name REMOTE hostname|ip SERVER service_name
然后把已知的远程主机的数据库映射到本地别名,注意本地别名在主机级别不能重复。节点名指定上面刚编目的节点。
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服务的用户设置以下环境变量:
D_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
用于在UNIX下迁移实例。
db2imigr instance_name
更新实例,用于实例获得一些新的产品选项或修订包的访问权。
db2iupdt instance_name
获取当前所处的实例。
db2 get instance
当更新实例级别或数据库级别的参数后,有些可以立即生效,有些需要重新启动实例才可生效。immediate 显式指明更改立即生效,deferred 显式指明更改在重起实例后生效。
当需要配置许多台客户机与DB2服务器的连接时,可以用配置助手将服务器的概要文件导出,然后在每个客户机使用配置助手导入概要文件。若客户端只安装了运行时客户端,则可以使用以下命令导入概要文件。
db2cfimp access_profile_name
疑问:是否应该由已配置好的一台客户机导出概要文件?
列出所有的数据库连接
db2 list applications
终止指定的连接句柄,事务被中断并回滚。同时操作多个句柄可以用逗号分开,或者指定关键字 all。此命令只终止指定的连接,不会阻止新的应用连接到数据库。
db2 force application (2)
创建数据库时可以指定排序方式:
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"时会报错,连接时无法转换代码页。