DB2安装的时候选择了和系统用户一致的选项,然后登陆的时候,连接的时候输入的就是计算机用户的用户名和密码。

1.3 DB2数据库体系结构

系统

一个系统表示DB2的一个安装。在一个由很多及其组成的网络环境中,我们有时也称系统为数据库分区。一个系统可以包含多个DB2实例,每个实例能够管理一个或多个数据库。

实例也称为数据库管理器(Database Management Application),是数据库管理器在内存中的映像,是管理数据库的DB2代码。每一个实例都是一个独立的运行环境,管理若干个数据库,一个数据库只属于一个实例。

检查系统的变量的搜索顺序:先环境变量,再全局级注册变量,最后实例级注册变量。

Databases

关系数据库使用一组表来管理数据,一个表由在行和列中以逻辑关系排列的数据组成,每个表的数据在逻辑上相关,在表之间能够定义关系。

每个数据库包含一组系统编目表(或称之为数据字典)、配置文件和恢复日志,

  • 系统编目表用于描述数据的逻辑和物理结构
  • 配置文件包含所有为数据库分配的配置参数值
  • 恢复日志记录正在进行的事务处理和可存档的事务处理

Tablespaces

表空间是数据库中表数据与数据库之间的逻辑中间层,数据库中的物理空间组织为表空间的集合,而表空间是表的逻辑集合。每个表空间包含容器集合,容器(container)是用来描述物理空间分配的一般术语。数据库将数据存储在自己的表空间容器中。

Connectivity and DB2 directories

  • 节点目录:用于存储远程数据库的所有连通性信息。
  • 系统数据库目录(或系统db目录):包含本地数据库目录和从远程的机器上映射到本地的数据库目录。
  • 本地数据库目录(或本地db目录):包含了有关本地数据库的详细信息。当使用create database命令创建数据库时,在该目录中会添加一个条目。

模式

模式是数据库对象特征划分的结果集。数据库中所建的每一个对象都有模式,这些模式会隐式或显式地增加为对象的前缀。

Tables,indexes and large objects

表是数据库的基本组成单元,是客观世界中实体的一种描述。

表由行、列组成。表的每列描述了对应实体的一个属性,同一列的数据都具有相同的数据类型。表的每一行都描述了一个实体的信息。

所有数据库和表数据都被存储在表空间中,表中的数据在逻辑上是相关的。可定义表之间的关系。

索引是与表相关的有序指针集,用于性能目的并确保唯一性。

视频、音频和扫描文件等可以作为打对象(LOB)存储在数据库中。

表、索引和LOB驻留在表空间中。为了提高性能,可以把数据、索引数据和打对象数据分别存放到不同的表空间。

视图

视图是从一个或几个基本表导出的表,也可以从其他视图导出。视图是虚拟的表。

Logs

日志是用于恢复目的的文件。

Bufferpool(s)

缓冲池是一块内存区域,所有索引和数据页(除了LOB)都必须有序地经过该区域,从而进行处理。它是数据库管理器所使用的主要高速缓存。在数据库性能问题方面,缓冲池是进行调优的最重要的对象。

系统编目表

每个数据库都会创建和维护一组描述数据的逻辑和物理结构的系统编目表。存储在SYSCATSPACE表空间中。

性能视图

性能视图用于存储数据库管理员的性能和操作信息。

第2章 创建实例和管理服务器

要创建数据库就必须创建实例,数据库是运行在实例之上的。

管理服务器(DAS,Database Administrator Server)是一个特殊类型的实例,它主要执行远程管理任务。

实例概念

实例是DB2的执行代码和数据库对象的中间逻辑层。

实例用来为数据库提供安全、通信、内存分配和进程间通信等功能。遮掩数据库只负责前台正常的运行,而一些后台的事情由实例来进行管理。

实例本质上由一组后台进程和共享内存来进行管理。

实例和数据库不一样的地方是:数据库是物理的,我们的表、索引存放在数据库中药占物理存储;而实例是逻辑的,是共享内存、进程的一些配置文件(实例目录)的集合。当实例停止时,共享内存释放,进程停止。

在许多数据库产品中都有类似实例概念:Oracle中的实例(instance),Informix、Sybase、SQL Server中的Server。

创建实例

创建实例使用db2icrt(db2 Instance CReaTe)命令。

[page.33 图2-1]

实例目录

实例目录包含:

  • 数据库管理器配置文件(db2systm)
  • 系统数据库目录(SQLDBDIR)
  • 节点目录(SQLNODIR)
  • 节点配置文件(db2nodes.cfg),db2nodes.cfg文件用来定义参与DB2实例的数据库分区服务器。如果想要将告诉互连用于数据库分区。
  • 诊断文件、数据库错误日志等。

