DB2数据库的简单介绍和用法,编程序技巧

  DB2 是IBM一种分布式 数据库 解决方案。说简单点: DB 2就是IBM开发的一种大型关系型数据库平台.它支持多用户或应用 程序 在同一条 SQL 语句中查询不同 database 甚至不同 DBMS 中的数据。目前,DB2有如下一些版本:(比如DB2 for Unix,DB2 for Windows,DB2 for AS /400,DB2 for OS /390等)

  DB2是IBM公司开发的关系数据库管理系统,它有多种不同的版本,如:DB2工作组版(DB2Workgroup Edition)、DB2企业版(DB2 Enterprise Edition)、DB2个人版(DB2 Personal Edition)和DB2企业扩展版(DB2 Enterprise-Exended Edition)等,这些产品基本的数据管理功能是一样的,区别在于支持远程客户能力和分布式处理能力。

  个人版适用于单机使用,即服务器只能由本地应用程序访问。工作组版和企业版提供了本地和远程客户访问DB2的功能(当然远程客户要安装相应客户应用程序开发部件),企业版包括工作组版中的所有部件外再增加对主机连接的支持。企业扩展版允许将一个大的数据库分布到同一类型的多个不同计算机上,这种分布式功能尤其适用于大型数据库的处理。

  DB2可运行在OS/2、Windows NT、UNIX操作系统上,通常将运行在这些平台上的DB2产品统称为DB2通用数据库,这主要是强调这些产品运行环境类似,并共享相同的源代码。DB2通用数据库主要组件包括数据库引擎(Dalabase Engine )应用程序接口和一组工具。数据库引擎提供了关系数据库管理系统的基本功能,如管理数据、控制数据的访问(包括并发控制)、保证数据完整性及数据安全。所有数据访问都通过SQL接口进行。

db2起源于system r和system r*。他支持从pc到unix,从中小型机到大型机;从ibm到非ibm(hp及sun unix系统等)各种操作平台。他既可以在主机上以主/从方式独立运行,也可以在客户/服务器环境中运行。其中服务
平台可以是os/400,aix,os/2,hp-unix,sun-solaris等操作系统,客户机平台可以是os/2或windows, dos, aix, hp-ux, sun solaris等操作系统。

一、db2核心数据库的特色

  db2数据库核心又称作db2公共服务器,采用多进程多线索体系结构,可以运行于多种操作系统之上,并分别根据相应平台环境作了调整和优化,以便能够达到较好的性能。

(1) 支持面向对象的编程

  db2支持复杂的数据结构,如无结构文本对象,可以对无结构文本对象进行布尔匹配、最接近匹配和任意匹配等搜索。可以建立用户数据类型和用户自定义函数。

(2) 支持多媒体应用程序

  db2支持大二分对象(blob),允许在数据库中存取二进制大对象和文本大对象。其中,二进制大对象可以用来存储多媒体对象。

(3) 备份和恢复能力

(4) 支持存储过程和触发器,用户可以在建表时显示的定义复杂的完整性规则

(5) 支持的硅sql查询

(6) 支持异构分布式数据库访问

(7) 支持数据复制

二、开发工具

  ibm提供了许多开发工具,主要有visualizer query, visualage, visualgen。

  visualizer是客户/服务器环境中的集成工具软件,主要包括visualizer query可视化查询工具,visualizer ultimedia query可视化多媒体查询工具,visualizer chart可视化图标工具,visualizer procedure可视化过程工具,visualizer statistics可视化统计工具,visualizer plans可视化规划工具, visualizer development可视化开发工具。

  visualage是一个功能很强的可视化的面向对象的应用开发工具,可翼大幅度的提高软件开发效率。其主要特征有:

(1) 可视化程序设计工具。

(2) 部件库。包括支持图形用户接口的预制不见,以及包含数据库查询、事务和本地、远程函数的通用部件。

(3) 关系数据库支持。

(4) 群体程序设计。

(5) 支持增强的动态连接库。

(6) 支持多媒体。

(7) 支持数据共享。

  visualgen是ibm所提供的高效开发方案中的重要组成部分。它集成了第四代语言、客户/服务器与面向对象技术,给用户提供了一个完整、高效的开发环境。

三、DB2数据库的安装

这是在IBM RS6000 操作系统为AIX安装的,HP9000上雷同 

