DB2相关知识点记录

 【1】触发器

DROP TRIGGER DELETE_API_JHNEWS@
  CREATE TRIGGER DELETE_API_JHNEWS
  NO CASCADE BEFORE
  INSERT ON API_JHNEWS
  REFERENCING NEW AS NEWROW 
  FOR EACH ROW 
  MODE DB2SQL
  BEGIN ATOMIC
    DELETE FROM api_jhnews WHERE creat_date < CURRENT DATE - 1 DAY;
  END;

  第一行:创建触发器,指定触发器名称
  第二行:指定触发时机,如after、before、instead of
          当为before时,需加上no cascade,防止触发器级联
  第三行:触发事件,以及涉及的表
  第四行:操作前后的行记录,new 、old其中new代表新建好的行,old表示新删除的行,当使用new 和old时,
          不能用for each statemen语句,只能用for each row
  第五、六行:指定触发的次数,
          for each row,for each statement前者是按行触发,后者按语句触发如果一条SQL语句要修改100条记录,
          for each row要执行100次而for each statement执行1次
  第七行:内容开始 atomic 可用于错误发生数据回滚,非必要项
  第八行:触发操作
  第九行:结束

【2】集群数据库查看每个节点数据分布,查看数据是否均匀到每个节点

SELECT dbpartitionnum(字段1),dbpartitionnum(字段2),dbpartitionnum(字段3),count(1)
	FROM 表名
	GROUP BY dbpartitionnum(字段1),dbpartitionnum(字段2),dbpartitionnum(字段3) 
	ORDER BY dbpartitionnum(字段1),dbpartitionnum(字段2),dbpartitionnum(字段3)
	如果数据是不均匀分布的,那么每个节点的数据量是有相差倍数的。
	(1)查看表的PARTITIONING KEY 是否合理。不合理需要重组表
	具体操作查看:DB2重组表-分布主键.sql

【3】监控语句

db2 list utilities show detail

【4】临时表按行存储

存错过程中新建的临时表时以行存储: ORGANIZE BY ROW

【5】临时表

ON COMMIT DELETE ROWS     事务完成,临时表中的数据就会消失。
ON COMMIT PRESERVE ROWS   会话结束,临时表中的数据就会消失。

【6】清理冗余空间

CALL SYSPROC.ADMIN_CMD('reorg table 表名 reclaim extents only allow no access')@

 【7】导入导出数据

(1)表不存在的情况
	import from tabname.ixf of ixf create into tabname
(2)表存在的情况
	import from tabname.ixf of ixf insert into tabname

--使用load方式导入
	import from 'd:\wx_customer.del' of del insert into WX_CUSTOMER
--导入中文乱码问题  1208是utf-8, 1386是gbk
	load client from 'd:\O_SALEDATA_prov.del' of del modified by codepage=1386 insert into table
	load from /home/zoomlgd/customer.del of del modified by codepage=1386 insert into table 
--导入csv文件是,从第二行开始导入,表头忽略
	load client from 'd:\wc_point_no_use.csv' of del restartcount 1 insert into table

--导出到ixf格式:
	export to tabname.ixf of ixf messages msg.out select * from tabname;
--导出到excel:
	export to d:\CC_PROV_CITY.xls of del modified by nochardel coldel0x09 select * from CC_PROV_CITY@

【8】根据表名找存储过程

SELECT * FROM syscat.PROCEDURES WHERE procschema = 'schema名称' AND text LIKE '%表名%'@

【9】查看表状态

检查表状态:
	select tabname,colcount,status from syscat.tables where tabschema = 'NBADV' AND status = 'C'@
查看哪些表load挂起:
	select * from SYSIBMADM.ADMINTABINFO where tabschema like '%DB2INST1%' and LOAD_STATUS='PENDING'

【10】数据库配置信息

get db cfg for 数据库名@
db2sysc占用cpu过高时:
	db2 reorgchk update statistics on table all

 【11】数据库日志问题

提示:SQL0964C The transaction log for the database is full
增大日志文件大小:
	update db cfg for 数据库名 using LOGFILSIZ 8192
或者增大主日志文件个数:
	update db cfg for 数据库名 using LOGPRIMARY 200
或者增大辅助日志文件个数:
	update db cfg for 数据库名 using LOGSECOND 20
注意:注意:logprimary+logsecond <= 256			
总事务日志容量大小=(LOGPRIMARY+LOGSECOND)*LOGFILSIZ*4k
ps: ((200 + 20) * 8192 * 4k)/1024 = 7040m

【12】数据库监控语句

切换至db2用户后,使用以下任意一条语句进行监控
(1)db2top -d 实例名
(2)nmon
(3)db2 list utilities show detail

