2003-11-7 14:03
燕狂徒
怎么样验证DB2安装是否已经成功?<br />若尚未未安装 DB2 工具,则您可以通过创建 SAMPLE 数据库, 并通过使用命令行处理器与该数据库相连来验证安装,如下所示: <br />步骤 1. <br />作为具有系统管理 (SYSADM) 权限的用户向系统注册。 <br /><br />步骤 2. <br />输入 db2sampl 命令以便创建 SAMPLE 数据库。 <br /><br />创建 SAMPLE 数据库时, 用数据库别名 SAMPLE 将它自动编目。 <br /><br />步骤 3. <br />输入 db2start 命令以启动数据库管理程序。 <br /><br />步骤 4. <br />输入下列命令来与 SAMPLE 数据库相连, 检索在部门 20 中工作的所有雇员的列表,并重设数据库连接: <br />db2 connect to sample<br />db2 "select * from staff where dept = 20"<br />db2 connect reset<br />如以上命令均正确执行, 则证明DB2 UDB 数据库服务器的安装已经成功完成.<br />怎样判断DB2实例的版本号和修补级别?<br />用db2level命令。在DB2 5.2及以上版本中,在安装每个DB2实例时,即会<br />装入db2level程序。db2level命令的输出提供了有关DB2实例的版本及<br />修补级别的详细信息。<br />命令输出如下所示:<br />DB21085I Instance "<instance_name>" uses DB2 code<br />release "<rel_ver_mod>" with level identifier<br />"<level_id>" and informational tokens "<build_id1>", "<build_id2>"<br />and "<build_id3>".<br />例如:<br />DB21085I Instance "DB2" uses DB2 code release "SQL05020"<br />with level identifier "02070103" and informational tokens <br />"DB2 v5.2.0.30","c990717" and "WR21119".<br />下面解释以下这些信息:<br /><instance_name> = DB2 DB2的实例名<br /><rel_ver_mod> = SQL05020 Release号05,Version号02,Module号0<br /><level_id> = 02070103 内部使用的DB2版本号<br /><build_id1> = DB2 v5.2.0.30 实例的版本信息<br /><build_id2> = c990717 代码的级别信息<br /><build_id3> = WR2119 修补的级别信息<br />注:db2level执行程序不能在不同的系统之间拷贝使用。<br />并且此程序只显示正式支持的修补级别信息。<br />对于DB2版本5.0和2.0,可用如下方法获得版本信息:<br />OS/2:syslevel命令<br />NT:查询regedit变量:HKEY_LOCAL_MACHINE | <br />SOFTWARE | IBM | DB2 | DB2<br />universal database xx edition |<br />CurrentVersion<br />AIX:用dump -H<br /> $HOME/sqllib/lib/libdb2e.a <br />Solaris: cat命令查看文件信息 <br /> /opt/IBMdb2/V5.0/cfg/bldlevel or<br />"ldd -s<br />$HOME/sqllib/lib/libdb2e.so |<br />grep engn|grep search|uniq" <br />HP: cat命令查看文件信息<br /> /opt/IBMdb2/V5.0/cfgbldlevel<br /><br />如何通过TCP/IP协议编目(CATALOG)节点和数据库<br />利用TCP/IP协议编目数节点和数据库首先要知道数据库所在服务器端的IP地址。<br />此外知道数据所属实例(instance)TCP/IP协议所用的服务名对应的对口号:<br />在服务器端,用 db2 get dbm cfg 得到SVCENAME参数值,在services文件中(NT环境该文件在winnt/system32/drivers/etc目录下,Unix环境在etc目录下)查参数值对应的端口号。<br /><br />然后编目节点<br />db2 catalog tcp ip node 节点名(可自己起名)remote IP地址 server 端口号<br />执行 db2 terminate 使编目节点命令生效<br /><br />再编目数据库<br />db2 catalog database 数据库名 as 希望的数据库别名 at node 节点名<br />执行 db2 terminate 使编目数据库命令生效<br /> <br /><br />怎样用命令行通过db2 connect用来访问AS/400和 OS/390<br />在windows/aix平台上访问db/400有两种方法. 一是通过as/400所提供的client access, 二是通过db2 connect产品(该产品被包含在db2 ESE版本中也可单独订购).<br />有两种方法来配置db2 connect从而达到访问db/400的目的. 一是通过db2 connect带的客户端配置帮助db2cca(client configuration assistant), 该程序是GUI界面, 易于使用, 这里就不详述了.二是通过db2命令行的命令, <br />在aix机器上没有db2cca<br />这里主要介绍了如何使用db2命令行的方式来访问db/400.<br />首先保证已经在当前客户机安装了db2connect<br />命令如下:<br />db2 catalog tcpip node node400 remote as400ip server 446<br />db2 catalog DCS db db400 as as400local<br />db2 catalog db db400 at node node400 authentication DCS<br />测试连接<br />connect to db400 user 用户名using 口令<br />其中db400是数据库在客户端的别名, as400local是as/400本地数据库名, 您可以在as/400命令行发wrkrdbdire命令来获取该名. as400ip是as/400服务器的ip地址或主机名.<br />如果您没有正确的编目db/400上, 您可能会得到sql5048n的错误信息. 另外一个常见的错误是sql7008n,该错误表示在as/400上的db2表没有被日志化. 为了解决这个问题, 您可以日志化需要被访问的表或改变隔离级别到'no commit'<br />下面是从命令行连接OS/390机器得DB2<br />首先保证已经在winnt/system32/devices/etc/hosts文件中加入了 <br />主机ip地址 os390(机器名)<br />catalog tcpip node os390 remote os390 server 446 ostype MVS<br />catalog DCS database db390<br />catalog database db390 as db390 at node os390 authentication DCS<br />下面测试连接connect to db390 user 用户名 using 口令<br /><br />在客户端命令行已经编目并且能够连接UNIX服务器上的数据库,但是在控制中心中察看样本数据时报代码页不匹配的错误<br />将UNIX服务器上的数据库编目到客户端本地且连接成功,能够用SELECT命令查询数据,但是在控制中心中察看该数据库中表的样本数据时报代码页不匹配的错误。<br />这可能是因为服务器上管理实例代码页设置和客户端不一致引起。<br />如客户端代码页环境为1386,UNIX服务器上数据库代码页同为1386,这样在客户端命令行可以成功地连接到服务器上的数据库。<br />但如果服务器上管理实例的用户,通常为db2as用户,代码页设置为819,在客户端控制中心访问服务器上的数据库时就会发生上面的错误。<br />上面情况的解决个办法为,<br />以db2as用户登陆,运行<br />db2set db2codepage=819<br />db2 terminate<br />db2stop<br />db2start<br />然后在客户端重新连接数据库。<br /><br />何为db2的实例(instance)?<br />实例是一种逻辑数据库管理器环境,在该环境中可以编目数据库和设置配置参数。可以在同一物理服务器上创建多个实例,并为每个实例提供唯一的数据库服务器环境。多个实例可以提供下列内容: <br />将一个实例用于开发环境,而将另一个实例用于生产环境。 <br />为特定环境调整实例。 <br />限制存取机密信息。 <br />控制为每个实例指定 SYSADM、SYSCTRL 和 SYSMAINT 权限。 <br />优化每个实例的数据库管理器配置。 <br />限制实例故障的影响。如果发生实例故障,则只有一个实例受影响。其它实例可以继续正常工作。 <br />多个实例将需要: <br />每个实例的附加系统资源(虚拟内存和磁盘空间)。 <br />更多管理任务,因为要管理附加实例。 <br />在 Windows 系统上,确保没有实例名与服务名相同。 <br />您可以: <br />创建实例。 <br />删除实例。 <br />启动实例。 <br />停止实例。 <br />连接实例。 <br /><br />如何在UNIX环境下如何设定是否在启动操作系统后自动启动实例?<br />使用db2iauto命令,可以设定是否在启动操作系统后自动启动实例,参数如下:<br />db2iauto -on/-off 实例名<br />例如希望在启动操作系统后不自动启动实例db2inst1,执行:<br />db2iauto -off db2inst1<br />db2iauto命令不能控制管理实例。<br /><br />如何更改本地系统名称<br />在控制中心(Control Center)中,可以看到编目在节点下的系统名称。可启动控制中心的节点作为本地系统,名称是不能在这里改变的。那么如何改变本地系统的名称呢?<br />首先,从控制中心(Control Center)中知道本地系统所在的原节点名。<br />然后退出控制中心,在命令行处理器中输入以下命令:<br /><br />1. db2set db2system=新系统名<br />2. db2 terminate<br />3. db2 uncatalog node 原节点名<br />4. db2 terminate<br /><br />重起控制中心,可以看到,本地系统名已更改。<br /><br />quit和terminate都可以退出DB2 CLP。但是Terminate同时终止了后台的进程并清空了所分配的内存。<br />下面列出在命令行下启动启动DB2图形工具的命令:<br />图形工具名称 命令<br />控制中心(Control Center) db2cc<br />命令中心(Command Center) db2cmdctr<br />配置助手(Configuration Assistance) db2ca<br />健康中心(Health Center) db2hc<br />任务中心(Task Center) db2tc<br />开发中心(Development Center) db2dc<br />命令窗口(Command Widow) db2cmd<br />日志中心(Journal) db2journal<br />内存可视化器(Memory Visualizer) db2memvis<br />信息中心(Information Center) db2ic<br />复制中心(Replication Center) db2rc<br />如何在Unix平台上启动DB2控制中心(Control Center)<br />再Unix平台上启动DB2控制中心需要一下几个步骤,以AIX操作系统为例: <br />1. 安装DB2时选择安装DB2控制中心(Control Center);<br />2. 以root账号登录,输入xhost +命令(每次重新启动Unix后需输入该条命令以启动控制中心);<br />3. 以DB2实例管理员账号登录,输入以下命令<br /> a. db2jstrt<br /> b. db2cc<br />这样,就启动了DB2控制中心(Control Center)。<br /><br /> 在创建数据库时遇到数据库别名已存在的问题时,可以:<br />1. 首先用 db2 list database directory 命令看在系统数据库目录(System Database Directory)中有没有该数据库,如果有,应该在确定该数据库是没有用的数据库之后用 db2 drop database 数据库名 将其删除。<br /> <br />2. 如果没有,再用 db2 list database directory on location 看在本地数据库目录(Local Database Directory)中有没有该数据库,location指定数据库的位置(如Windows下的C: ,Unix下的/home/db2inst1)。如果有,先用 db2 catalog database 数据库名 on location将数据库编目到节点上,再对其进行删除处理。<br /><br /><br /><br />如果一个实例下同时存在代码页为819和代码为1386的数据库,如何在客户端调用不同数据库代码页的数据库中的JAVA存储过程?<br />当然,客户端首先要设置正确的DB2CODEPAGE环境变量来连接不同数据库代码页的数据库。<br />假设实例中有两个数据库,DB1386和DB819,其中DB1386的代码页为1386而DB819的代码页为819。<br />如果在服务器上设置DB2环境变量DB2CODEPAGE为1386然后启动实例,客户端可以成功地调用数据库DB1386中JAVA存储过程,但是客户端调用数据库DB819中的存储过程时会遇到下面错误:<br />SQL4304N Java 存储过程或用户定义的函数 "...",特定名 "..." 不能装入 Java 级别 "...",原因码为 "5"。 SQLSTATE=42724<br />使用 db2 ? sql4304n 查看SQLCODE SQL4304N的原因:<br />SQL4304N Java 存储过程或用户定义函数 "<名称>"(特定名<br />"<特定名>")不能装入 Java 类 "<类>",原因代码为<br />"<原因代码>"。<br />解释:<br />不能装入由 CREATE PROCEDURE 或 CREATE FUNCTION 语句的 EXTERNAL<br />NAME 子句给定的 Java 类。原因代码为:<br />...<br />5 未能建立缺省上下文。<br />...<br />反之,如果在服务器上将DB2环境变量DB2CODEPAGE设置为819然后启动DB2实例,客户端调用DB1386中存储过程也会碰到SQL4304N错误。<br />解决上面的问题的办法是在服务器上设置DB2CODEPAGE=1208,即设置DB2环境变量DB2CODEPAGE为UNICODE,然后启动实例。这样,从不同客户端可以分别成功地调用不同数据库代码页的数据库中的JAVA存储过程。<br />注意,使用db2set db2codepage=1208的命令后,执行db2 terminate才能在当前SESSION中立即生效。<br />为什么客户端在命令行可以访问Unix平台上的数据库,而在控制中心中连接时却显示数据库代码页不匹配?<br />如果Unix服务器上数据库代码页为1386,客户端代码页环境同为1386,在命令行编目Unix服务器上的数据库且成功连接。<br />但是在控制中心中连接该数据库时却显示数据库代码页不匹配(SQL0332N)?<br />这可能是因为服务器上管理实例的代码页设置为英文引起的。<br />如果服务器上管理实例用户为db2as,用db2as用户登陆,执行以下命令:<br />db2set db2codepage=1386<br />db2 terminate<br />db2stop<br />db2start<br />然后,在客户端命令中心中重新连接目标数据库。<br /><br />如何在命令行下查看修改实例和数据库配置参数<br />在命令行下查看实例的配置参数,可用 db2 get dbm cfg 命令实现。<br />类似地用 db2 get db cfg for 数据库名 可以得到数据库的配置参数。<br />以下是数据库参数的一部分:<br />Log file size (4KB) (LOGFILSIZ) = 250<br />Number of primary log files (LOGPRIMARY) = 3<br />Number of secondary log files (LOGSECOND) = 2<br />修改实例配置参数,用 db2 update dbm cfg using 参数名 新值<br />类似,用 db2 update db cfg for 数据库名 using 参数名 新值 修改数据库配置参数。<br /><br />例如,要修改sample数据库配置参数中的LOGPRIMARY为10,可用以下命令实现:<br />db2 update db cfg for sample using logprimary 10<br /><br />如何在命令行下执行DB2脚本(script)<br />在命令窗口中运行DB2脚本,可用 db2 -svtf 脚本文件名 来实现。<br />例如,脚本文件名为sample.sql,运行:db2 -svtf sample.sql<br /><br /> 参数中:<br /> s 代表遇到错误时中止运行脚本<br /> v 代表输出结果到屏幕<br /> t 指以;号作为每行的分隔符<br /> f 指后面需跟脚本文件名<br /><br /> 如果希望即使遇到错误也不要中止运行可以去掉参数s。<br /><br /><br />数据库创建以后相关的目录和文件都有哪一些?<br />数据库目录<br />当创建一个数据库时,DB2 会创建一个单独的子目录来存储控制文件(如日志头文件)并将容器分配给缺省表空间。与该数据库相关的对象并非始终存储在该数据库目录中;它们可以存储在不同的位置(包括设备)中。 <br />该数据库是在 DB2INSTANCE 环境变量定义的实例中创建的,或是在已显式连接(使用 ATTACH 命令)的实例中创建的。<br /><br />在基于 UNIX 的系统上使用的命名模式是: <br />specified_path/$DB2INSTANCE/NODEnnnn/SQL00001<br />在 OS/2 和 Windows 操作系统上使用的命名模式: <br />D:\$DB2INSTANCE\NODEnnnn\SQL00001<br />其中<br />• specified_path 是用来安装该实例的可选的、用户指定的位置。 <br />• NODEnnnn 是分区数据库环境中的节点标识符。第一个节点是 NODE0000。 <br />• "D:" 是标识根目录所在的卷的“盘符”。 <br />SQL00001 包含与创建的第一个数据库相关的对象,并给予后续数据库更大的数字:SQL00002,依此类推。 <br /><br />子目录在与 数据库管理程序实例同名的目录中创建,该实例是在创建数据库时连接的。(在 OS/2 和 Windows 操作系统上,子目录在由“盘符”标识的卷的根目录下创建。)这些实例和数据库子目录在 CREATE DATABASE 命令指定的路径中创建,且数据库管理程序自动维护它们。每个实例可能由一个实例拥有者拥有(这取决于您使用的平台),该拥有者对属于该实例的数据库具有系统管理员 (SYSADM) 权限。 <br /><br />要避免潜在的问题,不要创建使用相同命名模式的目录,不要操纵已经由数据库管理程序创建的目录。 <br />数据库文件<br />与数据库相关的文件包括: <br />文件名 说明<br />SQLDBCON 此文件存储数据库的调整参数和标志。有关更改数据库配置参数的详情,参考管理指南:性能。 <br />SQLOGCTL.LFH 此文件有助于跟踪和控制所有数据库日志文件。<br />Syyyyyyy.LOG 数据库日志文件,编号从 0000000 至 9999999。这些文件的编号由 logprimary 和 logsecond 数据库配置参数控制。<br /> 个别文件的大小由 logfilsiz 数据库配置参数控制。<br /> 通过使用循环记录,可重新使用这些文件,且保持相同的编号。通过使用归档记录,当将日志归档并分配新日志时,文件编号将依次增 加。当达到 9999999 时,该编号绕回。 <br /> 缺省情况下,这些日志文件存储在 SQLOGDIR 目录中。SQLOGDIR 在 SQLnnnnn 子目录中。 <br />SQLINSLK 此文件帮助确保数据库只由 数据库管理程序 的一个实例使用。<br />SQLTMPLK 此文件帮助确保数据库只由 数据库管理程序 的一个实例使用。 <br />SQLSPCS.1 此文件包含该数据库中所有表空间的定义和当前状态。<br />SQLSPCS.2 此文件是 SQLSPCS.1 的副本。若没有这两个文件中的任何一个,则不能存取您的数据库。<br />SQLBP.1 此文件包含数据库中所使用的所有缓冲池的定义。<br />SQLBP.2 此文件是 SQLBP.1 的副本。若没有这两个文件中的任何一个,则不能存取您的数据库。<br />DB2RHIST.ASC 此文件是数据库历史文件。它保存对数据库执行的管理操作的历史记录,如备份和复原操作。 <br />DB2RHIST.BAK 此文件是 DB2RHIST.ASC 的副本。<br />注意: <br />1. 不要直接更改这些文件。只能使用记载的 API 和实现那些 API 的工具(包括命令行处理器和 控制中心)来间接存取它们。 <br />2. 不要移动这些文件。 <br />3. 不要除去这些文件。 <br />4. 备份数据库或表空间唯一受支持的方法是通过 sqlubkp(备份数据库)API 来进行,包括该 API 的命令行处理器和 控制中心实现。 <br /> 为什么使用用户名密码连接数据库时报SQL1402N错误,但是不加用户名密码却可以成功地连接数据库<br />为什么使用用户名密码连接数据库时报SQL1402N错误,但是不加用户名密码却可以成功地连接数据库?<br />$ db2 connect to sample user db2inst1 using ibmdb2<br />SQL1402N Unable to authenticate user due to unexpected system error. <br />$ db2 connect to sample<br />Database Connection Information<br />Database server = DB2/6000 7.2.6<br />SQL authorization ID = DB2INST1<br />Local database alias = SAMPLE<br />遇到这情况,请首先检查$INSTHOME/sqllib/security目录下的文件属性。<br />正确的用户和属组显示如下:<br />[/home/db2inst7/sqllib/security]ls -l<br />total 198<br />-r-s--x--x -1 db2inst1 db2iadm1 -25019 Jan 09 19:33 db2aud<br />-rw-r--r-- -1 db2inst1 db2iadm1 --4096 Jan 09 19:33 db2audit.cfg<br />lrwxrwxrwx -1 root ----system ------36 Jan 09 19:33 db2chkau -> /usr/lpp/db2_07_01/security/db2chkau<br />-r-s--x--x -1 root ----db2iadm1 -14387 Jan 09 19:33 db2chpw<br />-r-s--x--x -1 root ----db2iadm1 -20374 Jan 09 19:33 db2ckpw<br />-r-x--s--x -1 db2inst1 db2iadm1 -33027 Jan 09 19:33 db2flacc<br />有时,因为用户在上级目录变更用户属组时使用-R参数,造成下级目录中文件、目录的用户属组也被改变。例如:<br />[/home/db2inst1/sqllib/security]ls -l<br />total 198<br />-r-s--x--x -1 db2inst1 db2iadm1 -25019 Jan 09 19:33 db2aud<br />-rw-r--r-- -1 db2inst1 db2iadm1 --4096 Jan 09 19:33 db2audit.cfg<br />lrwxrwxrwx -1 root ----system ------36 Jan 09 19:33 db2chkau -> /usr/lpp/db2_07_01/security/db2chkau<br />-r-s--x--x -1 db2inst1 db2iadm1 -14387 Jan 09 19:33 db2chpw<br />-r-s--x--x -1 db2inst1 db2iadm1 -20374 Jan 09 19:33 db2ckpw<br />-r-x--s--x -1 db2inst1 db2iadm1 -33027 Jan 09 19:33 db2flacc<br />上面的输出中db2ckpw,和db2chpw的用户被错误地改成db2inst1,造成连接时验证用户失败。修改其用户属性为root,则可以成功地连接数据库。<br />$ db2 connect to sample user db2inst1 using ibmdb2<br />--Database Connection Information<br />Database server -----= DB2/6000 7.2.6<br />SQL authorization ID = DB2INST1<br />Local database alias = SAMPLE<br />注意,不要使用-R参数在$INSTNAME目录下修改文件和目录用户和属组,有一些子目录下的文件、目录的用户属组并不是实例用户和实例用户所属的组。<br />yxfeng@Beijing.sema.slb.com