DB2 Reference Card
基本概念
体系结构
数据库必须受实例的管理,例如数据库的起停等,在非集群的情况下,一个数据库只能由一个实例管理,但一个实例可以管理多个数据库。
安装
- 运行db2_precheck检查安装要求是否满足
- 运行db2_install安装
- 创建一个新用户db2inst1作为数据库实例用户
- 创建数据库实例
基本使用
快速入门
启动数据库实例
安装完成后,切换到数据库实例用户下,以db2inst1为例
[db2inst1@localhost ~]$ db2start
创建SAMPLE数据库
创建支持XML和关系型数据的SAMPLE数据库
[db2inst1@localhost ~]$ db2sampl -sql -xml
开始使用
创建数据库
[db2inst1@localhost ~]$ db2 create db [dbname] db2 create db [dbname]
连接数据库
[db2inst1@localhost ~]$ db2
db2 => connect to sample user db2inst1 using root
db2 => list tables
db2 => select * from staff where dept = 20
注:类似list tables
的命令,可以使用? list
查询,connect to sample user db2inst1 using root
在本机操作时,可以简写为connect to sample
,db2命令提示符下的命令,通常也可以在shell下使用db2前缀执行,如db2 connect to sample
,在db2命令提示符下,执行命令前加!
,可以执行shell命令。
启动关闭
实例相关命令
查看数据库版本
[db2inst1@localhost ~]$ db2level
创建实例
[db2inst1@localhost ~]$ db2icrt db2inst1
注意:实例名称应与当前用户名相同,连接数据库时的密码为Linux用户密码
删除实例
[db2inst1@localhost ~]$ db2idrop db2inst1
查看实例
[db2inst1@localhost ~]$ db2ilist
查看当前实例下的数据库
[db2inst1@localhost ~]$ db2 list db directory
显示本地目录信息
[db2inst1@localhost ~]$ db2 list database directory
[db2inst1@localhost ~]$ db2 list admin node directory
[db2inst1@localhost ~]$ db2 list node directory
启动默认实例
[db2inst1@localhost ~]$ db2start
停止当前实例
[db2inst1@localhost ~]$ db2stop
启用TCP/IP数据库连接
[db2inst1@localhost ~]$ db2set -i db2inst1 DB2COMM=tcpip
[db2inst1@localhost ~]$ db2 update dbm cfg using SVCENAME 50000
[db2inst1@localhost ~]$ db2stop
[db2inst1@localhost ~]$ db2start
注:其中,50000为端口号,可以在/etc/services中添加一行,然后用名称代替上面的50000。
表空间
创建表空间
DB2 => CREATE TABLESPACE tbsp1
DB2 => MANAGED BY SYSTEM
DB2 => USING ('d:\acc_tbsp', 'e:\acc_tbsp')
DB2 => CREATE TABLESPACE tbsp1
DB2 => PAGESIZE 8K
DB2 => MANAGED BY DATABASE
DB2 => USING (FILE 'd:\db2data\acc_tbsp', 5000,
DB2 => FILE 'e:\db2data\acc_tbsp', 5000)
DB2 => CREATE TABLESPACE tbsp2
DB2 => PAGESIZE 8K
DB2 => MANAGED BY DATABASE
DB2 => USING (FILE '/storage/dbs1' 10) AUTORESIZE YES
DB2 => CREATE DATABASE mydb AUTOMATIC STORAGE YES
DB2 => CONNECT TO mydb
DB2 => CREATE TABELSPACE tbsp1 MANAGED BY AUTOMATIC STORAGE
缓冲池
DB2 => CREATE BUFFERPOOL bp4k PAGESIZE 4K
DB2 => CREATE TABLESPACE tbsp1 PAGESIZE 4K BUFFEREDPOOL bp4k
数据库管理基本命令
连接与断开连接数据库
[db2inst1@localhost ~]$ db2 connect to sample [user db2inst1 using root]
DB2 => disconnect sample
管理命令
查看当前数据库的表空间
[db2inst1@localhost ~]$ db2 list tablespace
查看数据库管理器配置
[db2inst1@localhost ~]$ db2 get dbm cfg show detail
更改数据库管理器配置
[db2inst1@localhost ~]$ db2 update dbm cfg using health_mon off
查看数据库配置
[db2inst1@localhost ~]$ db2 get db cfg for dbname [| grep -i log]
[db2inst1@localhost ~]$ db2 connect dbname
[db2inst1@localhost ~]$ db2 get db cfg show detail
更改一个数据库配置
[db2inst1@localhost ~]$ db2 update db cfg using logprimary 10
整理表
[db2inst1@localhost ~]$ db2 reorg table tablename
[db2inst1@localhost ~]$ db2 runstats on table tablename with distribution and indexes all
监控服务器
db2top -d dbname
关闭应用连接
关闭所有应用连接
[db2inst1@localhost ~]$ db2 force application all
关闭指定应用连接
[db2inst1@localhost ~]$ db2 force application ID1,ID2,...DB2
常用监控命令
- db2expln
- db2top
- db2pd
- db2advis
DDL
查询表定义
DB2 => describe table tablename
更改列
DB2 => alter table schema.tableName alter column set data type varchar(100)
列重命名
ALTER TABLE RENAME COLUMN TO
新增自增列
假设表RTTS.T1是需要增加自增列的表,先创建一个结构类似的表
CREATE TABLE RTTS.T2(id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY(START WITH 1,INCREMENT BY 1,NO CACHE) PRIMARY KEY,CUSTOMER_ID CHAR(20) NOT NULL, PRODUCT_ID INTEGER NOT NULL);
从RTTS.T1读取数据,插入T2
INSERT INTO RTTS.T2(CUSTOMER_ID,PRODUCT_ID) SELECT CUSTOMER_ID,PRODUCT_ID FROM RTTS.T1;
删除旧表,修改表名
drop table RTTS.T1;
RENAME TABLE "RTTS"."T2" TO "T1"
DML
查询
注:日期查询可以采用如下方式
DB2 => select * from table where field > timestamp(char('2014-02-02 00:00:00'))
DB2 => -- 或者
DB2 => select * from table where field > '2014-02-02 00:00:00'
插入
[db2inst1@localhost ~]$ db2 insert into newuser(username,password,email) values('Amy','1234','[email protected]')
[db2inst1@localhost ~]$ db2 insert into newuser(username,password,email) values('Judy','1234','[email protected]')
修改
删除
数据导入导出
执行SQL文件
[db2inst1@localhost ~]$ db2 -tvf sqlfilename
[db2inst1@localhost ~]$ db2 -td@ -f filename
导出数据
[db2inst1@localhost ~]$ db2 "export to filename.del of del [modified by codepage=1386] select * from tablename where condition"
[db2inst1@localhost ~]$ db2 export to /home/db2inst1/data/tablename.ixf of del/ixf select * from tablename
导入数据
数据的导入方法有insert,import和load三种,其中load不需要写日志(或很少日志),不做检查约束和参照完整性约束,不触发Trigger,锁的时间比较短,因此特别适合大数据量的导入。
[db2inst1@localhost ~]$ db2 import/load from filename.del of del commitcount 1000000 modified by generatedignore codepage=1386 insert into tablename
[db2inst1@localhost ~]$ db2 import from c:\dftz.ixf of ixf/del commitcount 5000 [messages] [/home/db2inst1/logs/import.msg] insert/insert_update/replace into tablename
[db2inst1@localhost ~]$ db2 import from c:\dftz.ixf of ixf commitcount 5000 create/replace_create into tablename
如果之前导入数据发生日志已满的问题,可以使用skipcount,跳过已导入的数据
db2 "import from tab1.ixf of ixf modified by generatedignore COMMITCOUNT 500000 SKIPCOUNT 5000000 insert into RCDB2.T_CUST_DTL"
导入CVS
DB2 => LOAD client FROM './MTC.csv' OF del MODIFIED BY codepage=1208 chardel"" COLDEL0x2c METHOD P (1,2,3,4) INSERT INTO MTC_UNPASS_RATE( PLAZA_ID,PLAZA_NAME,TRANS_DATE,UNPASS_RATE)
下面详细解读该语句:
- Load Client from 说明是从客户端导入文件,如果是直接在数据服务器上执行,则去掉Client 关键词
- OF DEL,del 是delimeter的缩写,意为以指定的标点符号作为栏位之间的分割,而不是栏位的长度是固定的
- CODEPAGE, 指明csv文件的编码
- Chardel,标明字符串栏位以什么字符作为起始标志,此处说明是以双引号括起来
- COLDEL,标明栏位之间的间隔符号,此处说明是以逗号作为栏位的分隔符
- METHOD P,说明是按照栏位的序号,来定位需要导入的栏位数据,
- 另外有METHOD L, 说明是按照栏位在CSV 文件中固定的起始位置,例如
METHOD P(001 020,022 030,032 045,047 100) - INSERT INTO,指明插入到哪一张表及对应的字段
注:load与import相比,速度稍快,load不写日志,import会写日志。Import和Load 都可以将数据导入到DB2服务器中,但是2者是有很大区别的。Import 其实执行了SQL 的INSERT 操作。和INSERT 操作一样,Import 执行的时候会激活触发器,所有的约束会强制实现,而且会使用数据库的缓冲池。类似Oracle sqlloader工具的常规路径导入。Load 工具可以更快的将数据文件导入到数据表中。Load 工具不会与DB2 数据引擎发生交互,所以当使用Load 工具时,不会触发触发器也不会使用缓冲池,而且必须单独实现数据表的约束。Import 工具执行起来比Load 慢是因为它是低层次的数据操作工具,它分
LOAD,BUILD,DELETE 三个阶段对硬盘上的数据页面来进行直接的处理。Load工具类似Oracle sqlloader工具的直接路径导入。
快速清空表
[db2inst1@localhost ~]$ db2 import from /dev/null of del replace into tablename
DB2日志
db2diag.log日志
- 存放在
$DB2INSTANCE_HOME/sqllib/db2dump
下 - 该日志包含DB2所有错误和警告日志信息
stmm.log日志
- 存放在
$DB2INSTANCE_HOME/sqllib/db2dump/stmm
下 - 日志存放于多个文件中(最多5个)
- 该日志包含性能统计数据和DB2的优化结果
应用开发
DB2数据库连接
db2的链接分四种类型,依照 JDBC 规范,有四种类型的 JDBC 驱动程序体系结构:
Type 1
这类驱动程序将 JDBC API 作为到另一个数据访问 API 的映射来实现,如开放式数据库连通性(Open Database Connectivity,ODBC)。这类驱动程序通常依赖本机库,这限制了其可移植性。JDBC-ODBC 桥驱动程序就是 Type 1 驱动程序的最常见的例子。
Type 2
这类驱动程序部分用 JAVA 编程语言编写,部分用本机代码编写。这些驱动程序使用特定于所连接数据源的本机客户端库。同样,由于使用本机代码,所以其可移植性受到限制。
Driver Name:COM.ibm.db2.jdbc.app.DB2Driver
URL Pattern:jdbc:db2:databasename
Type 3
这类驱动程序使用纯 JAVA 客户机,并使用独立于数据库的协议与中间件服务器通信,然后中间件服务器将客户机请求传给数据源。
Driver Name:COM.ibm.db2.jdbc.net.DB2Driver
URL Pattern:jdbc:db2:ServerIP:6789:databasename
Type 4
这类驱动程序是纯 JAVA,实现针对特定数据源的网络协议。客户机直接连接至数据源。
Driver Name:com.ibm.db2.jcc.DB2Driver
jdbc:db2://ServerIP:50000/databasename
Hibernate连接DB2配置
db2inst1
root
com.ibm.db2.jcc.DB2Driver
jdbc:db2://localhost:50000/etc
org.hibernate.dialect.DB2Dialect
true
true
update
thread