查看某个db2进程具体情况:
db2 "get snapshot for application agentid 1610"
查看数据表空间具体情况:
db2 get snapshot for tablespaces on orderdb

【13】开启数据库监控

开启监控
su - db2inst1
db2 update monitor switches using bufferpool on lock on sort on statement on table on timestamp on uow on 
日志输出到文件
db2 get snapshot for all on dbname > snap.txt
重置监控
db2 reset monitor all 
待数据库运行一段时间后,下载sanp.txt文件。可以使用cmd的一些命令来分析该文件,找到耗时的sql语句进行优化

【14】db2导出表结构

先切换到保存数据的目录
db2look -d DB_NAME -u USER -e -o XXX.sql

【15】db2导出表数据

先切换到保存数据目录
db2move DB_NAME export -u USER -p PASSWORD

【16】由于表"xxxx"上的原因码“3”

由于load引起的暂挂锁导致xxx表不可用的。
解决办法:
[1]上数据库服务器查询表的状态,是否还在load
	db2 list utilities show detail
	db2 load query table xxxxx  
[2] 执行
	db2 load from /dev/null of del terminate into xxxxx nonrecoverable
稍等片刻即可解决
或者直接在qc里面执行:
	load client from d:\null.txt of del terminate into 表名

【17】清空表

delete from tableName@
drop table tableName
alter table TEST_CUSTOMER activate not logged initially with empty table@
TRUNCATE TABLE tab_name IMMEDIATE  --清理表数据并释放空间

【18】root capability required SQLSTATE= 08001

原因是: DB2 文件权限被更改了
[1]使用root用户,切换到/home/db2inst1/sqllib/security目录下
[2]依次执行下列语句:
    chown root db2chpw
    chown root db2ckpw
    chmod 4511 db2chpw
    chmod 4511 db2ckpw
[3] 然后再切换到db2inst1用户下重启数据库就可以了。	

【19】CREATE LIKE 创建表

CREATE TABLE TEST_ZLW LIKE SESSION.rst;
INSERT INTO TEST_ZLW
SELECT * FROM SESSION.rst;	

【20】TO_CHAR 格式日期用法