1. 注册为具有超级用户权限的用户(root) 
2. 将 标有“DB2通用数据库企业版”的软件光盘插入驱动器 
3. 输入如下命令,以创建一个目录来安装该 CD-ROM:  
# mkdir -p /cdrom 其中 cdrom 表示 CD-ROM 安装目录。 
输入如下命令,来分配 CD-ROM 文件系统: 
# smitty storage 
4. 选择文件系统 
5. 选择添加/更改/显示/删除文件系统 
6. 选择 CDROM 文件系统 
7. 选择添加 CDROM 文件系统 
8. 在弹出窗口中,输入如下项作为安装点:  
/cdrom 
9. 通过输入以下命令来安装 CD-ROM 文件系统: smit mountf 
10. 在文件系统名称字段中输入值。例如,该名称可能是 /dev/cd0。  
11. 在安装目录字段中输入值。例如,此值可能是 /cdrom。 
12. 将安装为只读系统设置为 Yes。  
13. 单击确定。 
14. cd /cdrom  
15. 输入 ./db2setup 命令以启动 DB2 安装程序。 安装 DB2 V6 窗口打开。 
16. 按 Tab 键更改突出显示的选项,按 Enter 键选择或取消选择选项。  
(1) 在服务器上安装,一般选择安装以下三个产品: 
注意:要显示想要安装的 DB2 产品的部件,选择定制。要在任何时候返回至先前窗口,选择取消。 
 DB2 Administration Client 
选择定制安装这个产品, 
 DB2 UDB enterprise edition  
选择定制安装这个产品,  
 DB2 Software Developer Kit  
如果同时做开发,需要定制安装此产品。 
(2) 在“DB2产品信息”和“DB2产品库”只选择中国语言ZH_CN支持。 
17. 在16步确认后,将开始安装数据库程序。在安装过程中,还需确认以下问题: 
(1) 是否建立DB2管理帐户, 一般选择建立: 
按缺省建立db2管理用户db2as(使用缺省的UID,Group Id,安装home路径),在语言支持上, 
只选择中国语言ZH_CN支持。 
(2) 是否建立DB2的实例, 一般选择建立: 
 按缺省建立db2管理用户db2inst1:db2iadm1(使用缺省的UID,Group Id,安装home路径), 
在语言支持上,只选择中国语言ZH_CN支持。 
 按缺省建立db2用户db2fenc1:db2fenc1(使用缺省的UID,Group Id,安装home路径), 
在语言支持上,只选择中国语言ZH_CN支持。 
 是否建立sample数据库(为了检查数据库的安装是否正确,一般选择建立sample数据库) 
 是否选择DB2的实例进程在操作系统启动时,自动执行初始化 
如果在独立服务器上安装使用,可选择autostart,但在aix+hacmp+db2的双机共享环境中,不要选择 
autostart,DB2实例进程的启动,由hacmp来控制。 

18. 安装结果: 
数据库程序安装完成后,DB2的软件程序安装在/usr/lpp目录中,  
DB2DIR = /usr/lpp/DB2_06_01 
注意:如果安装过程中没有指定建立实例和管理帐户,在安装完成后可以使用命令创建实例(db2icrt)。 
或者要创建或添加新的实例、“管理服务器”或其他 DB2 产品和部件,输入如下命令:  
/usr/lpp/DB2_06_01/install/DB2setup 
19. 验证安装 
在安装时若没有选择建立sample数据库,在安装完成后可以通过命令(db2sampl)创建 SAMPLE 数据库, 
并通过使用命令行处理器与该数据库相连来验证安装: 
(1) 作为具有系统管理 (SYSADM) 权限的用户向系统注册。如:db2inst1 
(2) 输入 DB2sampl 命令以便创建 SAMPLE 数据库。 
(3) 创建 SAMPLE 数据库时,用数据库别名 SAMPLE 将它自动编目。 
(4) 输入 DB2start 命令以启动数据库管理程序。 
(5) 输入下列命令来与 SAMPLE 数据库相连,检索在部门 20 中工作的所有雇员的列表,并重设数据库连接: 
DB2 connect to sample 
DB2 "select * from staff where dept = 20" 
DB2 connect reset 
注意:在验证安装后,可除去 SAMPLE 数据库以释放磁盘空间。输入 DB2 drop database sample 命令 
来卸下 SAMPLE 数据库。 

  
若尚未未安装 DB2 工具,则您可以通过创建 SAMPLE 数据库, 并通过使用命令行处理器与该数据库 
相连来验证安装,如下所示:  
步骤 1.  
作为具有系统管理 (SYSADM) 权限的用户向系统注册。  

步骤 2.  
输入 db2sampl 命令以便创建 SAMPLE 数据库。  


创建 SAMPLE 数据库时, 用数据库别名 SAMPLE 将它自动编目。  

步骤 3.  
输入 db2start 命令以启动数据库管理程序。  

步骤 4.  
输入下列命令来与 SAMPLE 数据库相连, 检索在部门 20 中工作的所有雇员的列表,并重设数据库连接:  

db2 connect to sample 
db2 "select * from staff where dept = 20" 
db2 connect reset 

如以上命令均正确执行, 则证明DB2 UDB 数据库服务器的安装已经成功完成. 
   

四、DB2数据库的备份和恢复
 
      最近,我恢复了一个数据库.其中的辛苦不予言表,我想写出自己用到的一些语句,和遇到相同问题的xdjm共勉。

      首先谈db2数据库的备份,我用的是backup命令。

      db2 backup database 数据库名(我的库是jsdb)
      忘了说了,在backup之前需要停止你要备份的数据库,我用了db2stop force(之所以用force参数是因为这样好停懒省事:)和db2start。这样就保证可以成功backup了。
      备份完成后db2会告诉你一个时间戳,例如:20040831(之后好几位)这样就会在当前目录下产生一个与你数据库名相同的文件夹名例如:jsdb。这个文件夹目录层次很重要,如果错了会在恢复时提示找不到文件。
