db2常见操作
程序员文章站
2022-03-26 13:01:28
...
1. 用SQL脚本创建表 db2 -tvf create_table.sql db2 -tvf pub_app_par.sql 2. 命令行编译存储过程方法: db2 -td@ -f 存储过程文件.sql @表示存储过程开始和结束的标识 执行一个批处理文件 db2 –tf 批处理文件名 (文件中每一条命令用 ;结束) 自动生成批处理文件 建文本文件:temp.sql select 'runstats on table DB2.' || tabname || ' with distribution and detailed indexes all;' from syscat.tables where tabschema='DB2' and type='T'; db2 –tf temp.sql>;runstats.sql db2 " call 存储过程名称(参数1,参数2) " 2.1 导出表的相关结构到一个文件中 db2look -e -d ods_ibb -t M_IBB_F_F_TX_CIB_SCURA > tmp2.sql db2look -e -d ods_ibb -t M_IBB_F_F_TX_STP_DEP_FUND_INFO > tmp2.sql 3. 表空间赋权限 db2 "GRANT USE OF TABLESPACE TBS_DATA_1 TO USER IBB" db2 "GRANT USE OF TABLESPACE TBS_DATA_2 TO USER IBB" db2 "GRANT USE OF TABLESPACE TBS_IDX_1 TO USER IBB" 好像DB2只能修改VARCHAR2类型的并且只能增加不能减少 建议解决方案步骤: 1.首先如何查看表的结构(命令:DESCRIBLETABLE TABLE_NAME),最好用NOTE先记下. 2.重新写一个table.sql脚本 3.删除表,drop table 4.重新创表db2 -td! -f table.sql 4. 杀进程 db2 force application all 5. 查看表 db2look -e -d ods_ibb -t M_IBB_A_RPT_MSR_IDXDAT 6. 连接数据库 db2 connect to odsdb 7. 更改表名 RENAME TABLE xxx to xxx_new; 8. load方法(KEEPBLANKS 加这个关键字后,不会掉空格 ) db2 load from ${table}.del of del modified by coldel| KEEPBLANKS replace into ${table} db2 load from M_IBB_D_CODCMP.del of del modified by coldel: replace into M_IBB_D_CODCMP db2 load from yz.txt of del modified by coldel: replace into yz_table db2 load from pub_app_par.del of del replace into pub_app_par db2 load from f_dp_tdp_fdmda_c_20081119.dat of del modified by coldel0x03 keepblanks usedefaults nochardel replace into f_dp_tdp_fdmda_c load client from /ibb/ibbfile/input/20081119/f_tx_nin_cmjna_20081119.dat of del modified by coldel0x03 keepblanks usedefaults nochardel replace into f_tx_nin_cmjna 挑选部分字段装载: load from t.del of del method p(1,2) insert into t_table1(sid1,name3) 9. import方法 db2 alter table ${table} activate not logged initially db2 import from ${table}.ixf of ixf commitcount 1000 replace into ${table} 9.1.导出表数据 db2 export to M_IBB_D_CODCMP.del of del select * from M_IBB_D_CODCMP db2 export to m_ibb_prog_log.del of del select * from M_IBB_PROG_LOG db2 export to c:\dftz.ixf of ixf select * from dftz db2 " export to pb_cstlog.del of del select LOGNO ,TRANDATE ,TRANTIME ,CSTNO, ACCNO,TRANCODE,RESULT,INFO,IP,MAC,ISIMPORTENT,date(days(current date) -1 ) from PB_CSTLOG " 9.2.导入表数据 import from c:\123.txt of del insert into ylbx.czyxx db2 import to c:\dftz.txt of del commitcount 5000 messages c:\dftz.msg insert into dftz db2 import to c:\dftz.ixf of ixf commitcount 5000 messages c:\dftz.msg insert into dftz db2 import to c:\dftz.ixf of ixf commitcount 5000 insert into dftz db2 import to c:\dftz.ixf of ixf commitcount 5000 insert_update into dftz db2 import to c:\dftz.ixf of ixf commitcount 5000 replace into dftz db2 import to c:\dftz.ixf of ixf commitcount 5000 create into dftz (仅IXF) db2 import to c:\dftz.ixf of ixf commitcount 5000 replace_create into dftz (仅IXF) 10. 取前几条记录 select * from table fetch first n rows only 11. 查看当前db2实例中有那些数据库: 12. 查看数据库中有那些表: db2 connect to db_name user xxx using xxxx db2 connect to ods_ibb user ibb using ibb db2 list tables 13 列出用户创建的所有表 db2 list tables for user_name 13.1 修改表的结构 ALTER TABLE M_IBB_F_MID_LNACCT ADD COLUMN JGNO CHAR(6); 14 列出所有schema为xx的表 db2 list tables for schema xxx 15. 在DB2中 merge可以用,测试通过: MERGE INTO temp2 as a USING (select a from temp1) as b on b.a=a.a WHEN MATCHED THEN UPDATE set a.a=b.a WHEN NOT MATCHED THEN INSERT VALUES (b.a, b.a) 15.1 查询当前系统的日期 select current date from sysibm.sysdummy1; 16. 查看某个表中的字段情况: db2 describe table table_name db2 describe table table_name show detail 16.1 显示这个表是否为空的情况 describe select * from M_IBB_F_MID_WJIEFA select is_nullable from sysibm.columns where table_name='M_IBB_F_MID_WJIEFA' and ordinal_position=12 17.查看数据库服务器中有几个数据库。包括网络中数据库的引用。 进入数据库安装目录下的bin目录:C:\Program Files\IBM\SQLLIB\BIN 执行db2 list database directory命令 18.查看命令选项说明 list command options 19.查看运行的数据库服务器中关联了多少个引用程序对数据库的访问。 进入数据库安装目录下的bin目录:C:\Program Files\IBM\SQLLIB\BIN db2 list applications命令 可以通过db2 force application(进程id) 杀死对应的进程。 20.如何强制断开应用程序和数据库的连接。 进入数据库安装目录下的bin目录:C:\Program Files\IBM\SQLLIB\BIN 行下列的命令 db2 force applications 可以强制断开应用程序和数据库的连接。 21.如何备份数据库 进入db2的操作环境,然后运行 backup database 数据库别名 user 用户名 using 密码命令 22. 复制表结构 create table tmp_famp as (select * from famp) definition only create table test_luxt like M_IBB_F_F_NI_FDA_FAMP_A 22.1 把表中的记录直接插入进去。 insert into t_table2 select * from lccoa 做个编目: CATALOG TCPIP NODE dev88node REMOTE 22.5.228.88 50002 CATALOG DATABASE ods_ibb AT NODE dev88node db2 CATALOG TCPIP NODE dev179 REMOTE 22.5.228.179 server 50000 ---OK db2 CATALOG DATABASE etlplus AT NODE dev179 db2 CATALOG TCPIP NODE dev1 REMOTE 22.5.234.1 server 50000 db2 CATALOG DATABASE etlplusn AT NODE dev1 dev1 编目后要重新退出后连接下: db2 connect to etlplus user db2inst1 using db2inst1 db2 uncatalog node 23. 存储过程procedure 调用,传出的参数用“?”代替, db2 "call func_test2(dec_to_dt(20080808),?)" db2 " call PROC_M_IBB_A_RPT_LN_OCRNCE('20080809',?) " 24. 退出db2命令行 quit 24. 退出cmd exit 24.1 创建nickname db2 "grant select,delete,insert,update on table prog_log to user ibb" db2 "grant select,delete,insert,update,control,alter,index,references on table prog_log to user ibb" 创建昵称: CREATE NICKNAME IBB.PROG_LOG FOR ETLPLUS.ODSUSR.PROG_LOG; 25. 表被锁死 先用db2 "select tabname from syscat. where tabschema='db2inst1'"取出来表名 db2 "CREATE EVENT MONITOR TB_EVENTS FOR TABLES,DEADLOCKS with details WRITE TO file 'PATH'" db2 "set EVENT MONITOR TB_EVENTS state 1" 这个是收集死锁信息。 db2evmon -db dbname -evm TB_EVENTS 这个到存放的目录下,察看死锁信息 抓个snapshot for locks吧 snapshot先 然后再用event monitor ================================================================================ 26. 导出数据的表结构 windows下面用db2look -d bdcc60 -e -a -x -i db2admin -w bdcc -o createdb.sql命令导出数据的表结构, db2look -d ods_ibb -e -a -x -i ibb -w ibb -o odsibb.sql db2look -d ibbdbbak -e -dp -i odsusr -w odsusr -o ods_ibb.sql --输出函数、表结构等 db2look -d ibbdbbak -e -dp -i odsusr -w odsusr -o ods_ibb.sql db2look -d leafloca -l -e -o leafloca.ddl -------导出表结构和索引、表空间-----[正确] db2look -d ods_ibb -e -tw % >ods.sql db2look -d ods_ibb -e -dp -tw % >ods_ibb.sql ---(含DROP ) 然后用db2move bdcc60 export -u db2admin -p bdcc命令导出表数据, db2look -d M_IBB_A_CI_BALSHT -e -a -x -i db2admin -w M_IBB_A_CI_BALSHT -o createdb.sql 但是在运行db2move bdcc60 时,导入表数据。【也许会报一个错误】 ================================================================================ 27. 用db2look -d tjoa -z DB2INST1 -e -o tjoa.ddl -i db2inst1 -w db2inst1 语句 db2look -d ods_ibb -z DB2INST2 -e -o ods_ibb.ddl -i db2inst2 -w db2inst2 生成 ddl语句 其中包括 生成表索引等于语句 28. 用db2 -tvf e:/temp/db/tjoa.ddl 创建表 29. 用db2 "select 'export to ' || rtrim(tabname) || '.ixf of ixf select * from ' || rtrim(tabname) || ';' from syscat.tables where tabschema = 'DB2INST1'" > export.sql 语句生成导出语句文件 编辑文件、去掉开头结尾 并给每条语句的导出文件加上路径 用 db2 -tvf export.sql 导出表 在你加上的路径中便是导出文件 用db2 "select 'load from ' || rtrim(tabname) || '.ixf of ixf insert into ' || rtrim(tabname) || ';' from syscat.tables where tabschema = 'DB2INST1'" > load.sql 生成倒入语句文件 编辑文件、去掉开头结尾、并给每条语句的导入文件加上路径 用 db2 -tvf e:/temp/db/load.sql 导入数据 后建原手工建的表空间 ================================================================================ DB2数据库 0.在一张表中取前n条记录并insert到新表的SQL如何写? insert into table select * from table fetch first n rows only 1、Load 方法装入数据: export to tempfile of del select * from TABLENAME where not 清理条件; load from tempfile of del modified by delprioritychar replace into TABLENAME nonrecoverable; 说明: 在不相关的数据表export数据时,可以采取并发的形式,以提高效率; TABLENAME指待清理table的名称; modified by delprioritychar防止数据库记录中存在换行符,导致数据无法装入的情况; replace into对现数据库中的内容进行替换,即将现行的数据记录清理,替换为数据文件内容; nonrecoverable无日志方式装入; 2、查找当前的应用: db2 list application |grep BTPDBS; 3、删除当前正在使用的application: db2 "force application (Id1,Id2,Id3)" Id1,Id2,Id3 是List显示的应用号; 4、查看当前应用号的执行状态: db2 get snapshot for application agentid 299 |grep Row 5、查看数据库参数: db2 get db cfg for <dbsname> //当前数据库可以省略 6、修改数据库的Log数据: db2 update db cfg using <参数名> <参数值> 7、Db2Stop Force的用法: 在进行Bind的时候出现如下错误: SQL0082C An error has occurred which has terminated processing. SQL0092N No package was created because of previous errors. SQL0091N Binding was ended with "3" errors and "0" warnings. 主要是表文件被加锁,不能继续使用; 在进行stop的时候报错:db2stop 8/03/2005 21:46:53 0 0 SQL1025N The database manager was not stopped because databases are still active. SQL1025N The database manager was not stopped because databases are still active. 需要使用如下命令可以解决这个问题: db2stop force 08/03/2005 21:47:49 0 0 SQL1064N DB2STOP processing was successful. SQL1064N DB2STOP processing was successful. 然后启动数据库db2start,连接数据库db2s后,重新进行bind即可。 8、缓冲池参数修改: db2 alter bufferpool ibmdefaultbp size 10240 查看本表的数据内容如下: db2 "select * from syscat.bufferpools"; 9、DB2 日志处理: DB2日志是以文件的形式存放在文件系统中,分为两种模式:循环日志和归档日志。当创建新数据库时,日志的缺省模式是循环日志。在这种模式下,只能实现数据库的脱机备份和恢复。如果要实现联机备份和恢复,必须设为归档日志模式。 目前在综合业务系统中,设置的均是归档日志模式;其它系统(如事后监督、经营决策、中间业务等)一般都设置为循环日志模式。至于采用何种模式,可以通过修改数据库配置参数(LOGRETAIN)来实现: 归档日志模式:db2 update db cfg for <dbname> using logretain on 注:改为on后,查看数据库配置参数logretain的值时,实际显示的是recovery。改变此参数后,再次连接数据库会显示数据库处于备份暂挂(BACKUP PENDING)状态。这时,需要做一次对数据库的脱机备份(db2 backup db <dbname>),才能使数据库状态变为正常。 循环日志模式:db2 update db cfg for <dbname> using logretain off 10、Db2 日志处理: 必须按照以下正确的步骤进行操作: 􀁺 要求必须使用DB2命令PRUNE进行清理,不建议使用rm命令删除。 􀁺 删除前应保证应用已停止(即联机已下来)。 􀁺 查看当前使用的日志文件目录及第一活动日志文件 􀂾 用 “db2 get db cfg for <dbname>”命令查看日志文件目录(Path to log files)参数,确定数据库当前使用的日志文件目录。 例如:Path to log files = /db2log/,说明DB2日志存放目录是/db2log 􀂾 用 “db2 get db cfg for <dbname>”命令查看第一活动日志文件(First active log file)参数,该参数对应的日志文件之前的日志文件均为归档日志文件,如果确认没有用,可以删除。 例如:First active log file = S0015913.LOG,说明当前第一活动日志文件是S0015913.LOG。 􀁺 备份好要删除的归档日志 􀁺 删除归档日志 以应用用户(如BTP)登录,执行: $ db2 connect to <dbname> $ db2 prune logfile prior to S???????.LOG 注:S???????.LOG为查看到的第一活动日志文件。此命令可以将当前第一活动日志文件之前的归档日志文件全部删除。 11、如何清理db2diag.log文件 db2diag.log,是用来记录DB2数据库运行中的信息的文件。可以通过此文件,查看记录的有关DB2数据库详细的错误信息。此文件也是不断增大的,需要定期进行清理。 可以通过查看实例的配置参数DIAGPATH,来确定db2diag.log文件是放在哪个目录下:db2 get dbm cfg 如果Diagnostic data directory path(DIAGPATH) = /home/db2inst1/sqllib/db2dump,则此文件是放在/home/db2inst1/sqllib/db2dump目录下。当文件系统/home的使用率达到80%-90%左右时,应及时删除db2diag.log文件。 请按以下正确步骤操作: 􀁺 确认应用(如BTP)、DB2已经停止。 􀁺 将原db2diag.log文件备份到其它文件系统下。 􀁺 删除db2diag.log文件。删除后,DB2会自动创建一个新的文件。 12、Load 操作 在进行load的时候 db2 "load from acmmst.txt of del modified by coldel| replace into acmmst nonrecoverable ” 由于数据不规范出现错误,强行中断以后,进行操作的时候出现如下错误: SQL0668N Operation not allowed for reason code "3" on table "BTP.ACMMST". SQLSTATE=57016 此时,进行反方向操作即可: db2 "load from /dev/null of del terminate into acmmst nonrecoverable"。 如果没有使用参数nonrecoverable,则会出现数据库状态不正确的情况,使用: db2 list tablesapces show detail 查看状态,如果不是正常状态,则脱机状态进行备份即可。 两个表文件之间UPDATE的方法: db2 "update cdmcrd set offset = (select cdmlsl.offset from cdmlsl where cdmlsl.crdno=cdmcrd.crdno) where cdmcrd.crdno in (select cdmlsl.crdno from cdmlsl) 13、多字段条件查询和修改: 表A中的字段有actno, cnlno,bal,pwd;表B中的字段为Actno,Cnlno,TxnAmt;目的是将A表中的bal修改为B表中的TxnAmt,命令: db2 "update A set bal=(select txnamt from B where actno=A.actno and cnlno=A.Cnlno) where A.actno||A.cnlno in (select Actno||cnlno from B ); 14、多条件匹配查询 查询某个表中条件是B?AAA的记录: db2 "select * from A where actno like 'B_AAA%'". 查询数据中存在某些字符的记录: db2 "select * from A where actno like '%-AAA%". 15/数据库恢复的处理 进行数据库恢复的时候使用以下的命令: restore db db1 to /tstdb2/catalog into db newlogpath /tstdb2/db2log buffer 2048 replace existing redirect parallelism 16; set tablespace containers for 1 using (path '/tstdb2/db2tmp'); set tablespace containers for 2 using (device '/dev/rtstcontlv00' 2621440, device '/dev/rtstcontlv01' 2621440, device '/dev/rtstcontlv02' 2621440, device '/dev/rtstcontlv03' 2621440 ) ; restore db db1 continue; 恢复完成以后执行命令db2s时报如下的错误: P570:>db2s SQL1117N A connection to or activation of database "DB" cannot be made because of ROLL-FORWARD PENDING. SQLSTATE=57019 DB21034E The command was processed as an SQL statement because it was not a valid Command Line Processor command. During SQL processing it returned: SQL1024N A database connection does not exist. SQLSTATE=08003 解决办法如下: P570:>db2 rollforward db db to end of logs and complete Rollforward Status Input database alias = db Number of nodes have returned status = 1 Node number = 0 Rollforward status = not pending Next log file to be read = Log files processed = - Last committed transaction = 2005-11-20-10.59.23.000000 DB20000I The ROLLFORWARD command completed successfully. 16. 创建表空间时的OVERHEAD参数是做什么用的? OVERHEAD,它提供容器所需时间的估计(以毫秒计),在该时间后才将数据读入内存。此开销活动包括容器的 I/O 控制器开销以及磁盘等待时间,后者包括磁盘寻道时间。 可使用以下公式来帮助估计开销成本: OVERHEAD = 以毫秒计的平均寻道时间 +(0.5 * 旋转等待时间) 其中: 0.5 表示半个旋转的平均开销 对每个完整的旋转计算以毫秒计的旋转等待时间,如下所示: (1 / RPM) * 60 * 1000 其中: 除以每分钟旋转次数来获得每个旋转所需的分钟数 乘以 60 秒/分 乘以 1000 毫秒/秒 例如,假定磁盘每分钟旋转 7 200 次。使用旋转等待时间公式,结果如下: (1 / 7200) * 60 * 1000 = 8.328 毫秒 然后可假定平均寻道时间为 11 毫秒,使用以上结果计算 OVERHEAD 估计值: OVERHEAD = 11 + (0.5 * 8.32 = 15.164 得出大约 15 毫秒的 OVERHEAD 估计值。 来自 db2 info center 17.在LINUX下开机自动启动DB2 写个脚本 起个文件名叫 S99db2start.sh #!/usr/bin . path/db2profile db2start 18.DB2的备份和恢复问题 本人使用Veritas Netbackup对db2数据库进行备份,我是参照veritas的文档来操作的,但有些问题依然不清楚。 1. 将数据库的logretain和userexit设置为on后,在实例目录/home/db2inst1目录下的db2.conf文件中设置归档日志路径: OBJECTTYPE ARCHIVE DATABASE RMDB POLICY DB2_Log_Policy SCHEDULE User #ARCFUNC SAVE ARCFUNC COPY ARCDIR /home/db2inst1/arcdir RETDIR /home/db2inst1/arcdir ENDOPER 我看文档说明,/home/db2inst1/arcdir就是归档日志路径,即当日志切换时,归档日志就会拷贝到/home/db2inst1/arcdir下,但是我备份数据库成功若干次后,在该目录下未发现任何文件,该目录是空目录,请问原因是什么? 2. 文档上给出的恢复命令较为简单: $db2 restore db NBJSW LOAD /usr/openv/netbackup/bin/nbdb2.so64 $db2 rollforward db sample to end of logs and stop 我想请问,基于时间点的恢复如何操作。比如我要恢复一个月前的数据库,那么命令格式是什么呢? 19.主要是性能监控方面 db2 get snapshot for dynamic sql on databasename : //////////////////////////////////////////////////////////////////// 存储过程的写法 : create procedure getRecord(OUT flag integer) LANGUAGE SQL BEGIN DECLARE i_tmp integer; select count(id) into i_tmp from table_name ; if i_tmp>1 THEN SET flag = 1 ; else SET flag = 0 ; end if ; END ----------------------------- create procedure getRecord(OUT flag integer) LANGUAGE SQL BEGIN DECLARE i_tmp integer; DECLARE v_id integer DEFAULT 0; declare c1 cursor with return to caller for select count(value) as num from cibdemo_append; open c1; FETCH FROM c1 INTO v_id ; set flag =v_id; INSERT INTO my_log(id,code) VALUES('11',v_id); commit; END --------------------------------------------------------- 试试下面的方法吧 1、DB2 CREATE TABLE T1EXC LIKE T2 T1EXC为例外表,它继承了T2的结构,不继承数据。 2、DB2 CREATE TABLE T1EXC AS ( SELECT * FORM T2) DEFINITION ONLY T1EXC继承T2的结构和数据 db2 create view v_t(a,b) as (select * from t1 union all select * from t2) 4、DB2中只比较年月? A、SUBSTR(CHAR(字段名),1,7) B、 SELECT YEAR(QYRQ) FROM tablename SELECT MONTH(QYRQ) FROM tablename 如果你要的格式是200809这样的格式也可以的,建一个TO_CHAR函数. CREATE FUNCTION ORAFUN.TO_CHAR ( TIMESTAMP_IN DATE, FORMAT_STRING VARCHAR(200) ) RETURN with parts(yyyy, mm, dd, ddd, d, fday, ww) as ( values (substr(char(timestamp_in), 1, 4), substr(char(timestamp_in), 6, 2), substr(char(timestamp_in), 9, 2), char(dayofyear(timestamp_in)), char( dayofweek(timestamp_in)), '', char(week(timestamp_in)) )) select rtrim(replace(replace(replace(replace(replace(replace(replace( UCASE( format_string), '"', ''), 'YYYY', yyyy), 'MM', mm), 'DDD', ddd), 'DD', dd), 'DAY', fday), 'D', d)) from parts; SELECT to_char(QYRQ,'yyyymm') FROM tablename C、 字段名:D_DATE YEAR(D_DATE)*100+MONTH(D_DATE) 5\ 关于DB2中日期加、减一个整数来求加减后的日期 ? date(timestamp(日期型列名或者变量) -7 days 我试过了下面两个sql语句都能执行 select date('2008-01-01') +10 days from sysibm.sysdummy1 select current date + 10 day from sysibm.sysdummy1 SELECT CURRENT TIME FROM DUAL; '22:44:51' SELECT CURRENT DATE FROM DUAL; '2008-06-17' SELECT current date + 1 YEAR FROM DUAL; '2009-06-17' SELECT current date - 1 YEAR FROM DUAL; '2007-06-17' SELECT current date + 1 YEARS + 1 MONTHS + 1 DAYS FROM DUAL; '2009-07-18' SELECT current time + 1 HOURS - 1 MINUTES + 1 SECONDS FROM DUAL '23:43:33' 6\SQL 语句后面with的作用 ? select count(*) from ntr.table_name with ur 后面的with ur 是做什么用的? 和select count(*) from ntr.table_name 有什么区别吗? 答案:有区别, 加上with ur的话,是脏读,有 insert 的操作,但是没有commit的,也一样会得到,如果不加的话,是不会得到其他事物中没有commit的insert的数据的 脏读是什么? 脏读就是,其他的事物如果insert一条纪录,但是他还没有commit的时候,你应该是读不到的,脏读就可以读到,他可以读到其他事物中没有提交的数据。 7\如何查询一个表是否已经部署在数据库里面了 ? 在DB2里,查询一个表是否部署在数据库里,可以用以下的语句 SELECT * FROM SYSCAT.COLUMNS WHERE TABNAME=' <table_name>' AND TABSCHEMA=' <schema_name>' ORDER BY COLNO; 在db2中varchar和character有何区别? character 就是char, 1.最大长度不同,char 最大254 bytes,varchar 最大 32672 bytes 2 存储不同 char(n) 在数据库占用 n 个字节,在数据库中以空格补足,但在取出来时末尾的空格将被去掉 varchar(n) 在数据库中至少占用1个字节,在数据库中末尾的空格将自动去掉,实际占用录入数据长度 +1 或者 +2 字节。 L 数据长度 L+1 bytes L <=M 0 <=M <=256 L+2 bytes L <=M 256 <M <=32672 在数据库中末尾的空格将自动去掉 8、 只是1天吗?visit_time=current date -1 days 一天以上用days函数啊,例如 where days(current date)-days(sitbirthday)> 1 ================================================================================= 结 , 注意事项 , 经验 , IBM , DB2数据库 , 数据 , DB2 , 注意 1.在安装DB2数据库后,你可以通过命令行方式或图形界面方式来操作,假如你的数据库服务端不在本机,则需要在“客户机配置辅助程序”中做一个客户端连接的配置。 2.控制中心中无法增删改数据,只能编写sql语句来实现而quest提供的工具虽然能增加数据,但居然无法用复制、粘贴和Tab键,必须逐个输入,然后用鼠标点击切换现存数据看来可以在单元格中编辑修改,但实际却无法commit,呵呵,还是老老实实写update语句,至于删除数据,更是非写delete语句不可。不过可以用PB以单元格方式编辑数据,相应的一个缺点是编辑数据的按钮和删除表的按钮太近,万一点错了删除表的按钮,pb可是不作提示就把表给删了的,faint 3.DB2的视图里不能直接用order by语句,必须这样写: select × from(select a,b,c from table1 order by a)as tab 注释:这种写法的前提是你已经打过补丁了 4.存储过程的问题: DB2提供ltrim函数和rtrim函数,但偏偏不提供trim函数,如果你希望去除字符两端的空格, 对不起,必须用ltrim(rtrim()) 的方式调用insert 语句里面居然不能用表达式赋值,必须把值先赋给一个变量调用其他存储过程时竟然不能用常量做参数,必须把这个常量的值赋给一个变量,再以这个变量为参数 select * from table fetch first n rows only 语句居然在存储过程里不可用 5.存储过程里可以使用动态sql,但函数里却不可以使用,kao 6. 遇到commit或rollback时自动关闭游标,所以需要慎重使用单独提交。 proc builder老是在调试中内存不足,屏幕花掉。而如果断点调试时暂停不进行下去的时间稍微长一点就会提示超时,受不了。 7.开发问题: 在使用 日期变量+1 MONTHS OR 日期变量-1 MONTHS 的方式取日期时,比如日期变量值为 2004-02-29时,存储过程里将日期变量+1 MONTHS 赋值给另一 日期变量时会出错。相应SQLSTATE为01506(db2 ? 01506): 对 DATE 或TIMESTAMP值进行了调整,以校正算术运算得出的无效日期。 如果要获取的只是下一月份,可采用的替代方法是获取当前日期所在月份的第一天作为基准后+1 MONTHS OR -1 MONTHS 8.对变量的赋值不能用select ..into ..方式而要用set v=(select ..)的方式,具体的示例如下: drop function SXFM.ISORDERSUBMITDATE; CREATE FUNCTION SXFM.ISORDERSUBMITDATE(IN_ROW_ID DECIMAL(16,0)) RETURNS DATE LANGUAGE SQL BEGIN ATOMIC DECLARE V_SUBMIT_DATE DATE; DECLARE V_SELL_ID DECIMAL(16, 0); DECLARE V_BUY_ID DECIMAL(16, 0); set V_SELL_ID = (SELECT COALESCE(RECEIVE_ID,-1) FROM IS_ORDER WHERE ROW_ID=IN_ROW_ID); set V_BUY_ID = (SELECT COALESCE(PAY_ID,-1) FROM IS_ORDER WHERE ROW_ID=IN_ROW_ID); set V_SUBMIT_DATE = (SELECT DATE(MAX(A.SUBMIT_DATE)) FROM AM_AUDIT_QUEUE A,SM_USER B,SM_USER C WHERE A.TABLE_CODE=’IS_ORDER’ AND A.TABLE_ROW_ID=IN_ROW_ID AND A.AUDIT_EMP_ID=C.ROW_ID AND C.BRANCH_ID=V_BUY_ID --审核方为付款方 AND A.SUBMIT_EMP_ID=B.ROW_ID AND B.BRANCH_ID=V_SELL_ID); --提交方为收款方 RETURN V_SUBMIT_DATE; END; #SYNC 10; =============================================================================== 10、DB2有类似与ORACLE中的merge这个东东没? 要看你的DB2版本,V9是一定有MERGE的(我正在用),其他版本就不确定了,查一下SQL REFERENCE就知道啦。 MERGE INTO TARGET_TABLE USING SOURCE_TABLE WHEN MATCHED THEN UPDATE ()=() WHEN NOT MATCHED THEN INSERT () VALUES () 如果你的DB2没有MERGE,那么就试试用export+import咯,import的REPLACE关键字可以覆盖掉已有记录,小心点用,先用少数据量在测试服务器试试效果是否符合你要求。 方法1: 使用export import 格式 export to table_a.ixf of ixf SELECT * FROM table_a fetch first 10 rows only IMPORT FROM filename OF {IXF | ASC | DEL | WSF} INSERT | INSERT_UPDATE | REPLACE | REPLACE_CREATE | CREATE into table_b 例子: db2 create table t_import (id int not null primary key,name varchar(20),age int default 0) db2 create table t_import2 (id int not null primary key,name varchar(20),age int default 0) db2 insert into t_import values(1,'aaa',11),(2,'bbb',12),(3,'ccc',13)@ db2 export to d:/db2/sql/t_import.ixf of ixf select * from t_import db2 import from d:/db2/sql/t_import.ixf of ixf INSERT_UPDATE into t_import2 db2 select * from t_import2 db2 update t_import2 set name='abc',age =111 where id=2 db2 select * from t_import2 db2 import from d:/db2/sql/t_import.ixf of ixf INSERT_UPDATE into t_import2 db2 select * from t_import2 方法2 当然也可以先删除B 表中存在A 表中相同数据,然后插入就可以了 delete from t_import2 where id in(select id from t_import) insert into t_import2 select * from t_import 方法2 更方便 11、如何计算一个表所占空间的大小 select fpages from syscat.tables where tabname= <TABNAME> 、如何清理db2diag.log文件 直接 > /home/db2inst1/sqllib/db2dump/db2diag.log /home/db2inst1/sqllib/db2dump/下的可以直接rm掉! ================================================ 1.启动数据库 db2start 2.停止数据库 db2stop 3.连接数据库 db2 connect to o_yd user db2 using pwd 4.读数据库管理程序配置 db2 get dbm cfg 5.写数据库管理程序配置 db2 update dbm cfg using 参数名 参数值 6.读数据库的配置 db2 connect to o_yd user db2 using pwd db2 get db cfg for o_yd 7.写数据库的配置 db2 connect to o_yd user db2 using pwd db2 update db cfg for o_yd using 参数名 参数值 8.关闭所有应用连接 db2 force application all db2 force application ID1,ID2,,,Idn MODE ASYNC (db2 list application for db o_yd show detail) 9.备份数据库 db2 force application all db2 backup db o_yd to d: (db2 initialize tape on \\.\tape0) (db2 rewind tape on \\.\tape0) db2 backup db o_yd to \\.\tape0 10.恢复数据库 db2 restore db o_yd from d: to d: db2 restore db o_yd from \\.\tape0 to d: 11.绑定存储过程 db2 connect to o_yd user db2 using pwd db2 bind c:\dfplus.bnd 拷贝存储过程到服务器上的C:\sqllib\function目录中 12.整理表 db2 connect to o_yd user db2 using pwd db2 reorg table ydd db2 runstats on table ydd with distribution and indexes all 13.自动生成建表(视图)语句 在服务器上:C:\sqllib\misc目录中 db2 connect to o_yd user db2 using pwd db2look –d o_yd –u db2 –e –p –c c:\o_yd.txt db2look -d ods_ibb -u ibb -e -p -c c:\o_yd.txt 14.其他命令 grant dbadm on database to user bb 19select * from czyxx fetch first 1 rows only 20db2look –d ylbx –u db2admin –w –asd –a –e –o a.txt21. 显示当前用户所有表 list tables 15.列出所有的系统表 list tables for system 16.查看表结构 db2 describe select * from user.tables csdn上的是 lingyunfeipu (凌云)整理 17.db2 drop database ods_ibb ================================================ select int_to_dt (20080701,'yyyymmdd') from sysibm.sysdummy1 可以了,int_to_dt 17. 语句为:select VALUE(pbyaccounts,''), VALUE(pbyname,''),oprttype from tables001; 请高手指教,我不懂这个select语句的意思.VALUE(pbyname,''),代表的是什么? VALUE(pbyname,''),如果pbyname的值为NULL,就把它显示成空格输出,如果不是NULL,就正常输出 18. 查询得到所需的存储过程代码 比如在orcle里可以用类似下面的语句查询得到所需的存储过程代码: SELECT TEXT FROM USER_SOURCE -- or DBA_SOURCE WHERE OWNER = :OWNER AND NAME = :NAME AND TYPE = :TYPE ORDER BY LINE; db2 select text from syscat.procedures where procschema= and procname= db2look导出也可以 请教:在syscat.procedures 中字段TEXT_BODY_OFFSET承载什么作用?如果该字段的值为-1那么表示什么意思,起到什么作用呢? 客气 If LANGUAGE = SQL, the offset to the start of the SQL procedure body in the full text of the CREATE statement; -1 if LANGUAGE is not SQL. 19. 判断贵宾理财中,不同区间下的客户拥有电话的情况 不需要case when 嵌套,只需要按组group by 即可。 select case when TOTALVALUE > 500 then A when TOTALVALUE < 500W and TOTALVALUE >=100W then B ...... end as 1 , count (distinct cust_no), --客户数量 count (distinct case when phone_num is not null then cust_no else null end), --有电话客户数量 from xxx group by 1 ; ======================================================================== 我的常用db2命令 关键字: db2 一、我的收集 1.如何取当前时间? SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1 2.转换数据类型 SELECT EMPNO, CAST(RESUME AS VARCHAR(370)) FROM EMP_RESUME WHERE RESUME_FORMAT = 'ascii' 3.如何快速清除一个大表? ALTER TABLE TABLE_NAME ACTIVE NOTLOGGED INITALLY WITH EMPTY TABLE INITIALIZE TAPE 4.如何知道当前DB2的版本? select * from sysibm.sysvERSIONS 5. db2start db2stop db2stop force 6. LOAD FORM detail.ixf OF IXF REPLACE INTO detail CREATE TABLE group_temp ( "NID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY ( START WITH +1 , INCREMENT BY +1 , NO CACHE ) , "PID" INTEGER NOT NULL WITH DEFAULT 0, "LVL" INTEGER NOT NULL WITH DEFAULT 0, "NAME" VARCHAR(30) , "REMARK" VARCHAR(30) , "DEPARTMENT" VARCHAR(30) , primary key (NID) ); create table dept (deptno smallint not null generated always as identity(start with 1, increment by 1), deptname varchar(36) not null, location char(30), primary key (deptno) ); 首先要建一个sequence create sequenct sequence_name start with start_value [step step_value] step step_value 是可选项,默认的时候是1 例: 创建: create sequence seq_test start with 1 提取: select nextval for seq_test from sysibm.sysdummy1 select row_number() over() from aryxx ; LOAD FORM product.ixf OF IXF INSERT INTO PRODUCT LOAD FROM INDEXING MODE REBUILD INSERT INTO PRODUCT db2look -d leafloca -l -e -o leafloca.ddl db2 connect to platform user db2admin using db2admin db2 " export to detail.ixf of IXF SELECT * FROM t_leaf_buy_detail " db2 " load from detail.ixf OF IXF replace INTO t_leaf_buy_detail " 7. 察看数据库配置参数信息 db2 get db cfg for platform 7.1修改列的类型 alter table xxx alter column yyy set data type decimal(p,q) DECIMAL (n, m) -> DECIMAL (p, q) p >= n; q >= m; (p-q) >= (n-m) 8. 更新数据库参数配置信息 db2 update db cfg for test using para_name para_value 9.察看端口号 db2 get dbm cfg|grep SVCENAME 10.生成数据库的定义 db2look -d db_alias -a -e -m -l -x -f -o db2look.sql db2look -d ods_ibb -a -e -m -l -x -f -o odsibb.sql 11.查看是哪张表挂起 db2 select tabname,tableid from syscat.tables where tableid=59 表名知道后到db2move.lst(在db2move YOURDB export的目录中)中找到相应的.ixf文件 db2 load from tab11.ixf of ixf terminate into db2admin.xxxxxxxxx tab11.ixf对应的是xxxxxxxxx表 db2 "load from acmmst.txt of del modified by coldel| replace into acmmst nonrecoverable ” LOAD FORM product.ixf OF IXF REPLACE INTO PRODUCT LOAD FORM product.ixf OF IXF INSERT INTO PRODUCT LOAD FROM INDEXING MODE REBUILD INSERT INTO PRODUCT db2 connect to leafloca user db2admin using db2admin db2 "EXPORT TO emp_photo.ixf of IXF SELECT * FROM emp_photo" db2 "EXPORT TO employee.del of DEL SELECT firstnme, lastname FROM employee FETCH FIRST 10 ROWS ONLY" db2 "IMPORT FROM emp_photo.ixf OF IXF COMMITCOUNT 10 REPLACE_CREATE INTO emp_photo_copy" db2 " LOAD FROM emp_photo.ixf OF IXF REPLACE INTO emp_photo_copy " db2 " LOAD FROM emp_photo.ixf OF IXF REPLACE INTO emp_photo_copy SET INTEGRITY FOR emp_photo_copy ALL IMMEDIATE UNCHECKED " db2look -d sample -l -e -o sample.ddl 12. database db2move leafloca export -u db2admin -p db2admin db2move leafloca import -u db2admin -p db2admin db2 backup database leafloca to d:\lic db2 restore database leafloca from d:\lic taken at 20070101 二、常用命令 1. 建立数据库DB2_GCB CREATE DATABASE DB2_GCB ON G: ALIAS DB2_GCB USING CODESET GBK TERRITORY CN COLLATE USING SYSTEM DFT_EXTENT_SZ 32 2. 连接数据库 connect to sample1 user db2admin using 8301206 3. 建立别名 create alias db2admin.tables for sysstat.tables; CREATE ALIAS DB2ADMIN.VIEWS FOR SYSCAT.VIEWS create alias db2admin.columns for syscat.columns; create alias guest.columns for syscat.columns; 4. 建立表 create table zjt_tables as (select * from tables) definition only; create table zjt_views as (select * from views) definition only; create table T_B_LEAF_SELL_DETAIL ( id DECIMAL(18) not null generated always as identity(start with 1,increment by 1), SELL_NO VARCHAR(13) , TYPE_CODE VARCHAR(6), SHAPE_CODE VARCHAR(6), GRADE_CODE VARCHAR(6), SELL_AMOUNT DECIMAL(16,4), PACKAGE_CODE VARCHAR(2), SELL_PRICE DECIMAL(16,4), SELL_MONEY DECIMAL(16,4), SELL_TAX DECIMAL(16,4), SELL_TAX_MONEY DECIMAL(16,4), constraint P_L_S_D primary key (id) ); 序列号create sequence seq_billcode start with 1 ; 取select nextval for seq_billcode from sysibm.sysdummy1 ;5. 插入记录 insert into zjt_tables select * from tables; insert into zjt_views select * from views; 6. 建立视图 create view V_zjt_tables as select tabschema,tabname from zjt_tables; 7. 建立触发器 CREATE TRIGGER zjt_tables_del AFTER DELETE ON zjt_tables REFERENCING OLD AS O FOR EACH ROW MODE DB2SQL Insert into zjt_tables1 values(substr(o.tabschema,1,8),substr(o.tabname,1,10)) 8. 建立唯一性索引 CREATE UNIQUE INDEX I_ztables_tabname ON zjt_tables(tabname); 9. 查看表 select tabname from tables where tabname='ZJT_TABLES'; 10. 查看列 select SUBSTR(COLNAME,1,20) as 列名,TYPENAME as 类型,LENGTH as 长度 from columns where tabname='ZJT_TABLES'; 11. 查看表结构 db2 describe table user1.department db2 describe select * from user.tables 12. 查看表的索引 db2 describe indexes for table user1.department 13. 查看视图 select viewname from views where viewname='V_ZJT_TABLES'; 14. 查看索引 select indname from indexes where indname='I_ZTABLES_TABNAME'; 15. 查看存贮过程 SELECT SUBSTR(PROCSCHEMA,1,15),SUBSTR(PROCNAME,1,15) FROM SYSCAT.PROCEDURES; 16. 类型转换(cast) ip datatype:varchar select cast(ip as integer)+50 from log_comm_failed 17. 重新连接 connect reset 18. 中断数据库连接 18.1删除bufferpool db2 drop bufferpool test disconnect db2_gcb 19. view application LIST APPLICATION; 20. kill application FORCE APPLICATION(0); db2 force applications all (强迫所有应用程序从数据库断开) 21. lock table lock table test in exclusive mode 22. 共享 lock table test in share mode 23. 显示当前用户所有表 list tables 24. 列出所有的系统表 list tables for system 25. 显示当前活动数据库 list active databases 26. 查看命令选项 list command options 27. 系统数据库目录 LIST DATABASE DIRECTORY 28. 表空间 list tablespaces 29. 表空间容器 LIST TABLESPACE CONTAINERS FOR Example: LIST TABLESPACE CONTAINERS FOR 1 30. 显示用户数据库的存取权限 GET AUTHORIZATIONS 31. 启动实例 DB2START 32. 停止实例 db2stop (force) 33. 表或视图特权 grant select,delete,insert,update on tables to user grant all on tables to user WITH GRANT OPTION 34. 程序包特权 GRANT EXECUTE ON PACKAGE PACKAGE-name TO PUBLIC 35. 模式特权 GRANT CREATEIN ON SCHEMA SCHEMA-name TO USER 36. 数据库特权 grant connect,createtab,dbadm on database to user 37. 索引特权 grant control on index index-name to user 38. 信息帮助 (? XXXnnnnn ) 例:? SQL30081 39. SQL 帮助(说明 SQL 语句的语法) help statement 例如,help SELECT 40. SQLSTATE 帮助(说明 SQL 的状态和类别代码) ? sqlstate 或 ? class-code 41. 更改与"管理服务器"相关的口令 db2admin setid username password 42. 创建 SAMPLE 数据库 db2sampl db2sampl F:(指定安装盘) 43. 使用操作系统命令 ! dir 44. 转换数据类型 (cast) SELECT EMPNO, CAST(RESUME AS VARCHAR(370)) FROM EMP_RESUME WHERE RESUME_FORMAT = 'ascii' 45. UDF 要运行 DB2 Java 存储过程或 UDF,还需要更新服务器上的 DB2 数据库管理程序配置,以包括在该机器上安装 JDK 的路径 db2 update dbm cfg using JDK11_PATH d:\sqllib\java\jdk TERMINATE update dbm cfg using SPM_NAME sample 46. 检查 DB2 数据库管理程序配置 db2 get dbm cfg 47. 检索具有特权的所有授权名 SELECT DISTINCT GRANTEE, GRANTEETYPE, 'DATABASE' FROM SYSCAT.DBAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'TABLE ' FROM SYSCAT.TABAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'PACKAGE ' FROM SYSCAT.PACKAGEAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'INDEX ' FROM SYSCAT.INDEXAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'COLUMN ' FROM SYSCAT.COLAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SCHEMA ' FROM SYSCAT.SCHEMAAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SERVER ' FROM SYSCAT.PASSTHRUAUTH ORDER BY GRANTEE, GRANTEETYPE, 3 create table yhdab (id varchar(10), password varchar(10), ywlx varchar(10), kh varchar(10)); create table ywlbb (ywlbbh varchar(8), ywmc varchar(60)) 48. 修改表结构 alter table yhdab ALTER kh SET DATA TYPE varchar(13); alter table yhdab ALTER ID SET DATA TYPE varchar(13); alter table lst_bsi alter bsi_money set data type int; insert into yhdab values ('20000300001','123456','user01','20000300001'), ('20000300002','123456','user02','20000300002'); 49. 业务类型说明 insert into ywlbb values ('user01','业务申请'), ('user02','业务撤消'), ('user03','费用查询'), ('user04','费用自缴'), ('user05','费用预存'), ('user06','密码修改'), ('user07','发票打印'), ('gl01','改用户基本信息'), ('gl02','更改支付信息'), ('gl03','日统计功能'), ('gl04','冲帐功能'), ('gl05','对帐功能'), ('gl06','计费功能'), ('gl07','综合统计') 二. 目录视图说明 说明 目录视图 检查约束 SYSCAT.CHECKS 列 SYSCAT.COLUMNS 检查约束引用的列 SYSCAT.COLCHECKS 关键字中使用的列 SYSCAT.KEYCOLUSE 数据类型 SYSCAT.DATATYPES 函数参数或函数结果 SYSCAT.FUNCPARMS 参考约束 SYSCAT.REFERENCES 模式 SYSCAT.SCHEMATA 表约束 SYSCAT.TABCONST 表 SYSCAT.TABLES 触发器 SYSCAT.TRIGGERS 用户定义函数 SYSCAT.FUNCTIONS 视图 SYSCAT.VIEWS 三. 字符串类型 二进制大对象 (BLOB) 字符串。 字符大对象 (CLOB) 字符串,它的字符序列可以是单字节字符或多字节字符, 或这两者的组合。 双字节字符大对象 (DBCLOB) 字符串,它的字符序列是双字节字符。 四. 数据库范式 第一种规范形式:表中的每一行和每一列均有一个值,永远不会是一组值。 第二种规范形式:不在关键字中的每一列提供取决于整个关键字的事实。 第三种规范形式:每个非关键字列提供与其他非关键字列无关并只取决于该关键字的事实。 第四种规范形式:没有行包含有关一个实体的两个或更多个独立的多值事实。 五. 数据类型 数据类型 类型 特性 示例或范围 CHAR(15) 定长字符串 最大长度为 254 'Sunny day ' VARCHAR(15) 变长字符 最大长度为 4000 'Sunny day' SMALLINT 数字 长度为 2 字节精度为 5 位范围为-32768 至 32767 INTEGER 数字 长度为 4 字节精度为 10 位范围为-2147483648 至 2147483647 REAL 数字 单精度浮点32 位近似值 范围为-3.402E+38至-1.175E-37或 1.175E-37 至-3.402E+38或零 DOUBLE 数字 双精度浮点64 位近似值 范围为-1.79769E+308 至-2.225E-307或 2.225E-307 至 1.79769E+308或零 DECIMAL(5,2) 数字 精度为 5小数位为 2 范围为 -10**31+1 至 10**31-1 DATE 日期时间 三部分值 1991-10-27 TIME 日期时间 三部分值 13.30.05 TIMESTAMP 日期时间 七部分值 1991-10-27-13.30.05.000000 六. 列函数 列函数对列中的一组值进行运算以得到单个结果值。下列就是一些列函数的示例。 AVG 返回某一组中的值除以该组中值的个数的和 COUNT 返回一组行或值中行或值的个数 MAX 返回一组值中的最大值 MIN 返回一组值中的最小值 七. 标量函数 标量函数对值进行某个运算以返回另一个值。 下列就是一些由DB2 通用数据库提供的标量函数的示例。 ABS 返回数的绝对值 HEX 返回值的十六进制表示 LENGTH 返回自变量中的字节数(对于图形字符串则返回双字节字符数。) YEAR 抽取日期时间值的年份部分 db2start db2 connect to icss USER DB1 db2 get db cfg for icss db2 update db cfg using LOGFILSIZ 10000 (1000) db2 update db cfg using LOGPRIMARY 30 (3) db2 update db cfg using LOGSECOND 20 (2) db2 " select * from table " db2move icss export -tn * -u db2admin -p db2admin db2move rone import -u db2admin -p db2admin db2 "update A set bal=(select txnamt from B where actno=A.actno and cnlno=A.Cnlno) where A.actno||A.cnlno in (select Actno||cnlno from B ); db2 "update cdmcrd set offset = (select cdmlsl.offset from cdmlsl where cdmlsl.crdno=cdmcrd.crdno) where cdmcrd.crdno in (select cdmlsl.crdno from cdmlsl) db2 alter bufferpool ibmdefaultbp size 10240 db2 "select * from syscat.bufferpools"; 数据库会恢复正常,可再用db2 list tablespaces show detail查看 12. database db2move leafloca export -u db2admin -p db2admin db2move leafloca import -u db2admin -p db2admin db2 backup database leafloca to d:\lic db2 restore database leafloca from d:\lic taken at 20070101 例如: 低效: SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO 高效: SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X’ FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO); EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. 13.清空一个大表 在存储过程中动态执行 SET str_sql='alter table M_IBB_F_F_LN_PEN_LCCOA_A activate not logged initially with empty table'; EXECUTE IMMEDIATE str_sql; /* select null as END_TIME from t 谁知道,上面这种语句,在DB2中是怎么写null as什么的,类似于oracle的虚列,请抢答。 更正 正确答案: select cast(null as coltype) as colname from tablename cast中要把null对应的列的类型写出 多谢姚志金,陈建峰! 答案: select case when 1 = 1 then null end as END_TIME from t 多谢陈建峰! */ su - select * from prog_log_ibb with ur db2 list applications for database ods_ibb ------------------------------------------------------ 1.建立了一个shell脚本,导出数据,db2 "select * from table " > a.txt 导出来的数据是包含表头的,但是我现在不需要表头,有没有什么办法? db2 +x "select * from table " > a.txt 2. 想看数据库中表的大小 对表runstats 再查syscat.tables, syscat.tbspaces , 得到 bigint(a.npages) * bigint(b.pagesize) 3. 现在需要增加每个表空间容器的大小,到底是使用extend还是使用resize呢?各有什么区别? 例子: 用EXTEND子句更改例三所创建的表空间的容器的大小。 ALTER TABLESPACE RESOURCE EXTEND (file 'd:\db2data\acc_tbsp' 1000, file 'e:\db2data\acc_tbsp' 1000, file 'f:\db2data\acc_tbsp' 1000) 该命令的运行结果为在原有容量的基础之上,每个容器再增加1000页。 例子 用RESIZE子句更改例三所创建的表空间的容器的大小。 ALTER TABLESPACE RESOURCE RESIZE (file 'd:\db2data\acc_tbsp' 8000, file 'e:\db2data\acc_tbsp' 8000, file 'f:\db2data\acc_tbsp' 8000) 每个容器(文件)的大小变为8000页。 没啥区别,只是resize可以减小tablespace 4.扩大索引空间:db2inst2 db2 "alter tablespace TBS_IDX_1 resize (FILE '/odsibb/tbs/TBS_IDX_1' 25600M)" 重启数据库 5. shell脚本导出数据,如何删除表头 建立了一个shell脚本,导出数据,db2 "select * from table " > a.txt 导出来的数据是包含表头的,但是我现在不需要表头,有没有什么办法? 谢谢各位 6.以下是DB2 V8在REDHAT AS4的环境。 创建表空间: CREATE REGULAR TABLESPACE userspace1 IN DATABASE PARTITION GROUP "IBMDEFAULTGROUP" PAGESIZE 32K MANAGED BY DATABASE USING ( FILE '/dmsdata/user0' 5120 ) ON DBPARTITIONNUM (0) USING ( FILE '/dmsdata/user1' 5120 ) ON DBPARTITIONNUM (1) EXTENTSIZE 32 OVERHEAD 10.5 PREFETCHSIZE 32 TRANSFERRATE 0.14 BUFFERPOOL "testdbbuff" DROPPED TABLE RECOVERY ON; COMMENT ON TABLESPACE USERSPACE IS 'userspace'; CONNECT RESET; 给表空间增加container。 alter tablespace userspace1 add (file'/dmsdata/usernew0' 5120) on node (0) add (file'/dmsdata/usernew1' 5120) on node (1) add (file'/dmsdata/usernew2' 5120) on node (2) add (file'/dmsdata/usernew3' 5120) on node (3); 删除一个分区,注意顺序。 db2 list database partition groups show detail db2 alter database partition group ibmdefaultgroup drop node \(3\) db2 redistribute db partition group ibmdefaultgroup uniform export DB2NODE=3 db2 terminate db2 connect to testdb db2 drop node verify db2stop drop dbpartitionnum 3 7.查出一个表中记录重复的数据。 select t1.cstno from F_CI_PER_PB_CSTINF_APPEND t1 , ( select cstno ,count(1) as cnt from F_CI_PER_PB_CSTINF_APPEND group by cstno ) t2 where t1.cstno = t2 .cstno ---'/1AKcJD2ud' and t2.cnt >1 法二: select cstno ,count(1) as cnt from F_CI_PER_PB_CSTINF_APPEND group by cstno having count(1) >1 db2look -e -d ods_ibb -t M_IBB_A_RPT_LN_INCOME_tmp > tmp2.sql 执行动态SQL:into 后面接需要传出OUT的标识,using后面接传入的变量 /* set str_sql = 'call '||v_proc_name||' (?,?)'; prepare s from str_sql; execute s into i_flg using c_cur_mon_end; */ db2look -e -d ods_ibb -t M_IBB_D_CODCMP M_IBB_D_PAR_CODE > tab.sql db2look -d ods_ibb -e -dp -t M_IBB_A_TMP_PMERA M_IBB_D_ORGLVL >tab2.sql ---(含DROP ) db2look -d leafloca -l -e -o leafloca.ddl UNCATALOG DATABASE ODS_IBB; CATALOG DATABASE ODS_IBB AS ODSIBB_BAK AT NODE ODS_IBB AUTHENTICATION SERVER; 别名长度受限制:ibbdbbak1 db2 "CATALOG DATABASE ODS_IBB AS ibbdbbak AT NODE node1 AUTHENTICATION SERVER " db2 list tables for schema ibbdb2 #用同一个用户ibbdb2 db2 CATALOG LOCAL NODE node1 INSTANCE db2inst1 --db2 CATALOG LOCAL NODE node2 INSTANCE db2inst2 db2 attach to node1 db2 detach db2 " CATALOG DATABASE ODS_IBB as odsibbbak AT NODE node1 AUTHENTICATION SERVER " ================================================================= 执行频率最高、运行时间最长和排序次数最多的动态 SQL db2 "select * from sysibmadm.top_dynamic_sql" select STMT_SORTS, SORTS_PER_EXECUTION, substr(STMT_TEXT,1,60) as STMT_TEXT from TOP_DYNAMIC_SQL order by STMT_SORTS desc fetch first 5 rows only 高成本应用程序 select AGENT_ID, ROWS_SELECTED, ROWS_READ from APPL_PERFORMANCE 当前正在执行的运行时间最长的查询 select ELAPSED_TIME_MIN, APPL_STATUS, AGENT_ID from long_running_sql 查询的运行频率以及这些查询中每个查询的平均执行时间 select NUM_EXECUTIONS, AVERAGE_EXECUTION_TIME_S, PREP_TIME_PERCENT from QUERY_PREP_COST order by NUM_EXECUTIONS desc 打开会话监控开关 update monitor switches using bufferpool on sort on lock on statement on table on uow on db2 get monitor switches db2 get snapshot for dynamic sql on ods_ibb > top.sql grep -E "Total execution time" top.sql |sort > time.sql ================================================================= db2 list tablespaces show detail db2 drop tablespace TBS_DATA_DP 注意:length(dt),若dt为decimal格式,默认会把前面补0,最好先转化为int 进行多次连接后,最好执行下disconnect db2 disconnect all uptime db2_ps tail -1000 db2diag.log cd db2dump db2pd -db ods_ibb -locks db2pd -db ods_ibb -applications db2pd -db ods_ibb -transactions db2pd -db ods_ibb -dynamic SELECT DISTINCT SIBRTH FROM F_CI_PER_CISIA FETCH FIRST 5000 rows only db2 load query table m_ibb_f_f_ci_per_cisia 补充: 1. 查锁表的问题: 查锁的表 db2 "SELECT AGENT_ID,TABNAME,LOCK_MODE,LOCK_STATUS,LOCK_RELEASE_FLAGS FROM SYSIBMADM.SNAPLOCK" -----查死锁的, db2 " select * from sysibmadm.locks_held where lock_MODE like '%X%' " M_IBB_A_RPT_PSO_OPACST db2 get snapshot for application agentid 547|more db2 get snapshot for application agentid 11 db2 RUNSTATS ON TABLE table1 db2pd -d ods_ibb -recovry --活动监控器 db2 " force application(115) " ----------------------------------------------- http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0902yuancg/ ----------------------------------------------- db2_kill db2start db2 connect to * db2mtrk DB2 内存跟踪器工具 vmstat 1 db2mtrk -i -v 实例级 db2mtrk -d -v 数据库级 db2mtrk -d /* 扩大数据库IO --alter tablespace tbs_data_1 prefetchsize AUTOMATIC --alter tablespace tbs_idx_1 prefetchsize AUTOMATIC [实例用户] db2set db2_parallel_io=* [还原] db2set db2_parallel_io= */ /* 打开监控 22.5.234.11 db2inst1 db2 update dbm cfg using DFT_MON_BUFPOOL ON */ LOAD 命令执行状态 db2 list utilities show detail alter table tabname activate not logged with empty table load from empfile of del replace into tabname == /*LOAD时报错:由于是同组用户的权限设置有问题*/ SQL3501W 由于对数据库禁用了正向恢复,因此,表所在的表空间将不会处于备份暂挂状态 SQL3039W 可用于对 DATA BUFFER 进行 LOAD 的内存禁止全 LOAD 并行性。将使用装入并行性 "3" SQL3109N 实用程序开始装入文件 "/home/odsusr/script/oth_del/M_IBB_D_CODCMP.del" 中的数据。 SQL2036N 文件或设备 "/home/odsusr/script/oth_del/M_IBB_D_CODCMP.del" 的路径无效。 ======================================================================== /************************************************************** 小朱尝试的方法: 20090422 ,经常报 911,912错误,同时还有968错误: --------------------------- 1572864 *4k = 6G db2 update dbm cfg using INSTANCE_MEMORY 702864 --------------------------- ipcs -l root用户修改/etc/sysctl.conf文件 kernel.shmall=3774873 sysctl -p 让修改生效 --------------------------- storage path/instance name/NODE####/database name/T#######/C#######.EXT NODE#### 数据库分区号 NODE0000 T####### 表空间标识 T0000003 C####### 容器标识 C0000012 EXT 扩展名 CAT 系统目录表空间 TMP 系统临时表空间 UTM 用户临时表空间 USR 用户或常规表空间 LRG 大型表空间 --------------------------- DB2系统临时文件目录 原库 A /ibb/odsibb/db2inst2/NODE0000/ODS_IBB/T0000001/C0000000.TMP 备库 B /ibbadd3/odsibb/db2inst1/NODE0000/ODS_IBB/T0000001/C0000000.TMP *************************************************************/ db2 force applications all DROP DATABASE database-alias [AT DBPARTITIONNUM] db2inst1 db2 idrop db2inst1 #删除实例 ##/opt/ibm/db2/V9.1/instance/db2idrop db2inst1 -f 如果报:SQL0968C 文件系统已满的情况: db2_kill db2pd -db ods_ibb -recovery --查看数据库是否在回滚 db2 restart database ods_ibb 查看数据库详细日志: /home/db2inst1/sqllib/db2dump db2diag.log --- rz sz --- nohup sh 666.sh & db2 "export to M_CI_IDENTIFIER.del of del modified by nochardel coldel$ select * from O_ECIF_M_CI_IDENTIFIER" db2 "export to M_CI_CUSTOMER.del of del modified by nochardel coldel$ select * from O_ECIF_M_CI_CUSTOMER" db2 "load client from M_CI_IDENTIFIER.del of del modified by coldel$ nochardel replace into O_ECIF_M_CI_IDENTIFIER nonrecoverable" db2 "load client from M_CI_CUSTOMER.del of del modified by coldel$ nochardel replace into O_ECIF_M_CI_CUSTOMER nonrecoverable" db2 "load client from account_20161229.dat of del modified by coldel$ nochardel codepage = 1208 replace into O_EBK_ACCOUNT nonrecoverable"