xzcxzc 发表于 2007-5-22 21:06:49

不错。:)

ehxz 发表于 2006-12-20 13:28:48

DB2

<p><br /> DB2是IBM一种分布式数据库解决方案。说简单点:DB2就是IBM开发的一种大型关系型数据库平台&#46;它支持多用户或应用程序在同一条SQL 语句中查询不同database甚至不同DBMS中的数据。目前,DB2有如下一些版本:(比如DB2 for Unix,DB2 for Windows,DB2 for AS/400,DB2 for OS/390等)</p><p>  DB2是IBM公司开发的关系数据库管理系统,它有多种不同的版本,如:DB2工作组版(DB2Workgroup Edition)、DB2企业版(DB2 Enterprise Edition)、DB2个人版(DB2 Personal Edition)和DB2企业扩展版(DB2 Enterprise-Exended Edition)等,这些产品基本的数据管理功能是一样的,区别在于支持远程客户能力和分布式处理能力。 </p><p>  个人版适用于单机使用,即服务器只能由本地应用程序访问。工作组版和企业版提供了本地和远程客户访问DB2的功能(当然远程客户要安装相应客户应用程序开发部件),企业版包括工作组版中的所有部件外再增加对主机连接的支持。企业扩展版允许将一个大的数据库分布到同一类型的多个不同计算机上,这种分布式功能尤其适用于大型数据库的处理。</p><p>  DB2可运行在OS/2、Windows NT、UNIX操作系统上,通常将运行在这些平台上的DB2产品统称为DB2通用数据库,这主要是强调这些产品运行环境类似,并共享相同的源代码。DB2通用数据库主要组件包括数据库引擎(Dalabase Engine )应用程序接口和一组工具。数据库引擎提供了关系数据库管理系统的基本功能,如管理数据、控制数据的访问(包括并发控制)、保证数据完整性及数据安全。所有数据访问都通过SQL接口进行。 </p><p>db2起源于system r和system r*。他支持从pc到unix,从中小型机到大型机;从ibm到非ibm(hp及sun unix系统等)各种操作平台。他既可以在主机上以主/从方式独立运行,也可以在客户/服务器环境中运行。其中服务<br />平台可以是os/400,aix,os/2,hp-unix,sun-solaris等操作系统,客户机平台可以是os/2或windows, dos, aix, hp-ux, sun solaris等操作系统。</p><p>一、db2核心数据库的特色</p><p>  db2数据库核心又称作db2公共服务器,采用多进程多线索体系结构,可以运行于多种操作系统之上,并分别根据相应平台环境作了调整和优化,以便能够达到较好的性能。</p><p>(1) 支持面向对象的编程</p><p>  db2支持复杂的数据结构,如无结构文本对象,可以对无结构文本对象进行布尔匹配、最接近匹配和任意匹配等搜索。可以建立用户数据类型和用户自定义函数。</p><p>(2) 支持多媒体应用程序</p><p>  db2支持大二分对象(blob),允许在数据库中存取二进制大对象和文本大对象。其中,二进制大对象可以用来存储多媒体对象。</p><p>(3) 备份和恢复能力</p><p>(4) 支持存储过程和触发器,用户可以在建表时显示的定义复杂的完整性规则</p><p>(5) 支持的硅sql查询</p><p>(6) 支持异构分布式数据库访问</p><p>(7) 支持数据复制</p><p>二、开发工具</p><p>  ibm提供了许多开发工具,主要有visualizer query, visualage, visualgen。</p><p>  visualizer是客户/服务器环境中的集成工具软件,主要包括visualizer query可视化查询工具,visualizer ultimedia query可视化多媒体查询工具,visualizer chart可视化图标工具,visualizer procedure可视化过程工具,visualizer statistics可视化统计工具,visualizer plans可视化规划工具, visualizer development可视化开发工具。</p><p>  visualage是一个功能很强的可视化的面向对象的应用开发工具,可翼大幅度的提高软件开发效率。其主要特征有:</p><p>(1) 可视化程序设计工具。</p><p>(2) 部件库。包括支持图形用户接口的预制不见,以及包含数据库查询、事务和本地、远程函数的通用部件。</p><p>(3) 关系数据库支持。</p><p>(4) 群体程序设计。</p><p>(5) 支持增强的动态连接库。</p><p>(6) 支持多媒体。</p><p>(7) 支持数据共享。</p><p>  visualgen是ibm所提供的高效开发方案中的重要组成部分。它集成了第四代语言、客户/服务器与面向对象技术,给用户提供了一个完整、高效的开发环境。</p><p>三、DB2数据库的安装</p><p>这是在IBM RS6000 操作系统为AIX安装的,HP9000上雷同 </p><p>1&#46; 注册为具有超级用户权限的用户(root) <br />2&#46; 将 标有“DB2通用数据库企业版”的软件光盘插入驱动器 <br />3&#46; 输入如下命令,以创建一个目录来安装该 CD-ROM: <br /># mkdir -p /cdrom 其中 cdrom 表示 CD-ROM 安装目录。 <br />输入如下命令,来分配 CD-ROM 文件系统: <br /># smitty storage <br />4&#46; 选择文件系统 <br />5&#46; 选择添加/更改/显示/删除文件系统 <br />6&#46; 选择 CDROM 文件系统 <br />7&#46; 选择添加 CDROM 文件系统 <br />8&#46; 在弹出窗口中,输入如下项作为安装点: <br />/cdrom <br />9&#46; 通过输入以下命令来安装 CD-ROM 文件系统: smit mountf <br />10&#46; 在文件系统名称字段中输入值。例如,该名称可能是 /dev/cd0。 <br />11&#46; 在安装目录字段中输入值。例如,此值可能是 /cdrom。 <br />12&#46; 将安装为只读系统设置为 Yes。 <br />13&#46; 单击确定。 <br />14&#46; cd /cdrom <br />15&#46; 输入 &#46;/db2setup 命令以启动 DB2 安装程序。 安装 DB2 V6 窗口打开。 <br />16&#46; 按 Tab 键更改突出显示的选项,按 Enter 键选择或取消选择选项。 <br />(1) 在服务器上安装,一般选择安装以下三个产品: <br />注意:要显示想要安装的 DB2 产品的部件,选择定制。要在任何时候返回至先前窗口,选择取消。 <br />? DB2 Administration Client <br />选择定制安装这个产品, <br />? DB2 UDB enterprise edition <br />选择定制安装这个产品, <br />? DB2 Software Developer Kit <br />如果同时做开发,需要定制安装此产品。 <br />(2) 在“DB2产品信息”和“DB2产品库”只选择中国语言ZH_CN支持。 <br />17&#46; 在16步确认后,将开始安装数据库程序。在安装过程中,还需确认以下问题: <br />(1) 是否建立DB2管理帐户, 一般选择建立: <br />按缺省建立db2管理用户db2as(使用缺省的UID,Group Id,安装home路径),在语言支持上, <br />只选择中国语言ZH_CN支持。 <br />(2) 是否建立DB2的实例, 一般选择建立: <br />? 按缺省建立db2管理用户db2inst1:db2iadm1(使用缺省的UID,Group Id,安装home路径), <br />在语言支持上,只选择中国语言ZH_CN支持。 <br />? 按缺省建立db2用户db2fenc1:db2fenc1(使用缺省的UID,Group Id,安装home路径), <br />在语言支持上,只选择中国语言ZH_CN支持。 <br />? 是否建立sample数据库(为了检查数据库的安装是否正确,一般选择建立sample数据库) <br />? 是否选择DB2的实例进程在操作系统启动时,自动执行初始化 <br />如果在独立服务器上安装使用,可选择autostart,但在aix+hacmp+db2的双机共享环境中,不要选择 <br />autostart,DB2实例进程的启动,由hacmp来控制。 </p><p>18&#46; 安装结果: <br />数据库程序安装完成后,DB2的软件程序安装在/usr/lpp目录中, <br />DB2DIR = /usr/lpp/DB2_06_01 <br />注意:如果安装过程中没有指定建立实例和管理帐户,在安装完成后可以使用命令创建实例(db2icrt)。 <br />或者要创建或添加新的实例、“管理服务器”或其他 DB2 产品和部件,输入如下命令: <br />/usr/lpp/DB2_06_01/install/DB2setup <br />19&#46; 验证安装 <br />在安装时若没有选择建立sample数据库,在安装完成后可以通过命令(db2sampl)创建 SAMPLE 数据库, <br />并通过使用命令行处理器与该数据库相连来验证安装: <br />(1) 作为具有系统管理 (SYSADM) 权限的用户向系统注册。如:db2inst1 <br />(2) 输入 DB2sampl 命令以便创建 SAMPLE 数据库。 <br />(3) 创建 SAMPLE 数据库时,用数据库别名 SAMPLE 将它自动编目。 <br />(4) 输入 DB2start 命令以启动数据库管理程序。 <br />(5) 输入下列命令来与 SAMPLE 数据库相连,检索在部门 20 中工作的所有雇员的列表,并重设数据库连接: <br />DB2 connect to sample <br />DB2 "select * from staff where dept = 20" <br />DB2 connect reset <br />注意:在验证安装后,可除去 SAMPLE 数据库以释放磁盘空间。输入 DB2 drop database sample 命令 <br />来卸下 SAMPLE 数据库。 </p><p> <br />若尚未未安装 DB2 工具,则您可以通过创建 SAMPLE 数据库, 并通过使用命令行处理器与该数据库 <br />相连来验证安装,如下所示: <br />步骤 1&#46; <br />作为具有系统管理 (SYSADM) 权限的用户向系统注册。 </p><p>步骤 2&#46; <br />输入 db2sampl 命令以便创建 SAMPLE 数据库。 </p><p><br />创建 SAMPLE 数据库时, 用数据库别名 SAMPLE 将它自动编目。 </p><p>步骤 3&#46; <br />输入 db2start 命令以启动数据库管理程序。 </p><p>步骤 4&#46; <br />输入下列命令来与 SAMPLE 数据库相连, 检索在部门 20 中工作的所有雇员的列表,并重设数据库连接: </p><p>db2 connect to sample <br />db2 "select * from staff where dept = 20" <br />db2 connect reset </p><p>如以上命令均正确执行, 则证明DB2 UDB 数据库服务器的安装已经成功完成&#46; <br /> </p><p>四、DB2数据库的备份和恢复 <br /><br /> 最近,我恢复了一个数据库&#46;其中的辛苦不予言表,我想写出自己用到的一些语句,和遇到相同问题的xdjm共勉。 </p><p> 首先谈db2数据库的备份,我用的是backup命令。 </p><p> db2 backup database 数据库名(我的库是jsdb) <br /> 忘了说了,在backup之前需要停止你要备份的数据库,我用了db2stop force(之所以用force参数是因为这样好停懒省事:)和db2start。这样就保证可以成功backup了。 <br /> 备份完成后db2会告诉你一个时间戳,例如:20040831(之后好几位)这样就会在当前目录下产生一个与你数据库名相同的文件夹名例如:jsdb。这个文件夹目录层次很重要,如果错了会在恢复时提示找不到文件。 <br />备份完成以后就是恢复了,我用的是restore命令。 <br /> db2 restore database 数据库名(jsdb)taken at 时间戳(20040831) <br /> 执行这个语句要注意两点:1,要把备份文件夹考到当前目录下(我用了一个cd c:\命令设当前目录为c盘,将jsdb文件夹考到c盘根目录下);2,时间戳要和jsdb目录中的一致。 <br />这样,就完成了恢复数据库了。 </p><p>五、DB2编程序技巧</p><p><br />1 DB2编程 </p><p><br />1&#46;1 建存储过程时Create 后一定不要用TAB键 <br />create procedure <br />的create后只能用空格,而不可用tab健,否则编译会通不过。 <br />切记,切记。 </p><p>1&#46;2 使用临时表 </p><p> 要注意,临时表只能建在user tempory tables space 上,如果database只有system tempory table space是不能建临时表的。 <br /> 另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。 <br /> 建临时表时最好加上 with replace选项,这样就可以不显示的drop 临时表,建临时表时如果不加该选项而该临时表在该session内已创建且没有drop,这时会发生错误。 <br />1&#46;3 从数据表中取指定前几条记录 <br />select * from tb_market_code fetch first 1 rows only </p><p>但下面这种方式不允许 <br />select market_code into v_market_code <br /> from tb_market_code fetch first 1 rows only; <br /> <br />选第一条记录的字段到一个变量以以下方式代替 <br /> declare v_market_code char(1); <br /> declare cursor1 cursor for select market_code from tb_market_code <br />fetch first 1 rows only for update; <br /> open cursor1; <br /> fetch cursor1 into v_market_code; <br /> close cursor1; </p><p>1&#46;4 游标的使用 <br />注意commit和rollback <br />使用游标时要特别注意如果没有加with hold 选项,在Commit和Rollback时,该游标将被关闭。Commit 和Rollback有很多东西要注意。特别小心 </p><p>游标的两种定义方式 <br />一种为 <br />declare continue handler for not found <br /> begin <br /> set v_notfound = 1; <br /> end; </p><p>declare cursor1 cursor with hold for select market_code from tb_market_code for update; <br />open cursor1; <br />set v_notfound=0; <br />fetch cursor1 into v_market_code; <br />while v_notfound=0 Do <br />--work <br />set v_notfound=0; <br />fetch cursor1 into v_market_code; <br />end while; <br />close cursor1; <br />这种方式使用起来比较复杂,但也比较灵活。特别是可以使用with hold 选项。如果循环内有commit或rollback 而要保持该cursor不被关闭,只能使用这种方式。 </p><p><br /> 另一种为 <br /> pcursor1: for loopcs1 as cousor1 cursor as <br />select market_code as market_code <br /> from tb_market_code <br /> for update <br /> do <br /> end for; <br /> 这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。 <br /> 但不能使用with hold 选项。如果在游标循环内要使用commit,rollback则不能使用这种方式。如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。 </p><p>修改游标的当前记录的方法 <br />update tb_market_code set market_code='0' where current of cursor1; <br />不过要注意将cursor1定义为可修改的游标 <br /> declare cursor1 cursor for select market_code from tb_market_code <br />for update; </p><p>for update 不能和GROUP BY、 DISTINCT、 ORDER BY、 FOR READ ONLY及UNION, EXCEPT, or INTERSECT但 UNION ALL除外)一起使用。 </p><p></p><p>1&#46;5 类似decode的转码操作 <br />oracle中有一个函数 select decode(a1,'1','n1','2','n2','n3') aa1 from <br />db2没有该函数,但可以用变通的方法 <br />select case a1 <br />when '1' then 'n1' <br />when '2' then 'n2' <br />else 'n3' <br /> end as aa1 from </p><p>1&#46;6 类似charindex查找字符在字串中的位置 <br />Locate(‘y’,’dfdasfay’) <br />查找’y’ 在’dfdasfay’中的位置。 </p><p>1&#46;7 类似datedif计算两个日期的相差天数 <br />days(date(‘2001-06-05’)) – days(date(‘2001-04-01’)) <br />days 返回的是从 0001-01-01 开始计算的天数 <br />1&#46;8 写UDF的例子 <br />C写见sqllib\samples\cli\udfsrv&#46;c </p><p>1&#46;9 创建含identity值(即自动生成的ID)的表 <br />建这样的表的写法 <br />CREATE TABLE test <br /> (t1 SMALLINT NOT NULL <br /> GENERATED ALWAYS AS IDENTITY <br /> (START WITH 500, INCREMENT BY 1), <br /> t2 CHAR(1)); <br />在一个表中只允许有一个identity的column&#46; </p><p><br />1&#46;10 预防字段空值的处理 <br />SELECT DEPTNO ,DEPTNAME ,COALESCE(MGRNO ,'ABSENT'),ADMRDEPT <br />FROM DEPARTMENT <br /> COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。 <br /> 和oracle的isnull类似,但isnull好象只能两个表达式。 <br /> </p><p>1&#46;11 取得处理的记录数 <br />declare v_count int; <br />update tb_test set t1=’0’ <br />where t2=’2’; <br />--检查修改的行数,判断指定的记录是否存在 <br />get diagnostics v_ count=ROW_COUNT; <br />只对update,insert,delete起作用&#46; <br />不对select into 有效 </p><p><br />1&#46;12 从存储过程返回结果集(游标)的用法 <br />1、建一sp返回结果集 <br />CREATE PROCEDURE DB2INST1&#46;Proc1 ( ) <br /> LANGUAGE SQL <br /> result sets 2(返回两个结果集) <br />------------------------------------------------------------------------ <br />-- SQL 存储过程 <br />------------------------------------------------------------------------ <br />P1: BEGIN <br /> declare c1 cursor with return to caller for <br /> select market_code <br /> from tb_market_code; <br /> --指定该结果集用于返回给调用者 <br /> declare c2 cursor with return to caller for <br /> select market_code <br /> from tb_market_code; <br /> open c1; <br /> open c2; <br />END P1 </p><p><br />2、建一SP调该sp且使用它的结果集 </p><p>CREATE PROCEDURE DB2INST1&#46;Proc2 ( <br />out out_market_code char(1)) <br /> LANGUAGE SQL <br />------------------------------------------------------------------------ <br />-- SQL 存储过程 <br />------------------------------------------------------------------------ <br />P1: BEGIN </p><p>declare loc1,loc2 result_set_locator varying; <br />--建立一个结果集数组 <br />call proc1; <br />--调用该SP返回结果集。 <br />associate result set locator(loc1,loc2) with procedure proc1; <br />--将返回结果集和结果集数组关联 <br />allocate cursor1 cursor for result set loc1; <br />allocate cursor2 cursor for result set loc2; <br />--将结果集数组分配给cursor <br />fetch cursor1 into out_market_code; <br />--直接从结果集中赋值 <br />close cursor1; </p><p>END P1 </p><p>3、动态SQL写法 <br /> DECLARE CURSOR C1 FOR STMT1; <br /> PREPARE STMT1 FROM <br /> 'ALLOCATE C2 CURSOR FOR RESULT SET ?'; <br />4、注意: <br />一、 如果一个sp调用好几次,只能取到最近一次调用的结果集。 <br />二、 allocate的cursor不能再次open,但可以close,是close sp中的对应cursor。 </p><p>1&#46;13 类型转换函数 <br />select cast ( current time as char(8)) from tb_market_code </p><p>1&#46;14 存储过程的互相调用 <br />目前,c sp可以互相调用。 <br />Sql sp 可以互相调用, <br />Sql sp 可以调用C sp, <br />但C sp 不可以调用Sql sp(最新的说法是可以) </p><p>1&#46;15 C存储过程参数注意 <br />create procedure pr_clear_task_ctrl( <br />IN IN_BRANCH_CODE char(4), <br /> IN IN_TRADEDATE char(8), <br /> IN IN_TASK_ID char(2), <br /> IN IN_SUB_TASK_ID char(4), <br /> OUT OUT_SUCCESS_FLAG INTEGER ) <br /> <br />DYNAMIC RESULT SETS 0 <br />LANGUAGE C <br />PARAMETER STYLE GENERAL WITH NULLS(如果不是这样,sql 的sp将不能调用该用c写的存储过程,产生保护性错误) <br />NO DBINFO <br />FENCED <br />MODIFIES SQL DATA <br />EXTERNAL NAME 'pr_clear_task_ctrl!pr_clear_task_ctrl'@ </p><p><br />1&#46;16 存储过程fence及unfence <br />fence的存储过程单独启用一个新的地址空间,而unfence的存储过程和调用它的进程使用同一个地址空间。 <br />一般而言,fence的存储过程比较安全。 <br />但有时一些特殊的要求,如要取调用者的pid,则fence的存储过程会取不到,而只有unfence的能取到。 </p><p>1&#46;17 SP错误处理用法 <br />如果在SP中调用其它的有返回值的,包括结果集、临时表和输出参数类型的SP, <br />DB2会自动发出一个SQLWarning。而在我们原来的处理中对于SQLWarning都 <br />会插入到日志,这样子最后会出现多条SQLCODE=0的警告信息。 <br />处理办法: <br />定义一个标志变量,比如DECLARE V_STATUS INTEGER DEFAULT 0, <br />在CALL SPNAME之后, SET V_STATUS = 1, <br />DECLARE CONTINUE HANDLER FOR SQLWARNING <br />BEGIN <br />IF V_STATUS <> 1 THEN <br />--警告处理,插入日志 <br />SET V_STATUS = 0; <br />END IF; <br />END; <br />1&#46;18 import用法 <br />db2 import from gh1&#46;out of DEL messages err&#46;txt insert into db2inst1&#46;tb_dbf_match_ha </p><p>注意要加schma </p><p>1&#46;19 values的使用 <br />如果有多个 set 语句给变量付值,最好使用values语句,改写为一句。这样可以提高效率。 <br /> <br />但要注意,values不能将null值付给一个变量。 <br />values(null) into out_return_code; <br />这个语句会报错的。 </p><p><br />1&#46;20 给select 语句指定隔离级别 <br />select * from tb_head_stock_balance with ur <br /> <br />1&#46;21 atomic及not atomic区别 <br />atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。 </p><p><br />2 DB2编程性能注意 </p><p><br />2&#46;1 大数据的导表 <br />应该是export后再load性能更好,因为load不写日志。 <br />比select into 要好。 </p><p><br />2&#46;2 SQL语句尽量写复杂SQL <br /> 尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。 <br /> DB2的SQL Engieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。 <br />Oracle 则相反,推荐将复杂的语句简单化,SQL Engieer的优化能力不是特别好。 <br />这是因为每一个SQL语句都会有reset SQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。 <br />一个总的思想就是尽量减少SQL语句的个数。 <br />2&#46;3 SQL SP及C SP的选择 <br />首先,C的sp的性能比sql 的sp 的要高。 <br />一般而言,SQL语句比较复杂,而逻辑比较简单,sql sp 与 c sp 的性能差异会比较小,这样从工作量考虑,用SQL写比较好。 <br />而如果逻辑比较复杂,SQL比较简单,用c写比较好。 </p><p>2&#46;4 查询的优化(HASH及RR_TO_RS) <br />db2set DB2_HASH_JOIN=Y (HASH排序优化) <br /> 指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。 <br /> 剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下 72秒。 </p><p>db2set DB2_RR_TO_RS=Y <br />该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS&#46; <br />这样,db2不用管理Next key,可以少管理一些东西,这样可以提高性能。 </p><p><br />2&#46;5 避免使用count(*) 及exists的方法 <br />1、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。 <br />2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。 </p><p>如果做这两中操作的目的是为 <br /> select into 服务的话,就可以省略掉这两步。 <br />直接使用select into 选择记录中的字段。 </p><p>如果是没有记录选择到的话,db2 会将 sqlcode=100 和 sqlstate=’20000’ <br />如果是有多条记录的话,db2会产生一个错误。 </p><p>程序可以创建 continue handler for exception <br /> continue handler for not found <br />来检测。 <br />这是最快速的方法。 </p><p>3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。这个速度也比count(*) 要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。 </p><p><br />3 DB2表及sp管理 </p><p><br />3&#46;1 看存储过程文本 <br />select text from syscat&#46;procedures where procname='PROC1'; <br />3&#46;2 看表结构 <br />describe table syscat&#46;procedures <br />describe select * from syscat&#46;procedures </p><p>3&#46;3 查看各表对sp的影响(被哪些sp使用) <br />select PROCNAME from SYSCAT&#46;PROCEDURES where SPECIFICNAME in(select dname from sysibm&#46;sysdependencies where bname in ( select PKGNAME from syscat&#46;packagedep where bname='TB_BRANCH')) </p><p><br />3&#46;4 查看sp使用了哪些表 <br />select bname from syscat&#46;packagedep where btype='T' and pkgname in(select bname from sysibm&#46;sysdependencies where dname in (select specificname from syscat&#46;procedures where procname='PR_CLEAR_MATCH_DIVIDE_SHA')) <br />3&#46;5 查看function被哪些sp使用 <br />select PROCNAME from SYSCAT&#46;PROCEDURES where SPECIFICNAME in(select dname from sysibm&#46;sysdependencies where bname in ( select PKGNAME from syscat&#46;packagedep where bname in (select SPECIFICNAME from SYSCAT&#46;functions where funcname='GET_CURRENT_DATE'))) </p><p><br />使用function时要注意,如果想drop 掉该function必须要先将调用该function的其它存储过程全部drop掉。 <br />必须先创建function,调用该function的sp才可以创建成功。 <br />3&#46;6 修改表结构 <br />一次给一个表增加多个字段 <br />db2 "alter table tb_test add column t1 char(1) add column t2 char(2) add column t3 int" </p><p><br />4 DB2系统管理 </p><p><br />4&#46;1 DB2安装 <br /> 在Windows 98 下安装db2 7&#46;1 或其他版本,如果有Jdbc错误或者是Windwos 98不能启动,则将autoexec&#46;bat 中的内容用如下内容替换: </p><p><br />C:\PROGRA~1\TRENDP~1\PCSCAN&#46;EXE C:\ C:\WINDOWS\COMMAND\ /NS /WIN95 <br />rem C:\WINDOWS\COMMAND&#46;COM /E:32768 <br />REM </p><p>REM </p><p>REM </p><p>REM </p><p>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 <br />IF EXIST C:\PROGRA~1\IBM\IMNNQ\IMQENV&#46;BAT CALL C:\PROGRA~1\IBM\IMNNQ\IMQENV&#46;BAT <br />IF EXIST C:\PROGRA~1\IBM\IMNNQ\IMNENV&#46;BAT CALL C:\PROGRA~1\IBM\IMNNQ\IMNENV&#46;BAT <br />set DB2INSTANCE=DB2 <br />set CLASSPATH=&#46;;C:\PROGRA~1\SQLLIB\java\db2java&#46;zip;C:\PROGRA~1\SQLLIB\java\runtime&#46;zip;C:\PROGRA~1\SQLLIB\java\sqlj&#46;zip;C:\PROGRA~1\SQLLIB\bin <br />set MDIS_PROFILE=C:\PROGRA~1\SQLLIB\METADATA\PROFILES <br />set LC_ALL=ZH_CN <br />set INCLUDE=C:\PROGRA~1\SQLLIB\INCLUDE;C:\PROGRA~1\SQLLIB\LIB;C:\PROGRA~1\SQLLIB\TEMPLATES\INCLUDE <br />set LIB=C:\PROGRA~1\SQLLIB\LIB <br />set DB2PATH=C:\PROGRA~1\SQLLIB <br />set DB2TEMPDIR=C:\PROGRA~1\SQLLIB <br />set VWS_TEMPLATES=C:\PROGRA~1\SQLLIB\TEMPLATES <br />set VWS_LOGGING=C:\PROGRA~1\SQLLIB\LOGGING <br />set VWSPATH=C:\PROGRA~1\SQLLIB <br />set VWS_FOLDER=IBM DB2 <br />set ICM_FOLDER=信息目录管理器 </p><p>win </p><p><br />4&#46;2 创建Database <br />create database head using codeset IBM-eucCN territory CN; <br />这样可以支持中文。 </p><p><br />4&#46;3 手工做数据库远程(别名)配置 <br />db2 catalog tcpip node node1 remote 172&#46;28&#46;200&#46;200 server 50000 <br />db2 catalog db head as test1 at node node1 </p><p>然后既可使用: <br /> db2 connect to test1 user … using … <br />连上head库了 </p><p>4&#46;4 停止启动数据库实例 <br />db2start <br />db2stop (force) </p><p><br />4&#46;5 连接数据库及看当前连接数据库 <br />连接数据库 <br />db2 connect to head user db2inst1 using db2inst1 </p><p>当前连接数据库 <br />db2 connect <br />4&#46;6 停止启动数据库head <br />db2 activate db head <br />db2 deactivate db head <br />要注意的是,如果有连接,使用deactivate db 不起作用。 <br />如果是用activate db启动的数据库,一定要用deactivate db才会停止该数据库。(当然如果是db2stop也会停止)。 <br />使用activate db,这样可以减少第一次连接时的等待时间。 <br />Database如果不是使用activate db启动而是通过连接数据库而启动的话,当所有的连接都退出后,db也就自动停止。 </p><p>4&#46;7 查看及停止数据库当前的应用程序 <br />查看应用程序: <br />db2 list applications show detail </p><p>授权标识 | 应用程序名 | 应用程序句柄 | 应用程序标识 | 序号# | 代理程序 | 协调程序 | 状态 | 状态更改时间 | DB 名 | DB 路径| | 节点号 | pid/线程 </p><p>其中:1、应用程序标识的第一部分是应用程序的IP地址,不过是已16进制表示的。 <br />2、pid/线程即是在unix下看到的线程号。 </p><p>停止应用程序: <br />db2 "force application(236)" <br />db2 “force application all” </p><p>其中:该236是查看中的应用程序句柄。 </p><p><br />4&#46;8 查看本instance下有哪些database <br />db2 LIST DATABASE DIRECTORY [ on /home/db2inst1 ] <br />4&#46;9 查看及更改数据库head的配置 <br />请注意,在大多数情况下,更改了数据的配置后,只有在所有的连接全部断掉后才会生效。 </p><p>查看数据库head的配制 <br />db2 get db cfg for head </p><p><br />更改数据库head的某个设置的值 <br />4&#46;9&#46;1 改排序堆的大小 <br />db2 update db cfg for head using SORTHEAP 2048 <br />将排序堆的大小改为2048个页面,查询比较多的应用最好将该值设置比较大一些。 <br />4&#46;9&#46;2 改事物日志的大小 <br />db2 update db cfg for head using logfilsiz 40000 <br />该项内容的大小要和数据库的事物处理相适应,如果事物比较大,应该要将该值改大一点。否则很容易处理日志文件满的错误。 </p><p>4&#46;9&#46;3 出现程序堆内存不足时修改程序堆内存大小 <br />db2 update db cfg for head using applheapsz 40000 <br />该值不能太小,否则会没有足够的内存来运行应用程序。 </p><p>4&#46;10 查看及更改数据库实例的配置 <br />查看数据库实例配置 <br />db2 get dbm cfg <br />更改数据库实例配制 </p><p>4&#46;10&#46;1 打开对锁定情况的监控。 <br />db2 update dbm cfg using dft_mon_lock on <br />4&#46;10&#46;2 更改诊断错误捕捉级别 <br />db2 update dbm cfg using diaglevel 3 <br />0 为不记录信息 <br />1 为仅记录错误 <br />2 记录服务和非服务错误 <br />缺省是3,记录db2的错误和警告 <br />4 是记录全部信息,包括成功执行的信息 <br />一般情况下,请不要用4,会造成db2的运行速度非常慢。 </p><p><br />4&#46;11 db2环境变量 <br />db2 重装后用如下方式设置db2的环境变量,以保证sp可编译 <br />将set_cpl 放到AIX上, chmod +x set_cpl, 再运行之 </p><p>set_cpl的内容 <br />db2set DB2_SQLROUTINE_COMPILE_COMMAND="xlc_r -g \ <br />-I$HOME/sqllib/include SQLROUTINE_FILENAME&#46;c \ <br />-bE:SQLROUTINE_FILENAME&#46;exp -e SQLROUTINE_ENTRY \ <br />-o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -lc -ldb2" </p><p>db2set DB2_SQLROUTINE_KEEP_FILES=1 <br />4&#46;12 db2命令环境设置 <br />db2=>list command options <br />db2=>update command options using C off--或on,只是临时改变 <br />db2=>db2set db2options=+c --或-c,永久改变 </p><p>4&#46;13 改变隔离级别 <br />DB2SET DB2_SQLROUTINE_PREPOPTS=CS|RR|RS|UR </p><p>交互环境更改session的隔离级别, <br /> db2 change isolation to UR <br />请注意只有没有连接数据库时可以这样来改变隔离级别。 </p><p>4&#46;14 管理db\instance的参数 <br />get db cfg for head(db) <br />get dbm cfg(instance) </p><p>4&#46;15 升级后消除版本问题 <br />db2 bind @db2ubind&#46;lst <br />db2 bind @db2cli&#46;lst </p><p>4&#46;16 查看数据库表的死锁 <br />再用命令中心查询数据时要注意,如果用了交互式查询数据,命令中心将会给所查的记录加了s锁&#46;这时如果要update记录,由于update要使用x锁,排它锁,将会处于锁等待&#46; </p><p>首先,将监视开关打开 <br />db2 update dbm cfg using dft_mon_lock on <br />快照 <br /> db2 get snapshot for Locks on cleardb >snap&#46;log <br /> tables <br />bufferpools <br />tablespaces <br />database <br /> 然后再看snap&#46;log中的内容即可。 <br />对Lock可根据Application handle(应用程序句柄)看每个应用程序的锁的情况。 <br />监视完毕后,不要忘了将监视器关闭 <br /> db2 update dbm cfg using dft_mon_lock off</p><p>六、DB2常用知识</p><p>以下主要以DB27&#46;X为基础的&#46;以下的字符为小写&#46;</p><p>  本文对DB2高手来说是不用看的&#46;</p><p>  1&#46;DB2产品的级别有那些?</p><p>  企业版的 ENTERPRISE EDITION</p><p>  工作组版 WORKGROUP EDITION</p><p>  企业扩展版 ENTERPRISE EXTENDED EDITION</p><p>  个人版的 PERSONAL EDITION</p><p>  卫星版的 SATELLITE EDITION</p><p>  微型版的 EVERYPLACE</p><p>  </p><p>  2&#46;可以连接到DB2数据库的产品有哪些?</p><p>  DB2客户端</p><p>  DB2CONNECT</p><p>  DB2DATA PROPAGATOR</p><p>  DB2NET&#46;DATA</p><p>  DB2DATA JOINER</p><p>  DB2 RELATIONAL CONNECT</p><p>  WEBSPHERE应用服务器</p><p>  等</p><p>  </p><p>  3&#46;DB2支持的通讯协议有哪些?</p><p>  TCP/IP</p><p>  NETBIOS</p><p>  APPG</p><p>  IPX/SPX</p><p>  NAMEPIPE</p><p>  等</p><p>  </p><p>  4&#46;DB2客户端产品有哪些?</p><p>  DB2运行时间客户端DB2 RUNTIME CLIENT</p><p>  DB2管理客户端DB2ADMINI STRATION CLIENT</p><p>  DB2应用程序开发客户端DB2 APPLICATION DEVELOP MENT CLIENT</p><p>  DB2瘦客户端 DB2 THIN CLIENT</p><p>  </p><p>  5&#46;一个数据库是否可以安装在多个数据库服务器上?</p><p>  可以</p><p>  </p><p>  6&#46;从哪个版本后存储过程可以用SQL语句来创建?</p><p>  7&#46;1版后</p><p>  </p><p>  7&#46;DB2提供哪些关系扩展器?</p><p>  文本扩展器 TEXT EXTENDER</p><p>  图象扩展器 IMAGE EXTENDER</p><p>  音频扩展器 AUDIO EXTENDER</p><p>  视频扩展器 VIDEO EXTENDER</p><p>  空间数据扩展器 SPATIAL EXTENDER</p><p>  XML扩展器 XML EXTENDER</p><p>  网络搜索扩展器NET&#46;SEARCH EXTENDER</p><p>  </p><p>  8&#46;WINDOWS和OS/2环境下的DB2安装目录结构?</p><p>  用SETUP&#46;EXE来安装</p><p>  </p><p>  \SQLLIB安装的根目录,包括README文件</p><p>  \SQLLIB\ADSM包含ADSTAR分布式存储管理器文件</p><p>  \SQLLIB\BIN包含DB2工具的可执行文件</p><p>  \SQLLIB\BND包含DB2工具的绑定文件</p><p>  \SQLLIB\CC包含运行控制中心所需的文件</p><p>  \SQLLIB\CFG包含默认的系统配置文件</p><p>  \SQLLIB\CONV包含代码页转换表文件</p><p>  \SQLLIB\DB2默认的实例目录</p><p>  \SQLLIB\DB2DAS00缺省的DB2管理服务器目录</p><p>  \SQLLIB\DOC包含DB2联机手册</p><p>  \SQLLIB\FUNCTION默认的用户自定义函数目录</p><p>  \SQLLIB\FUNCTION\UNFENCED默认的非隔离用户自定义函授目录</p><p>  \SQLLIB\HELP联机帮助文件</p><p>  \SQLLIB\JAVADB2所需的JAVA类库</p><p>  JAVA12包含JDK1&#46;2的支持程序</p><p>  \SQLLIB\MISC包含HTML搜索服务器文件</p><p>  \SQLLIB\MSG\PRIME包含信息文件</p><p>  \SQLLIB\QP包含QUERYPATROLLER的客户端文件</p><p>  \SQLLIB\SAMPLES包含样例程序和样例脚本</p><p>  \SQLLIB\SPMLOG包含DB2同步点管理器日志文件</p><p>  \SQLLIB\THNSETUP包含瘦客户端安装文件</p><p>  9&#46;UNIX和LINUX环境下的DB2安装目录结构?</p><p>  用DB2SETUP&#46;EXE来安装</p><p>  安装的根目录下还将创建以下目录:</p><p>  </p><p>  README安装的根目录,包括README文件</p><p>  ADM包含系统管理工具文件</p><p>  ADSM包含ADSTAR分布式存储管理器文件</p><p>  BIN包含DB2工具的二进制可执行文件</p><p>  BND包含DB2工具的绑定文件</p><p>  CC包含运行控制中心所需的文件</p><p>  CFG包含默认的系统配置文件</p><p>  CONV包含代码页转换表文件</p><p>  DOC包含DB2联机手册</p><p>  FUNCTION默认的用户自定义函数目录</p><p>  FUNCTION\UNFENCED默认的非隔离用ё远ㄒ搴
页: [1]
查看完整版本: DB2