备份完成以后就是恢复了,我用的是restore命令。
      db2 restore database 数据库名(jsdb)taken at 时间戳(20040831)
      执行这个语句要注意两点:1,要把备份文件夹考到当前目录下(我用了一个cd c:/命令设当前目录为c盘,将jsdb文件夹考到c盘根目录下);2,时间戳要和jsdb目录中的一致。
这样,就完成了恢复数据库了。

五、DB2编程序技巧


1 DB2编程


1.1 建存储过程时Create 后一定不要用TAB键
create procedure
的create后只能用空格,而不可用tab健,否则编译会通不过。
切记,切记。

1.2 使用临时表

  要注意,临时表只能建在user tempory tables space 上,如果database只有system tempory table space是不能建临时表的。
  另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。
   建临时表时最好加上  with  replace选项,这样就可以不显示的drop 临时表,建临时表时如果不加该选项而该临时表在该session内已创建且没有drop,这时会发生错误。
1.3 从数据表中取指定前几条记录
select  *  from tb_market_code fetch first 1 rows only

但下面这种方式不允许
select market_code into v_market_code 
        from tb_market_code fetch first 1 rows only;     
    
选第一条记录的字段到一个变量以以下方式代替
    declare v_market_code char(1);
    declare cursor1 cursor for select market_code from tb_market_code 
fetch first 1 rows only for update;
    open cursor1;
    fetch cursor1 into v_market_code;
    close cursor1;

1.4 游标的使用
注意commit和rollback
使用游标时要特别注意如果没有加with hold 选项,在Commit和Rollback时,该游标将被关闭。Commit 和Rollback有很多东西要注意。特别小心

游标的两种定义方式
一种为
declare continue handler for not found
   begin
     set v_notfound = 1;
   end;

declare cursor1 cursor with hold for select market_code from tb_market_code  for update;
open cursor1;
set v_notfound=0;
fetch cursor1 into v_market_code;
while v_notfound=0 Do
--work
set v_notfound=0;
fetch cursor1 into v_market_code;
end while;
close cursor1;
这种方式使用起来比较复杂,但也比较灵活。特别是可以使用with hold 选项。如果循环内有commit或rollback 而要保持该cursor不被关闭,只能使用这种方式。


  另一种为
      pcursor1: for loopcs1 as  cousor1  cursor  as
select  market_code  as market_code
           from tb_market_code
           for update
        do
        end for;
       这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。
  但不能使用with  hold 选项。如果在游标循环内要使用commit,rollback则不能使用这种方式。如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。

修改游标的当前记录的方法
update tb_market_code set market_code='0' where current of cursor1;
不过要注意将cursor1定义为可修改的游标
  declare cursor1 cursor for select market_code from tb_market_code 
for update;

for update 不能和GROUP BY、 DISTINCT、 ORDER BY、 FOR READ ONLY及UNION, EXCEPT, or INTERSECT但 UNION ALL除外)一起使用。

 

1.5 类似decode的转码操作
oracle中有一个函数  select decode(a1,'1','n1','2','n2','n3') aa1 from
db2没有该函数,但可以用变通的方法
select case a1 
when '1' then 'n1' 
when '2' then 'n2' 
else 'n3'
    end as aa1 from

1.6 类似charindex查找字符在字串中的位置
Locate(‘y’,’dfdasfay’)
查找’y’ 在’dfdasfay’中的位置。

1.7 类似datedif计算两个日期的相差天数
days(date(‘2001-06-05’)) – days(date(‘2001-04-01’))
days 返回的是从  0001-01-01 开始计算的天数
1.8 写UDF的例子
C写见sqllib/samples/cli/udfsrv.c

1.9 创建含identity值(即自动生成的ID)的表
建这样的表的写法
CREATE TABLE test
     (t1 SMALLINT NOT NULL
        GENERATED ALWAYS AS IDENTITY
        (START WITH 500, INCREMENT BY 1),
      t2 CHAR(1));
在一个表中只允许有一个identity的column.


1.10 预防字段空值的处理
SELECT DEPTNO ,DEPTNAME ,COALESCE(MGRNO ,'ABSENT'),ADMRDEPT
FROM DEPARTMENT
   COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。
   和oracle的isnull类似,但isnull好象只能两个表达式。 
     

1.11 取得处理的记录数
declare v_count int;
update tb_test set t1=’0’
where t2=’2’;
--检查修改的行数,判断指定的记录是否存在
get diagnostics v_ count=ROW_COUNT;     
只对update,insert,delete起作用.
不对select into 有效


1.12 从存储过程返回结果集(游标)的用法
1、建一sp返回结果集
CREATE PROCEDURE DB2INST1.Proc1 (  )
    LANGUAGE SQL
    result sets 2(返回两个结果集)