db2set命令:设置DB2级别的变量。

例:查看已经设置的注册表变量:

db2set -all

[i]表示实力级别上定义的变量;[g]表示全局变量;[e]表示操作系统级别的环境变量。

例:查看可以在DB2中进行定义的所有注册表变量:

db2set -lr

例:全局级别设置特定变量

db2set DB2INSTPROF="C:\INSTDIR" -g

例:实例级别设置变量

db2set DB2INSTPROF="C:\MY FILES\SQLLIB" -i DB2

当同一个注册表变量在不同级别上进行定义时,DB2总是会选择最低级别的值。

为了安全,建议在对注册表变量作了更改后总是停止和启动实例。

db2ilist命令列出机器上的DB2实例。

db2imigr命令用于迁移实例。

db2iupdt命令用于更新实例配置。

在Linux下允许/组织一个实例在每次系统重新启动后自动启动:

db2iauto -on/-off <instance name>

启动实例:db2start

连接至实例和从实例断开

连接至实例:

db2 attach to <instance name>

断开:

db2 detach

db2stop命令停止实例。

db2stop force强制停止实例。 这时所有连接上数据库未提交的应用将强制回滚。

DB2INSTANCE变量

DB2INSTANCE环境变量制定当前活动实例,所有命令都将应用于该实例。例如,如果将DB2INSTANCE设置成“PROD”,那么发出命令“create database mydb”会创建出与实例“PROD”相关的数据库。

在Linux使用“export”或“setenv”命令设置该环境变量,在Windows平台下使用:

set DB2INSTANCE=DB2

查看该变量的当前设置(三选一):

echo %DB2INSTANCE% (Windows only);echo $DB2INSTANCE (Linux/Unix)
set DB2INSTANCE
db2 get instance

删除实例:

db2idrop <instance_name>

配置实例

每个实例创建后,都有一个实例配置文件(db2systm),该文件为二进制的,只能通过命令来修改。

查看当前实例配置参数:

db2 get dbm cfg

更新实例配置文件中的个别条目:

db2 update dbm cfg using ..

将配置参数复位为建议的默认值:

db2 reset dbm cfg

在某些情况下,对实例配置文件的更改仅在将更改装入内存后才生效(即在执行db2stop之后,再执行db2start时生效)。

2.2 管理服务器

数据库管理服务器(DAS,Database Administration Server)。它时一个驻留在数据库服务器机器上的特殊实例。DAS时一个特殊的DB2管理控制点,它用于仅帮助其他DB2服务器执行远程管理任务。

DB2管理服务器(DAS)响应来自远程DB2服务器管理工具和配置助手(CA)的请求。

DB2数据库服务器中只能有一个DAS,但这个DAS可以同时管理多个实例。

DB2全局注册变量参数DB2ADMINSERVER定义了管理DB2数据库服务器的DAS。

1.在Windows上创建DAS

在Windows上,创建DAS须具有本地Administrator权限。如果期望使用特定用户账户,在发出db2admin create时必须使用“/USER:”和“/PASSWORD:”。

在一个数据库服务器中只能有一个DAS。如果已经创建了DAS,呢么需要通过发出db2admin drop来将其删除。

创建DAS后,可能需要更改Windows上运行DAS服务的用户标识。可使用db2admin命令设置或更改登陆账户:

db2admin setid <username> <password>

其中和是具有本地管理员权限的用户名和密码。

在创建了DAS之后,就可以使用db2admin setid命令提供一个用户账户名和用户密码,来建立或修改它的所有权。

2.在Linux和Unix上创建DAS

(1) 使用root权限登陆

(2) 首先利用操作系统命令(mkuser、useradd;mkgroup、groupadd)创建DAS的用户和用户组并设置密码

(3) 运行dascrt命令:

DB2DIR/instance/dascrt -u DASuser

其中DB2DIR是DB2安装目录。

启动和停止DB2管理服务器

在Windows上手动启动或停止DAS,必须首先使用属于Administrators、Server Operators或Power Users组的账户或用户标识登陆计算机。

在Linux上手动启动或停止DAS,账户或用户标识必须成为dasadm_group的一部分。dasadm_group在DAS配置参数中制定。

要启动或停止DAS,使用db2admin startdb2admin stop命令。

列示DB2管理服务器

使用db2admin命令列示计算机上的DAS的名称。

更新DB2管理服务器(Linux)

