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 <tabname> RENAME COLUMN <column_name> TO <new_column_name>
新增自增列
假设表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','Amy@ss.com')
[db2inst1@localhost ~]$ db2 insert into newuser(username,password,email) values('Judy','1234','Judy@ss.com')
修改
删除
数据导入导出
执行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配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.username">db2inst1</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.ibm.db2.jcc.DB2Driver</property>
<property name="connection.url">jdbc:db2://localhost:50000/etc</property>
<property name="dialect">org.hibernate.dialect.DB2Dialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- <property name="hibernate.default_schema">hibernate</property> -->
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping class="com.cn.naive.DB2Test.Event" />
</session-factory>
</hibernate-configuration>