------------------------------------------------------------------------
-- SQL 存储过程 
------------------------------------------------------------------------
P1: BEGIN
        declare c1 cursor  with return to caller for 
            select  market_code
            from    tb_market_code;
        --指定该结果集用于返回给调用者
        declare c2 cursor  with return to caller for 
            select  market_code
            from    tb_market_code;
         open c1;
         open c2;
END P1                                       


2、建一SP调该sp且使用它的结果集

CREATE PROCEDURE DB2INST1.Proc2 (
out out_market_code char(1))
    LANGUAGE SQL
------------------------------------------------------------------------
-- SQL 存储过程 
------------------------------------------------------------------------
P1: BEGIN

 declare loc1,loc2 result_set_locator varying; 
--建立一个结果集数组
call proc1;
--调用该SP返回结果集。
associate result set locator(loc1,loc2) with procedure proc1;
--将返回结果集和结果集数组关联
 allocate cursor1 cursor for result set loc1;
 allocate cursor2 cursor for result set loc2;
--将结果集数组分配给cursor
fetch  cursor1 into out_market_code;
--直接从结果集中赋值
close cursor1;         

END P1

3、动态SQL写法
     DECLARE CURSOR C1 FOR STMT1; 
     PREPARE STMT1 FROM
        'ALLOCATE C2 CURSOR FOR RESULT SET ?';
4、注意:
一、 如果一个sp调用好几次,只能取到最近一次调用的结果集。
二、 allocate的cursor不能再次open,但可以close,是close sp中的对应cursor。

1.13 类型转换函数
select cast ( current time as char(8)) from tb_market_code

1.14 存储过程的互相调用
目前,c sp可以互相调用。
Sql sp 可以互相调用,
Sql sp 可以调用C sp,
但C sp 不可以调用Sql sp(最新的说法是可以)

1.15 C存储过程参数注意
create procedure pr_clear_task_ctrl(
IN IN_BRANCH_CODE char(4),
              IN IN_TRADEDATE   char(8),
           IN IN_TASK_ID     char(2),
       IN IN_SUB_TASK_ID char(4),
       OUT OUT_SUCCESS_FLAG INTEGER )
 
DYNAMIC RESULT SETS 0
LANGUAGE C 
PARAMETER STYLE GENERAL WITH NULLS(如果不是这样,sql 的sp将不能调用该用c写的存储过程,产生保护性错误)
NO DBINFO
FENCED
MODIFIES SQL DATA
EXTERNAL NAME 'pr_clear_task_ctrl!pr_clear_task_ctrl'@


1.16 存储过程fence及unfence
fence的存储过程单独启用一个新的地址空间,而unfence的存储过程和调用它的进程使用同一个地址空间。
一般而言,fence的存储过程比较安全。
但有时一些特殊的要求,如要取调用者的pid,则fence的存储过程会取不到,而只有unfence的能取到。

1.17 SP错误处理用法
如果在SP中调用其它的有返回值的,包括结果集、临时表和输出参数类型的SP,
DB2会自动发出一个SQLWarning。而在我们原来的处理中对于SQLWarning都
会插入到日志,这样子最后会出现多条SQLCODE=0的警告信息。
处理办法:
定义一个标志变量,比如DECLARE V_STATUS INTEGER DEFAULT 0,
在CALL SPNAME之后, SET V_STATUS = 1,
DECLARE CONTINUE HANDLER FOR SQLWARNING
BEGIN
IF V_STATUS <> 1 THEN
--警告处理,插入日志
SET V_STATUS = 0;
END IF;
END;
1.18 import用法
db2 import  from  gh1.out   of  DEL messages err.txt insert into  db2inst1.tb_dbf_match_ha

注意要加schma

1.19 values的使用
如果有多个 set  语句给变量付值,最好使用values语句,改写为一句。这样可以提高效率。
 
但要注意,values不能将null值付给一个变量。
values(null) into out_return_code;
这个语句会报错的。


1.20 给select 语句指定隔离级别
select * from tb_head_stock_balance with ur
 
1.21 atomic及not atomic区别
atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。


2  DB2编程性能注意


2.1 大数据的导表
应该是export后再load性能更好,因为load不写日志。
比select into 要好。


2.2 SQL语句尽量写复杂SQL
   尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。
   DB2的SQL Engieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。
Oracle 则相反,推荐将复杂的语句简单化,SQL Engieer的优化能力不是特别好。
这是因为每一个SQL语句都会有reset SQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。
一个总的思想就是尽量减少SQL语句的个数。
2.3 SQL  SP及C SP的选择
首先,C的sp的性能比sql 的sp 的要高。
一般而言,SQL语句比较复杂,而逻辑比较简单,sql sp 与 c sp 的性能差异会比较小,这样从工作量考虑,用SQL写比较好。
而如果逻辑比较复杂,SQL比较简单,用c写比较好。

2.4 查询的优化(HASH及RR_TO_RS)
db2set  DB2_HASH_JOIN=Y (HASH排序优化)
   指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。
   剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下  72秒。