在Linux操作系统上,可以在一台机器上多次安装DB2数据库产品。DB2管理服务器则只能有一个,但是,所有DB2副本都将使用它。DAS可以从任何一个DB2副本创建,并将在与该DB2副本相同的修订报级别运行。如果对该DB2副本打了补丁,应发出dasupdt命令来更新DAS。

要更新DAS:

(1) 使用超级用户权限(通常作为“root”用户)登陆到计算机。

(2) 发出dasupdt命令:

DB2DIR/instance/dasupdt

使用db2admin stop来停止DAS,使用``dasdrop`命令删除DAS。

dasdrop命令出去DB2管理服务器的主目录下的das子目录。

配置管理服务器

db2 get admin cfg命令查看DAS的当前配置参数。 db2 update admin cfg using命令用于更新DAS配置文件中的个别条目。

db2 reset admin cfg将配置参数复位为建议的默认值。

进入cmd,然后输入db2cmd进入DB2控制台。

DB2实例

db2list:列出所有可用的系统上的实例。

输出:DB2

db2 get instance:显示当前运行的实例的详细信息。

输出:当前数据库管理器实例是:DB2

set db2instance=<instance_name> :设置实例。

示例:安排DB2到当前用户:set db2instance=DB2

db2start:使用此命令启动一个实例。在此之前,需要运行“set instance”。

正常启动会报错,解决办法:打开开始菜单-->IBM...有一个以管理员用户启动的选项,经此进入命令行。

输出:SQL1026N 数据库管理器已活动。

db2stop:停止正在运行的实例。

输出:SQL1064N DB2STOP 处理成功。

db2icrt:创建一个新的实例。实例ID不可以是root id或root名称。

例:db2icrt db2inst2

输出:DB20000I DB2ICRT 命令成功完成。

DB2数据库

db2 create database <database name>:创建一个新的数据库。“database_name”表示新创建的数据库名称。

例:db2 create database one(很慢)

输出:DB20000I CREATE DATABASE 命令成功完成。

db2 create database <db_name> restrictive:创建严格数据库。

例:创建一个新的名为“two”的限制数据库:db2 create database two restrictive

输出:DB20000I CREATE DATABASE 命令成功完成。

db2 list database directory:查看当前实例可用的目录列表。

输出:

 系统数据库目录

 目录中的条目数 = 2

数据库 1 条目:

 数据库别名                      = TWO
数据库名称 = TWO
本地数据库目录 = C:
数据库发行版级别 = 14.00
注释 =
目录条目类型 = 间接
目录数据库分区号 = 0
备用服务器主机名 =
备用服务器端口号 = 数据库 2 条目: 数据库别名 = ONE
数据库名称 = ONE
本地数据库目录 = C:
数据库发行版级别 = 14.00
注释 =
目录条目类型 = 间接
目录数据库分区号 = 0
备用服务器主机名 =
备用服务器端口号 =

db2 activate db <db_name>:激活数据库。

例:激活数据库“one”:db2 activate db one

db2 deactivate db <db_name>:停用数据库。

例:停用数据库“one”:db2 deactivate db one

db2 connect to <database name>:连接数据库。

创建一个数据库,把它投入使用后,需要连接或启动数据库。

例:连接到数据库“one”:db2 connect to one

db2 get db cfg for <db_name> | grep -i restrict:验证数据库是否处于限制。(“db”表示数据库,“cfg”表示的配置,'db_name'表示数据库名称)

例:检查“one”数据库是否处于限制:db2 get db cfg for one | grep -i restrict

数据库管理器配置参数

db2 get database manager configurationdb2 get dbm cfg:获得实例数据库管理器的信息

db2 update database manager configurationdb2 update dbm cfg:更新实例数据库管理器

db2 reset database manager configurationdb2 reset dbm cfg:重置数据库管理器配置

数据库配置参数

db2 get database configurationdb2 get db cfg:获得数据库的信息

db2 update database configurationdb2 update db cfg:更新数据库配置

db2 reset database configurationdb2 reset db cfg:重置数据库配置

db2 "call get_dbsize_info(?,?,?,-1)":检查当前的活动数据库的大小

db2 "call get_dbsize_info(?,?,?,-1)":验证当前激活数据库的大小

验证数据库的权限:

db2 "select substr(authority,1,25) as authority, d_user, d_group, d_public, role_user, role_group, role_public,d_role from table(sysproc.auth_list_authorities_for_authid('public','g'))as t order by authority"

db2 "select substr(authority,1,25) as authority, d_user, d_group, d_public, role_user, role_group, role_public,d_role from table(sysproc.auth_list_authorities_for_authid('PUBLIC','G'))as t order by authority"

db2 drop database <db_name>从实例中删除数据库。

DB2缓冲池

db2 select * from syscat.bufferpools查看当前数据库中所有可用的缓冲池

db2 create bufferpool <bp_name> pagesize <size>:创建缓冲池。

例:创建一个名为“bpnew”,大小为“8192”(8KB)的缓冲池:db2 create bufferpool bpnew pagesize 8192

drop bufferpool <bp_name>:删除缓冲池

例:删除名为“bpnew”的缓冲池:db2 drop bufferpool bpnew

DB2存储组

db2 select * from syscat.stogroups:列出数据库中所有的存储组。

db2 create stogroup <stogroup_name> on 'path':创建一个新的存储组。“stogroup_name”表示新的存储组名字,“path”表示数据(表)的存储位置

例:在'/data1'文件夹创建一个新的存储组'stg1':db2 create stogroup stg1 on '/data1'

db2 create tablespace <tablespace_name> using stogroup <stogroup_name>:创建存储组表空间

例:在存储组“stg1”中新建名为“ts1”的表空间:db2 create tablespace ts1 using stogroup stg1

db2 alter stogroup add ‘location’, ‘location’:将一个存储组从原来的位置移动到新的位置

例:db2 alter stogroup sg1 add ‘/path/data3’, ‘/path/data4’

db2 alter stogroup drop ‘/path’:存储组中删除文件夹路径

db2 alter tablspace <ts_name> rebalance:重新调整表空间

例:db2 alter tablespace ts1 rebalance

db2 rename stogroup <old_stg_name> to <new_stg_name>:重命名存储组

例:将存储组的名字从“sg1”变为“sgroup1”:db2 rename stogroup sg1 to sgroup1

db2 alter tablspace <ts_name> using stogroup <another sto_group_name>为表空间分配不同的存储组。

例:db2 alter tablespace ts1 using stogroup sg2

db2 drop stogorup <stogroup_name>:删除存储组

例:db2 drop stogroup stg1

DB2模式

db2 get scheme:获得当前数据库的模式。(不能用)

db2 set schema=<schema_name>:为当前实例设置另一个模式

db2 create schema <schema_name> authroization <inst_user>:创建新模式

例:在实例“db2inst2”创建模式“schema1”:db2 create schema schema1 authorization db2inst2

DB2表

在表中,每个垂直块称为列(元组),每个水平块称为行(实体)。

db2 create table <schema_name>.<table_name> (column_name column_type....) in <tablespace_name>:创建一个新表

例:db2 create table professional.employee(id int, name varchar(50),jobrole varchar(30),joindate date, salary double) in ts1

db2 select tabname, tabschema, tbspace from syscat.tables:查看含有模式创建的表的列表

db2 describe table <table_name>:查看表的列和数据类型

例:db2 describe table professional.employee

db2 create table <tab_name> (col1 datatype,col2 datatype implicitly hidden):隐藏列创建表

例:创建一个“customer”表中隐藏列“phone”:db2 create table professional.customer(custid integer not null, fullname varchar(100), phone char(10) implicitly hidden)

db2 insert into <tab_name>(col1,col2,...) values(val1,val2,..):插入数据到表中

例:db2 insert into professional.customer(custid, fullname, phone) values(100,'ravi','9898989')

db2 select * from <tab_name>:从表中检索值

例:检索“customer”表中的值:db2 select * from professional.customer

db2 select col1,col2,col3 from <tab_name>:从包括隐藏列的表中检索值

例:db2 select custid,fullname,phone from professional.customer

如果想看到隐藏的列中的数据,需要执行“DESCRIBE”命令。语法:db2 describe table <table_name> show detail

例:db2 describe table professional.customer show detail

db2 alter table <tab_name> alter column <col_name> set data type <data_type>:改变表列的类型

例:将员工表的列“ID”从“int”修改到“bigint”类型:db2 alter table professional.employee alter column id set data type bigint

db2 alter table <tab_name> rename column <old_name> to <new_name>:修改列名

例:将“customers”表的列名“fullname”修改为“custname”:db2 alter table professional.customer rename column fullname to custname

db2 drop table <tab_name>:删除表

例:db2 drop table professional.customers

要删除表(包括触发器和关系),需要使用“DROP TABLE HIERARCHY”命令删除整个层次。语法:db2 drop table hierarchy <tab_name>

例:db2 drop table hierarchy professional.customers

DB2别名

db2 create alias <alias_name> for <table_name>为数据库对象创建别名

例:为表“prefessional.customer”创建别名:db2 create alias pro_cust for professional.customer

如果通过“SELECT * FROM PRO_CUST”或“SELECT * FROM PROFESSIONAL.CUSTOMER”数据库服务器将显示同样的结果。

db2 select * from <alias_name>使用表的别名创建值

DB2约束

NOT NULL:禁止空值。

语法:db2 create table <table_name>(col_name col_type not null,..)

unique:唯一约束。跟在“not null”后面。

语法:db2 create table <tab_name>(<col> <col_type> not null unique, ...)

primary key:主键。

语法:db2 create table <tab_name>( ,.., primary key ())

例:创建“salesboys”表并将“sid”作为主键:db2 create table shopper.salesboys(sid int not null, name varchar(40) not null, salary double not null, constraint pk_boy_id primary key (sid))

foreign key:外键。

语法:

db2 create table <tab_name>(<col> <col_type>,constraint
<const_name> foreign key (<col_name>)
reference <ref_table> (<ref_col>)

使用约束。

语法:

db2 create table
(
primary key (),
constraint check (condition or condition)
)

例:

db2 create table empl
(id smallint not null,
name varchar(9),
dept smallint check (dept between 10 and 100),
job char(5) check (job in ('sales', 'mgr', 'clerk')),
hiredate date,
salary decimal(7,2),
comm decimal(7,2),
primary key (id),
constraint yearsal check (year(hiredate) > 1986 or salary > 40500)
)

删除约束

删除UNIQUE约束:db2 alter table <tab_name> drop unique <const_name>

删除主键:db2 alter table <tab_name> drop primary key

删除检查约束:db2 alter table <tab_name> drop check <check_const_name>

删除外键:db2 alter table <tab_name> drop foreigh key <foreign_key_name>

DB2索引

创建唯一索引,语法:

db2 create unique index <index_name> on
<table_name>(<unique_column>) include (<column_names..>)

例:创建shopper.sales1表的索引:

db2 create unique index sales1_indx on
shopper.sales1(id) include (itemname)

删除索引,语法:

db2 create unique index <index_name> on
<table_name>(<unique_column>) include (<column_names..>)

例:db2 drop index sales_index

DB2触发器

触发器使用SQL语句“CREATE TRIGGER”定义。

创建触发器序列的语法:

db2 create sequence <seq_name>

例如:用于创建表shopper.sales1序列的触发器

db2 create sequence sales1_seq as int start with 1 increment by 1

语法:

db2 create trigger <trigger_name> no cascade before insert on
<table_name> referencing new as <table_object> for each row set
<table_object>.<col_name>=nextval for <sequence_name>

示例:创建触发器shopper.sales1表自动插入主键编号

db2 create trigger sales1_trigger no cascade before insert on
shopper.sales1 referencing new as obj for each row set
obj.id=nextval for sales1_seq

现在尝试插入任何值:

db2 insert into shopper.sales1(itemname, qty, price)
values('bicks', 100, 24.00)

从表中检索值,语法:

db2 select * from <tablename>

例:db2 select * from shopper.sales1

创建after触发器,语法:

db2 create trigger <trigger_name> no cascade before insert on
<table_name> referencing new as <table_object> for each row set
<table_object>.<col_name>=nextval for <sequence_name>

示例:

db2 create trigger sales1_tri_after after insert on shopper.sales1
for each row mode db2sql begin atomic update shopper.sales1
set price=qty*price; end

删除触发器,语法:

db2 drop trigger <trigger_name>

例:db2 drop trigger slaes1_trigger

DB2序列

序列由CREATE SEQUENCE语句创建。

有两种类型的可用序列:

  • NEXTVAL: 它返回序列号的递增值。
  • PREVIOUS VALUE: 它返回最近生成值

使用如下语法创建序列:

db2 create sequence <seq_name>

例:

db2 create sequence sales1_seq as int start
with 1 increment by 1

查看序列,语法:

db2 value <previous/next> value for <seq_name>

例:db2 values previous value for sales1_seq

DROP SEQUENCE:删除序列。

语法:

db2 drop sequence <seq_name>>

例:从数据库中删除序列“sale1_seq”:db2 drop sequence sales1_seq

DB2视图

创建视图,语法:

db2 create view <view_name> (<col_name>,
<col_name1...) as select <cols>..
from <table_name>

示例:创建shopper.sales1表的视图:

db2 create view view_sales1(id, itemname, qty, price)
as select id, itemname, qty, price from
shopper.sales1

修改视图,语法:

db2 alter view <view_name> alter <col_name>
add scope <table_or_view_name>

例:

db2 alter view view_sales1 alter id add
scope shopper.sales1

删除视图,语法:

db2 drop view <view_name>

例:db2 drop view sales1_view

05-14 20:17