DB2 Reference Card

DB2 Reference Card

基本概念

体系结构

数据库必须受实例的管理,例如数据库的起停等,在非集群的情况下,一个数据库只能由一个实例管理,但一个实例可以管理多个数据库。

安装

  1. 运行db2_precheck检查安装要求是否满足
  2. 运行db2_install安装
  3. 创建一个新用户db2inst1作为数据库实例用户
  4. 创建数据库实例

基本使用

快速入门

启动数据库实例

安装完成后,切换到数据库实例用户下,以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 sql
loader工具的直接路径导入。

快速清空表

[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>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容