db2set  DB2_RR_TO_RS=Y       
 该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS.
这样,db2不用管理Next key,可以少管理一些东西,这样可以提高性能。     


2.5 避免使用count(*) 及exists的方法
1、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。
2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。

如果做这两中操作的目的是为
       select into 服务的话,就可以省略掉这两步。
直接使用select into 选择记录中的字段。

如果是没有记录选择到的话,db2 会将  sqlcode=100 和 sqlstate=’20000’
如果是有多条记录的话,db2会产生一个错误。

程序可以创建  continue handler for  exception 
              continue handler for  not found
来检测。
这是最快速的方法。

3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。这个速度也比count(*) 要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。


3 DB2表及sp管理


3.1 看存储过程文本
select text from syscat.procedures where procname='PROC1';
3.2 看表结构
describe table syscat.procedures
describe select * from syscat.procedures

3.3 查看各表对sp的影响(被哪些sp使用)
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME  from syscat.packagedep where bname='TB_BRANCH'))


3.4 查看sp使用了哪些表
select bname from syscat.packagedep where btype='T' and pkgname in(select bname from sysibm.sysdependencies where dname in (select specificname from syscat.procedures where procname='PR_CLEAR_MATCH_DIVIDE_SHA'))
3.5 查看function被哪些sp使用
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME  from syscat.packagedep where bname   in  (select SPECIFICNAME from SYSCAT.functions where funcname='GET_CURRENT_DATE')))


使用function时要注意,如果想drop 掉该function必须要先将调用该function的其它存储过程全部drop掉。
必须先创建function,调用该function的sp才可以创建成功。
3.6 修改表结构
一次给一个表增加多个字段
db2 "alter table tb_test add column t1 char(1) add column t2 char(2) add column t3 int"


4 DB2系统管理


4.1 DB2安装
  在Windows 98 下安装db2 7.1 或其他版本,如果有Jdbc错误或者是Windwos 98不能启动,则将autoexec.bat 中的内容用如下内容替换:


C:/PROGRA~1/TRENDP~1/PCSCAN.EXE C:/ C:/WINDOWS/COMMAND/ /NS /WIN95 
rem C:/WINDOWS/COMMAND.COM /E:32768
REM [Header]

REM [CD-ROM Drive]

REM [Miscellaneous]

REM [Display]

set PATH=%PATH%;C:/MSSQL/BINN;C:/PROGRA~1/SQLLIB/BIN;C:/PROGRA~1/SQLLIB/FUNCTION;C:/PROGRA~1/SQLLIB/SAMPLES/REPL;C:/PROGRA~1/SQLLIB/HELP
IF EXIST C:/PROGRA~1/IBM/IMNNQ/IMQENV.BAT CALL C:/PROGRA~1/IBM/IMNNQ/IMQENV.BAT
IF EXIST C:/PROGRA~1/IBM/IMNNQ/IMNENV.BAT CALL C:/PROGRA~1/IBM/IMNNQ/IMNENV.BAT
set DB2INSTANCE=DB2
set CLASSPATH=.;C:/PROGRA~1/SQLLIB/java/db2java.zip;C:/PROGRA~1/SQLLIB/java/runtime.zip;C:/PROGRA~1/SQLLIB/java/sqlj.zip;C:/PROGRA~1/SQLLIB/bin
set MDIS_PROFILE=C:/PROGRA~1/SQLLIB/METADATA/PROFILES
set LC_ALL=ZH_CN
set INCLUDE=C:/PROGRA~1/SQLLIB/INCLUDE;C:/PROGRA~1/SQLLIB/LIB;C:/PROGRA~1/SQLLIB/TEMPLATES/INCLUDE
set LIB=C:/PROGRA~1/SQLLIB/LIB
set DB2PATH=C:/PROGRA~1/SQLLIB
set DB2TEMPDIR=C:/PROGRA~1/SQLLIB
set VWS_TEMPLATES=C:/PROGRA~1/SQLLIB/TEMPLATES
set VWS_LOGGING=C:/PROGRA~1/SQLLIB/LOGGING
set VWSPATH=C:/PROGRA~1/SQLLIB
set VWS_FOLDER=IBM DB2
set ICM_FOLDER=信息目录管理器

win


4.2 创建Database
create database head using codeset IBM-eucCN territory CN;
这样可以支持中文。


4.3 手工做数据库远程(别名)配置
db2  catalog tcpip  node   node1  remote   172.28.200.200 server  50000
db2  catalog db    head   as     test1 at  node   node1

然后既可使用:
   db2 connect to test1  user …  using …
连上head库了

4.4 停止启动数据库实例
db2start
db2stop (force)


4.5 连接数据库及看当前连接数据库
连接数据库
db2  connect to head user db2inst1  using db2inst1