[1]年份: TO_CHAR('2019-12-20', 'YYYY')
[2]月份:TO_CHAR('2019-12-20', 'YYYYMM')
[2]自定义格式: TO_CHAR('2019-12-20', 'YYYYMMDD')
    TO_CHAR(CURRENT DATE, 'YYYY/MM/DD') AS, 
    TO_CHAR(CURRENT TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS timestamp
[3]季度:TO_CHAR('2019-06-20', 'Q')
[4]周:TO_CHAR('2019-12-20', 'IYYYIW')

日期间隔
SELECT
  timestampdiff (256, char(timestamp('2013-12-30 20:30:30') - timestamp('2001-09-26 15:24:23'))) AS "间隔年",
  timestampdiff (128, char(timestamp('2013-12-30 20:30:30') - timestamp('2001-09-26 15:24:23'))) AS "间隔季度",
  timestampdiff (64, char(timestamp('2013-12-30 20:30:30') - timestamp('2001-09-26 15:24:23'))) AS "间隔月",
  timestampdiff (32, char(timestamp('2013-12-30 20:30:30') - timestamp('2001-09-26 15:24:23'))) AS "间隔周",
  timestampdiff (16, char(timestamp('2013-12-30 20:30:30') - timestamp('2001-09-26 15:24:23'))) AS "间隔日",
  timestampdiff (8, char(timestamp('2013-12-30 20:30:30') - timestamp('2001-09-26 15:24:23'))) AS "间隔时",
  timestampdiff (4, char(timestamp('2013-12-30 20:30:30') - timestamp('2001-09-26 15:24:23'))) AS "间隔分",
  timestampdiff (2, char(timestamp('2013-12-30 20:30:30') - timestamp('2001-09-26 15:24:23'))) AS "间隔秒"
  FROM SYSIBM.SYSDUMMY1@

【21】多行合并成一行

方法一:
SELECT PERSONID,replace(replace(xml2clob(xmlagg(xmlelement(NAME a, COMMODITYID||',') ORDER BY 			  	COMMODITYID)),'<A>',''),'</A>',' ') AS COMMODITYIDS 
FROM WX_SHOPPINGCAR 
GROUP BY PERSONID@

方法二:
SELECT [分组的字段 ] , LISTAGG([需要聚合的字段名], ',')
FROM [表名] 
GROUP BY [分组的字段名] ; 

【22】db2将一串字符中的数字剔除出来

REPLACE(字符串,被替换字符串,替换字符):是整体字符串的替换。
TRANSLATE(字符串,替换字符,被替换字符串):是字符串里面的字符逐个替换。
利用这两个来获取一串字符里面的数据(仅限汉字或英文或数字字符在一起的情况)。
VALUES REPLACE('我的电脑136584625', TRIM(TRANSLATE('我的电脑136584625', '', '1234567890')), '')@

【23】位数自动补全

自动补全:LPAD和RPAD
VALUES LPAD('AAA', 8, '0')@
VALUES RPAD('AAA', 8, '0')@

【24】字符串函数

[1]COALESCE(expr1, expr2, [expr3,,,,]) 第一个expr为null, 返回第二个,第二个expr为null,然后第三个....
[2]NULLIF(expr1, expr2)  两个expr相同返回null,不同返回第一个expr的值。常用于被除数中
[3]POSSTR和LOCATE

返回字符串中最后一个空格的位置,可以使用带有负“start”参数的LOCATE_IN_STRING函数
VALUES LOCATE_IN_STRING('00111', '1', -1)

与CASE WHEN相同作用的函数:DECODE
SELECT PERSONNAME, DECODE(SEX, 1, '男', 0, '女', '其他') FROM G_PERSONINFO@	

【25】db2 创建索引

创建索引:
create index  索引名 on 表名 (字段1,字段2...)	
查看索引:
describe indexes for table tabname show detail@

【26】获取运行最长的SQL

SELECT SUBSTR(APPL_NAME, 1, 15) AS APPL_NAME,
    ELAPSED_TIME_MIN,
    APPL_STATUS,
    SUBSTR(AUTHID, 1, 10) AS AUTH_ID,
    SUBSTR(INBOUND_COMM_ADDRESS, 1, 15) AS IP_ADDRESS,
    SUBSTR(STMT_TEXT, 1, 30) AS SQL_STATEMENT
FROM SYSIBMADM.LONG_RUNNING_SQL@	

获取执行次数最多的SQL:
SELECT NUM_EXECUTIONS AS "执行次数",
   AVERAGE_EXECUTION_TIME_S AS "平均时间(秒)",
   STMT_SORTS AS "排序次数",
   SORTS_PER_EXECUTION AS  "每语句排序",
   SUBSTR(STMT_TEXT, 1, 30) AS "执行语句"
FROM SYSIBMADM.TOP_DYNAMIC_SQL
WHERE NUM_EXECUTIONS > 0 
ORDER BY 2 DESC FETCH FIRST 5 ROWS ONLY@

获取排序次数最多的SQL
SELECT STMT_SORTS, SORTS_PER_EXECUTION, SUBSTR(STMT_TEXT, 1, 80) AS STMT_TEXT
FROM SYSIBMADM.TOP_DYNAMIC_SQL
ORDER BY STMT_SORTS DESC 
FETCH FIRST 5 ROWS ONLY@

【27】group的多种用法

[1]GROUP BY CUBE(A,B) = ALL + GROUP BY A + GROUP BY B + GROUP BY A,B
	==> GROUP BY CUBE 的结果是2的N次幂个组合    
[2]GROUP BY ROLLUP(A,B) = ALL + GROUP BY A + GROUP BY A,B
	==> GROUP BY ROLLUP 的结果是N+1个组合
[3]ROUP BY GROUPING SETS(A,B,()) = GROUP BY A + GROUP BY B + ALL
	==> GROUP BY GROUPING SETS 的结果是 N个组合	

【28】重组表及统计表

[1]查询某个表是否需要重组:
	 db2 "reorgchk on table 表名"
[2]重组命令:
CALL SYSPROC.ADMIN_CMD('reorg table schema.tablename reclaim extents only allow no access');

[3]统计表
runstats on table [模式名].[表名] with distribution and detailed indexes all

【29】降水位

##降水位只能用实例用户
db2 "connect to orderdb ";
db2 "ALTER TABLESPACE userspace1 REDUCE MAX";

【30】在线更换表所在的空间

CALL SYSPROC.ADMIN_MOVE_TABLE( 'DB2INST1', 'API_JHNEWS_20200714', 'SYSTOOLSPACE', 'SYSTOOLSPACE' , 'SYSTOOLSPACE', '', '', '', '', '', 'MOVE') @

【31】查看数据库版本

db2licm -l

【32】查看表空间使用情况

SELECT tbsp_id, substr(tbsp_name,1,20) AS TABLESPACE_NAME, 
  SUBSTR(tbsp_content_type,1,10) AS	TABLESPACE_TYPE,
  SUM(tbsp_total_size_kb)/1024 AS TOTAL_MB,
  SUM(tbsp_used_size_kb)/1024 AS USED_MB,
  SUM(tbsp_free_size_kb)/1024 AS FREE_MB,
  tbsp_page_size AS PAGE_SIZE
FROM SYSIBMADM.TBSP_UTILIZATION 
GROUP BY tbsp_name,tbsp_content_type,tbsp_page_size,tbsp_id
ORDER BY tbsp_id

SELECT * FROM SYSIBMADM.TBSP_UTILIZATION WHERE TBSP_NAME='USERSPACECOL' ORDER BY DBPARTITIONNUM@

-- 查看表空间信息
db2 get snapshot for tablespaces on orderdb


未能在在表空间xxxx中分配新页面解决办法:数据重组,降水位

【33】查看数据库表死锁

db2 get snapshot for locks on databasename

【34】新建SCHEMA

CREATE SCHEMA "TEMP"@

【35】新建WRAPPER

CREATE WRAPPER "DRDA"
  LIBRARY 'libdb2drda.so' 
  OPTIONS (DB2_FENCED  'N')@

【36】新建SERVER

CREATE SERVER "DCDB" 
  TYPE DB2/LINUX 
  VERSION '9.7' 
  WRAPPER "DRDA"  
  AUTHORIZATION "xxx" 
  PASSWORD "xxx"
  OPTIONS(
    DB2_CONCAT_NULL_NULL  'Y',
    DB2_VARCHAR_BLANKPADDED_COMPARISON  'Y',
    DBNAME  'DCDB',
    NO_EMPTY_STRING  'N'
  )@

【37】新建MAPPING

CREATE USER MAPPING FOR DB2INST1 
  SERVER "DCDB"
  OPTIONS(
  	REMOTE_AUTHID  'nbadv',
  	REMOTE_PASSWORD  '***'
  )@

【38】数据库编目

原库(被编目的库):10.114.20.67:60000/sdsale
目标库(要在哪个库执行编目):10.114.20.71:60000/sale66ts

1.登陆原库 10.114.20.71 AIX
2.切换成root账户
	su - root
3.切换成实例用户
	su - db2inst1
3、设置数据库属性
	db2 update dbm cfg using federated yes
4、查看实例下的数据库,数据库编目、节点编目
	db2 list database directory ##实例下数据库
	db2 list db directory ##数据库编目
	db2 list node directory ##节点编目
	
5、创建node  db2 catalog tcpip node [节点名,随便命名,有长度限制] remote [原库ip] server [原库端口] remote_instance [原表名]
	db2 catalog tcpip node sale66db remote 10.114.20.66 server 60000 remote_instance sdsale
##DB20000I  The CATALOG TCPIP NODE command completed successfully.
##DB21056W  Directory changes may not be effective until the directory cache is 
##refreshed.
6、创建数据库 别名 db2 catalog db [原表名] as [别名,有长度限制] at node [节点名]
	db2 catalog db sdsale as sale66ts at node sale66db
##DB20000I  The CATALOG DATABASE command completed successfully.
##DB21056W  Directory changes may not be effective until the directory cache is 
##refreshed.
7、登陆数据库,使用原库账号密码 db2 connect to [数据库名] user [账号] using [密码]
$ db2 connect to sale66ts user db2inst1 using db2inst1

   Database Connection Information

 Database server        = DB2/AIX64 9.5.8
 SQL authorization ID   = NBADV
 Local database alias   = SALETEST
 
--删除结点编目
db2 uncatalog node 节点名
--删除数据库编目
db2 uncatalog db 数据库名
--刷新高速缓存
db2 terminate

--在qc里面远程nickname其他库
[1]创建 SERVER
[2]创建 MAPPING

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DB2数据库是一个关系型数据库管理系统(RDBMS),最初由IBM开发并推出。它是一种可扩展的数据库解决方案,适用于各种规模的企业应用。 以下是一些DB2数据库的基础知识: 1. 数据模型:DB2数据库遵循关系型数据模型,使用表格(表)来组织数据。每个表由行和列组成,行表示记录,列表示属性。 2. SQL语言:DB2通过结构化查询语言(SQL)进行数据操作和查询。SQL语言提供了丰富的语法和功能,用于创建、修改、删除和查询数据库中的数据。 3. ACID属性:DB2数据库支持ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这些属性确保数据库操作的可靠性和一致性。 4. 多用户并发:DB2具有强大的并发控制机制,可以处理多个用户同时对数据库进行读写操作。它使用锁定机制和事务隔离级别来保证数据的完整性和一致性。 5. 数据完整性:DB2支持各种数据完整性约束,包括主键约束、唯一约束、外键约束等。这些约束用于保证数据的有效性和一致性。 6. 数据备份与恢复:DB2提供了备份和恢复机制,用于定期备份数据库并在需要时恢复数据。这是保证数据安全性和可靠性的重要手段。 7. 扩展性和高可用性:DB2支持水平和垂直扩展,可以根据需求进行灵活的扩展。它还提供了高可用性选项,如数据复制和故障转移,确保系统的可用性和容错能力。 这些是DB2数据库的一些基础知识,希望能对你有所帮助。如有更多问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值