当前连接数据库
db2  connect
4.6 停止启动数据库head
db2  activate  db  head
db2  deactivate db  head
要注意的是,如果有连接,使用deactivate db 不起作用。
如果是用activate db启动的数据库,一定要用deactivate db才会停止该数据库。(当然如果是db2stop也会停止)。
使用activate db,这样可以减少第一次连接时的等待时间。
Database如果不是使用activate db启动而是通过连接数据库而启动的话,当所有的连接都退出后,db也就自动停止。

4.7 查看及停止数据库当前的应用程序
查看应用程序:
db2   list   applications  show  detail 

授权标识 | 应用程序名 | 应用程序句柄 |  应用程序标识 | 序号#  | 代理程序 |  协调程序 | 状态 |  状态更改时间 |  DB 名 | DB 路径|                                                      |    节点号 |   pid/线程

其中:1、应用程序标识的第一部分是应用程序的IP地址,不过是已16进制表示的。
2、pid/线程即是在unix下看到的线程号。

停止应用程序:
db2 "force application(236)"
db2 “force application all”

其中:该236是查看中的应用程序句柄。


4.8 查看本instance下有哪些database
db2 LIST DATABASE DIRECTORY  [ on /home/db2inst1 ]
4.9 查看及更改数据库head的配置
请注意,在大多数情况下,更改了数据的配置后,只有在所有的连接全部断掉后才会生效。

查看数据库head的配制
db2 get db cfg for head


更改数据库head的某个设置的值
4.9.1 改排序堆的大小
db2 update db cfg for head using SORTHEAP 2048
将排序堆的大小改为2048个页面,查询比较多的应用最好将该值设置比较大一些。
4.9.2 改事物日志的大小
db2 update db cfg for head using  logfilsiz  40000
该项内容的大小要和数据库的事物处理相适应,如果事物比较大,应该要将该值改大一点。否则很容易处理日志文件满的错误。

4.9.3 出现程序堆内存不足时修改程序堆内存大小
db2 update db cfg for head using  applheapsz  40000
该值不能太小,否则会没有足够的内存来运行应用程序。

4.10 查看及更改数据库实例的配置
查看数据库实例配置
db2  get dbm cfg 
更改数据库实例配制

4.10.1 打开对锁定情况的监控。
db2 update dbm cfg using dft_mon_lock  on
4.10.2 更改诊断错误捕捉级别
db2 update dbm cfg using diaglevel 3
0 为不记录信息
1 为仅记录错误
2 记录服务和非服务错误
缺省是3,记录db2的错误和警告
4 是记录全部信息,包括成功执行的信息
一般情况下,请不要用4,会造成db2的运行速度非常慢。


4.11 db2环境变量
db2 重装后用如下方式设置db2的环境变量,以保证sp可编译
将set_cpl 放到AIX上, chmod +x set_cpl, 再运行之

set_cpl的内容
db2set DB2_SQLROUTINE_COMPILE_COMMAND="xlc_r  -g /
-I$HOME/sqllib/include SQLROUTINE_FILENAME.c /
-bE:SQLROUTINE_FILENAME.exp -e SQLROUTINE_ENTRY /
-o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -lc -ldb2"

db2set DB2_SQLROUTINE_KEEP_FILES=1
4.12 db2命令环境设置
db2=>list command options
db2=>update command options using C off--或on,只是临时改变
db2=>db2set db2options=+c --或-c,永久改变

4.13 改变隔离级别
DB2SET DB2_SQLROUTINE_PREPOPTS=CS|RR|RS|UR

交互环境更改session的隔离级别,
       db2 change isolation  to UR
请注意只有没有连接数据库时可以这样来改变隔离级别。

4.14 管理db/instance的参数
get db cfg for head(db)
get dbm cfg(instance)

4.15 升级后消除版本问题
db2   bind  @db2ubind.lst
db2   bind   @db2cli.lst

4.16 查看数据库表的死锁
再用命令中心查询数据时要注意,如果用了交互式查询数据,命令中心将会给所查的记录加了s锁.这时如果要update记录,由于update要使用x锁,排它锁,将会处于锁等待.

首先,将监视开关打开
db2 update dbm cfg using dft_mon_lock  on
快照
  db2 get snapshot for  Locks  on  cleardb   >snap.log
                    tables 
bufferpools
tablespaces
database
   然后再看snap.log中的内容即可。
对Lock可根据Application handle(应用程序句柄)看每个应用程序的锁的情况。
 监视完毕后,不要忘了将监视器关闭
     db2 update dbm cfg using dft_mon_lock  off

六、DB2常用知识

以下主要以DB27.X为基础的.以下的字符为小写.

  本文对DB2高手来说是不用看的.

  1.DB2产品的级别有那些?

  企业版的 ENTERPRISE EDITION

  工作组版 WORKGROUP EDITION

  企业扩展版 ENTERPRISE EXTENDED EDITION

  个人版的 PERSONAL EDITION

  卫星版的 SATELLITE EDITION

  微型版的 EVERYPLACE

  

  2.可以连接到DB2数据库的产品有哪些?

  DB2客户端

  DB2CONNECT

  DB2DATA PROPAGATOR

  DB2NET.DATA

  DB2DATA JOINER

  DB2 RELATIONAL CONNECT

  WEBSPHERE应用服务器

  等

  

  3.DB2支持的通讯协议有哪些?

  TCP/IP

  NETBIOS

  APPG

  IPX/SPX

  NAMEPIPE

  等

  

  4.DB2客户端产品有哪些?

  DB2运行时间客户端DB2 RUNTIME CLIENT

  DB2管理客户端DB2ADMINI STRATION CLIENT

  DB2应用程序开发客户端DB2 APPLICATION DEVELOP MENT CLIENT

  DB2瘦客户端 DB2 THIN CLIENT

  

  5.一个数据库是否可以安装在多个数据库服务器上?

  可以

  

  6.从哪个版本后存储过程可以用SQL语句来创建?

  7.1版后

  

  7.DB2提供哪些关系扩展器?

  文本扩展器 TEXT EXTENDER

  图象扩展器 IMAGE EXTENDER

  音频扩展器 AUDIO EXTENDER

  视频扩展器 VIDEO EXTENDER

  空间数据扩展器 SPATIAL EXTENDER

  XML扩展器 XML EXTENDER

  网络搜索扩展器NET.SEARCH EXTENDER

  

  8.WINDOWS和OS/2环境下的DB2安装目录结构?

  用SETUP.EXE来安装

  

  /SQLLIB安装的根目录,包括README文件

  /SQLLIB/ADSM包含ADSTAR分布式存储管理器文件

  /SQLLIB/BIN包含DB2工具的可执行文件

  /SQLLIB/BND包含DB2工具的绑定文件

  /SQLLIB/CC包含运行控制中心所需的文件

  /SQLLIB/CFG包含默认的系统配置文件

  /SQLLIB/CONV包含代码页转换表文件

  /SQLLIB/DB2默认的实例目录

  /SQLLIB/DB2DAS00缺省的DB2管理服务器目录

  /SQLLIB/DOC包含DB2联机手册

  /SQLLIB/FUNCTION默认的用户自定义函数目录

  /SQLLIB/FUNCTION/UNFENCED默认的非隔离用户自定义函授目录

  /SQLLIB/HELP联机帮助文件

  /SQLLIB/JAVADB2所需的JAVA类库

  JAVA12包含JDK1.2的支持程序

  /SQLLIB/MISC包含HTML搜索服务器文件

  /SQLLIB/MSG/PRIME包含信息文件

  /SQLLIB/QP包含QUERYPATROLLER的客户端文件

  /SQLLIB/SAMPLES包含样例程序和样例脚本

  /SQLLIB/SPMLOG包含DB2同步点管理器日志文件

  /SQLLIB/THNSETUP包含瘦客户端安装文件

  9.UNIX和LINUX环境下的DB2安装目录结构?

  用DB2SETUP.EXE来安装

  安装的根目录下还将创建以下目录:

  

  README安装的根目录,包括README文件

  ADM包含系统管理工具文件

  ADSM包含ADSTAR分布式存储管理器文件

  BIN包含DB2工具的二进制可执行文件

  BND包含DB2工具的绑定文件

  CC包含运行控制中心所需的文件

  CFG包含默认的系统配置文件

  CONV包含代码页转换表文件

  DOC包含DB2联机手册

  FUNCTION默认的用户自定义函数目录

  FUNCTION/UNFENCED默认的非隔离用ё远ㄒ搴谀柯?lt;BR>  INSTALL包含安装程序

  INSTANCE包含实例脚本

  JAVADB2所需的JAVA类库

  LIBDB2库文件

  MAP包含DB2CONNECT使用的映射文件

  MISC包含HTML搜索服务器文件

  SAMPLES包含样例程序和样例脚本

  MSG/$L包含DB2信息文件


  10.AIX下用哪个命令来安装DB2?

  INSTALLP命令

  

  11.同一操作系统下可以安装多个DB2数据库?

  可以的

  

  12.如何停止实例?

  DB2STOP

  

  13.如何启动实例?

  DB2START

  [page]


  14.如何修改注册项的值?

  DB2SET可以修改

  如:

  设定当前实例的一个参数

  DB2SET PARAMETER=VALUE

  

  设定一个全局级的参数

  DB2SET PARAMETER=VALUE-G(小写)

  

  查看能在配置文件注册表中设置的所有变量的列表

  DB2SET-LR(小写)

  

  15.如何在CLP执行操作系统的命令?

  在命令前加"!"作为前缀

  DB2=>!DIR C:/

  

  16.在CLP中命令过长怎么办?

  用"/"作为续行符号

  

  17.如何获得DB2的命令的语法相关信息?

  DB2 ?显示所有DB2命令

  DB2 ? COMMAND显示命令信息

  DB2 ? SQLnnnn 显示这个SQLCODE的解释信息

  DB2 ? DB2nnnn 显示这个DB2错误的解释信息

  

  18.如何查看当前CLP的设置?

  DB2=>LIST COMAND OPTIONS

  

  19.如何更新当前CLP会话的特定项设置?

  DB2 UPDATE COMMAND OPTIONS USING OPTIONS...

  

  20.COMMAND WINDOWS可以通过哪个命令调用?

  DB2CMD命令

  

  21.管理服务器的默认名为?

  UNIX下为DB2AS

  WINDOWS下为DB2DAS00

  

22.常用管理DB2服务器实例的命令?

  DB2ADMIN START 启动DB2管理服务器实例

  DB2ADMIN STOP 停止DB2管理服器实例

   DASICRTUNIX下创建DB2管理服务器实例

  DASIDROPUNIX下删除DB2管理服务器实例

  DB2 ADMIN CREATE WINDOWS OR OS/2下创建DB2管理服务器实例

  DB2 ADMIN DROP WINDOWSOROS/2下删除DB2管理服务器实例

  DB2 GET ADMIN CFG 显示DB2管理服务器的配置参数

  DB2 UPDATE ADMIN CFG 修改DB2管理服务器的配置参数

  DB2 RESET ADMIN CFG将DB2管理服务器的配置参数设为默认值

  

  23.DB2目录分为哪几种?

  系统数据库目录

  本地数据库目录

  节点目录

  DCS目录

  管理节点目录

  

  24.如何查看系统数据库目录?

  LIST DB DIRECTORY

  

  25.如何查看数据库服务器目录?

  LIST NODE DIRECTORY

  

  26.DB2实例的服务器的默认端口是?

  50000

  服务器名称为DB2CDB2

  

  27.DB2UDB服务器端的认证类型有?

  SERVER

  SERVER_ENCRYPT

  CLIENT

  DCE

  DCE_SERVER_ENCRYPT

  KERBEROS

  KRB_SERVER_ENCRYPT

  

  28.DB2客户端的认证类型有?

  SERVER

  SERVER_ENCRYPT

  DCS

  DCS_ENCRYPT

  CLIENT

  DCE

  

  29.DB2中有哪几种类型的权限?

  SYSADM 系统管理权限

  SYSCTRL系统控制权限

  SYSMAINT系统维护权限

  DBADM 数据库管理权限

  LOAD 对表进行LOAD操作的权限

  

  30.不能通过GRANT授权的权限有哪种?

  SYSAM

  SYSCTRL

  SYSMAINT

  要更该上述权限必须修改数据库管理器配置参数

  

  31.表的类型有哪些?

  永久表(基表)

  临时表(说明表)

  临时表(派生表)

  

   


   

51.安装DB2默认的事例名称是?

  在WINDOWS或OS/2中默认的是DB2

  在LINUX或UNIX环境下默认的是DB2INST1

  

  52.安装后的默认帐户是?

  在WINDOWS或OS/2中默认的是DB2ADMIN

  在LINUX或UNIX环境下默认的是DB2AS

  

53.事例的类型有哪些?

  CLIENT(客户)

  STANDALONE(独立的)

  SATELLITE(卫星)

  EEDB2

  EEE


68.一个数据库至少包括哪些表空间?

  一个目录表空间

  一个或多个用户表空间

  一个或多个临时表空间[page]

  

  69.根据数据与存储空间之间移动的控制方式不同,分哪两种表空间?

  系统管理的空间(SMS)

  数据库管理的空间(DMS)


81.表的类型有哪些?

  基本表

    结果表

  概要表

  类型表

  子类型

  子表

  声明的临时表

  系统临时表


105.DB2数据库监控的两个组成部分?

  快照监控(SNAPSHOTMONITOR)可返回特定时间点的数据库活动的快照.

  事件监控(EVENTMONITOR)记录事件发生的数据.

  

  106.系统监控的数据元素类型?

  计数器(COUNTER)记录活动发生的次数.

  测量(GAUGE)测量条目的当前值.

  水线(WATERMARK)从监控来元素达到的最大或最小数值.

  信息(INFORMATION)监控活动的参照类型细节.

  时间点(TIMESTAMP)活动发生的日期时间.

  时间(TIME)返回一个活动花费的时间.

114.DB2的SQL语句的类别?

  DCL:数据控制语言,提供对数据库对象的访问权限.

  DDL:数据定义语言,创建,修改,删除数据库对象的.

  DML:数据操纵语言,用来插入,更新,删除数据的.[page]

  115.DCL的权限有哪些?

  CONTROL权限:如果用户创建一个对象,则改用户能完全访问该对象.

  GRANT语句将权限授予给用户.

  REVOKE语句撤销一个用户的权限.

  116.DDL有哪些?

  CREATE

  DECLARE

  ALTER

    DROP

  等

117.DML有哪些?

  INSERT

  SELECT

  UPDATE

  DELETE

  等

  

  118.DB2有没有布尔类型?

  没有

  

  119.如何查询DB2的内置函数?

  自带文档ADMINISTION-->SQLREFERENCE-->FUNCTIONS内

 

 

你可能感兴趣的:(DB2数据库的简单介绍和用法,编程序技巧)