##db2move

db2move 是一个数据移动工具,可以用来在 DB2 数据库之间移动大量的表。该命令中支持的操作有 EXPORT、IMPORT 和 LOAD。
db2move 的语法可以象下面那样简单:
db2move database_name action options

该工具先从系统目录表中抽取用户表列表,接着以 PC/IXF 格式导出每个表。然后,可以将这些 PC/IXF 文件导入或装入到另一个
DB2 数据库。
以下是一些示例。下面这条命令用指定的用户标识和密码以 REPLACE 方式导入 sample 数据库中的所有表:

db2move sample import -io replace -u userid -p password
而下面这条命令则以 REPLACE 方式装入 db2admin 和 db2user 模式下的所有表:

db2move sample load -sn db2admin, db2user -lo REPLACE
   ##db2look 是一个方便的工具,可以从命令提示符或控制中心对其进行调用。该工具可以:

从数据库对象抽取数据库定义语言(DDL)语句
生成 UPDATE 语句来更新数据库管理器和数据库配置参数
生成 db2set 命令来设置 DB2 概要文件注册表
抽取和生成数据库统计报告
生成 UPDATE 语句来复制有关数据库对象的统计信息
类似 LOAD 的实用程序都要求存在目标表。您可以使用 db2look 来抽取表的 DDL,对目标数据库运行该 DLL,然后调用装入操作。如同下面
的示例所演示的那样,db2look 使用起来非常方便。下面这条命令为(来自数据库 department 的)peter 所创建的所有对象生成 DDL 语句,
同时将输出存储在 alltables.sql 中。


db2look -d department -u peter -e -o alltables.sql


接下来这条命令生成:

数据库 department 中所有对象的 DLL(由选项 -d、-a 和 -e 指定)。
复制数据库中所有表和索引的统计信息的 UPDATE 语句(由选项 -m 指定)。
GRANT 授权语句(由选项 -x 指定)。
用于数据库管理器和数据库配置参数的 UPDATE 语句,以及用于概要文件注册表的 db2set 命令(由选项 -f 指定)。

db2look -d department -a -e -m -x -f -o db2look.sql

##RUNSTATS 实用程序

DB2 利用一个完善的、基于成本的优化器来确定如何访问数据。其决策在很大程度上受到了一些统计信息的影响,这些统计信息是关于数据库
表和索引的大小的。因此,要时刻使数据库统计信息保持最新状态,以便能够选择有效的数据存取方案,这一点十分重要。RUNSTATS 实用程
序用于更新表的物理特征及其相关索引的统计信息。这些特征包括记录数(基数)、页数和平均记录长度等。
让我们用一些示例来演示此实用程序的用法。下面的命令收集表 db2user.employee 的统计信息。在计算统计信息期间允许阅读器和记录器访
问该表:

RUNSTATS ON TABLE db2user.employee ALLOW WRITE ACCESS

以下命令用分布式统计收集表 db2user.employee 以及列 empid 和 empname 的统计信息。在此命令运行期间,该表只能用于只读请求。

RUNSTATS ON TABLE db2user.employee WITH DISTRIBUTION ON COLUMNS ( empid, empname )
    ALLOW READ ACCESS
以下命令收集表 db2user.employee 的统计信息及其全部索引的详细统计信息:

RUNSTATS ON TABLE db2user.employee AND DETAILED INDEXES ALL

##REORG 和 REORGCHK 实用程序

从数据库增删的数据在物理上可能并不是按顺序放置的。在这种情况下,DB2 必须执行额外的读操作来访问数据。通常,这意味着需要更多的
磁盘 I/O 操作,而我们都知道进行这类操作的代价是昂贵的。在这种情况下,您应该考虑根据索引对表进行物理上的重组,以便相关数据相
互之间靠得更近一些,从而尽可能地减少 I/O 操作。
REORG 是一个为表和/或索引重组数据的实用程序。虽然在物理上对数据进行了重新安排,但 DB2 却提供了联机或脱机执行该操作的选项。
在缺省情况下,脱机 REORG 允许其他用户读取该表。您可以通过指定 ALLOW NO ACCESS 选项来限制表访问。联机 REORG(也称为现场 REORG)
不支持对表的读访问或写访问。由于重新安排了数据页,因此并发应用程序可能必须等待 REORG 完成当前页。您可以使用适当的选项来轻松
地停止、暂停或重新开始重组过程:
下面的示例都是非常容易看懂的:

REORG TABLE db2user.employee INDEX db2user.idxemp INPLACE ALLOW WRITE ACCESS
REORG TABLE db2user.employee INDEX db2user.idxemp INPLACE PAUSE

REORGCHK 是另一个数据维护实用程序,它有一个选项可以用来检索当前的数据库统计信息或更新数据库统计信息。它还会生成带有 REORG
指示符的统计信息报告。REORGCHK 根据统计规则在需要 REORG 的地方用星号(*)标记表或索引。
让我们考虑一些示例。下面这条命令生成当前(关于运行时授权标识拥有的全部表的)统计信息的报告:
REORGCHK CURRENT STATISTICS ON TABLE USER

下面的命令更新统计信息,然后生成在模式 smith 下创建的全部表的报告:

REORGCHK UPDATE STATISTICS ON SCHEMA smith

##REBIND 实用程序和 FLUSH PACKAGE CACHE 命令

在执行数据库应用程序或任何 SQL 语句之前,必须先由 DB2 对它们进行预编译,并生成一个包。包是一种数据库对象,其中含有应用程序
源文件中所使用的已编译 SQL 语句。DB2 使用该包来访问 SQL 语句中引用的数据。DB2 优化器如何为这些包选择数据存取方案呢?它依靠
包创建时的数据库统计信息。
对于静态 SQL 语句,包在编译时创建,并且被绑定到数据库上。如果对统计信息进行了更新,以反映物理数据库特征,那么也应该更新现有
的包。REBIND 实用程序允许您重新创建包,以便可以利用当前的数据库统计信息。命令十分简单:

REBIND PACKAGE package_name


不过,如果您要更改应用程序源代码,那么就得显式地删除现有的相关包,然后重新创建包。REBIND 实用程序不用于这一目的。这里,
我们之所以就此对您加以提醒,是因为 DBA 经常误解了 REBIND 的用法。
对于动态 SQL 语句,它们是在运行时预编译的,而且被存储在包高速缓存中。如果更新了统计信息,那么您可能会刷新高速缓存,以便
重新编译动态 SQL 语句,从而获取更新的统计信息。命令类似下面的样子:

FLUSH PACKAGE CACHE DYNAMIC

##数据库维护过程
RUNSTATS -- REORGCHK--YES--REORG
              |      |
              |      |
              NO   |----- RUNSTATS
              |----|---------|
              REBIND      FLUSH PACKAGE CACHE
                 |      |
                 APPLICATION EXECUTION
                
##DB2性能顾问程序
1,图形化工具CONFIGURATION ADVISOR
2,CLP AUTOCONFIGURE USING mem_percent 60 workload_type complex num_stmts 20 APPLY DB AND DBM

##DB2 设计顾问程序

设计顾问程序可以帮您找到 SQL 语句的最佳索引。它使用 DB2 优化器、数据库统计信息和解释(Explain)
机制来为特定查询或一组 SQL 语句(也称为工作负载)生成推荐索引。您可以从命令行用 db2advis 加上必要的输入启动该顾问程序。
下面的示例使用输入文件
input.sql 对 sample 数据库执行设计顾问程序,该输入文件含有一组 SQL 语句。然后将输出存储在 output.out 中。
db2advis -d sample -i input.sql -o output.out

图形化工具:desigen Advisor

### 备份与恢复

##数据库恢复概念
  系统故障,事务故障,介质故障,灾难。
  #恢复策略
    问题:可以再次从另一个来源装入数据吗?能够承受丢失多少数据?
          能化多少时间来恢复数据库?哪些存储资源可用于存储备份和日志?
  #恢复类型
    崩溃恢复(系统崩溃,DB2重新启动执行回滚),版本恢复(使用从BACKUP命令
    获取的备份中恢复先前的数据库版本),前滚恢复(通过使用完全数据库备份,结合
    日志文件来扩展版本恢复,要求使用归档日志记录)
    db2采用先写日志后写磁盘数据库的方式。
  #主日志文件和辅助日志文件
    主日志文件是在首次数据库连接时或数据库激活时直接分配的。辅助日志文件需要时每次动态地分配一个。

有几个与日志记录相关的数据库配置参数。其中一些参数是:

LOGPRIMARY:该参数确定要分配的主日志文件数。
LOGSECOND:该参数确定可分配的辅助日志文件的最大数目。(最大254)
LOGFILSIZ:该参数用于指定日志文件的大小(用 4 KB 页为单位)。
让我们考虑一个示例。假设数据库配置文件中有下列值:

Log file size (4 KB)                        (LOGFILSIZ) = 250
Number of primary log files                (LOGPRIMARY) = 3
Number of secondary log files               (LOGSECOND) = 2
Path to log files                                       = C:\mylogs\

一旦首次建立与数据库的连接,就分配三个主日志文件,它们均由 250 个 4 KB 页组成。
DB2 将填满第一个日志,然后继续填满第二个和第三个日志。填满第三个日志文件后,没有更多的主
(预分配的)日志文件,因此 DB2 将动态地分配第一个辅助日志文件,因为 LOGSECOND 大于零。一旦
这个日志文件被填满,DB2 将继续分配另一个辅助日志文件,并将重复该过程,直到达到 LOGSECOND 日
志文件数目的最大值为止。对于该示例,当 DB2 尝试分配第三个辅助日志文件时,它将返回一个错误,
指出已经达到事务满条件。此时,将回滚该事务。

#无限日志记录
要允许无限的活动日志记录:

将 USEREXIT 数据库配置参数设置为 ON。
将 LOGSECOND 设置为值 -1。
#日志类型
活动日志。如果满足下面两个条件中的任何一个,则认为该日志是活动的:
它包含有关还未提交或回滚的事务的信息。
它包含有关已经提交但其更改还未被写入数据库磁盘(外部化)的事务的信息。
联机归档日志。这种类型的日志包含已提交的且已外部化的事务的信息。这种日志被保存在与活动日志相同的目录中。
脱机归档日志。是指已经从活动日志目录移动到另一个目录或介质的归档日志。可以手工或使用用户出口(userexit)
的自动过程来完成这个移动。

   ##日志记录类型
   循环日志类型:循环日志记录是 DB2 的缺省日志记录方式。从其名称可以知道,这种类型的日志记录以循环方式重用日志。例如,如果
有四个主日志文件
   ,那么 DB2 将以如下顺序使用它们:Log #1,Log #2,Log #3,Log #4,Log #1,Log #2 等。
只要日志仅包含有关已经提交的且被外部化到数据库磁盘的事务的信息,就可以用循环日志记录方式重用它。换言之,如果日志仍
是一个活动日志,则不能重用它。
采用上面的示例,如果一个长期运行的事务使用五个日志,那么将发生什么情况呢?
在这种情况下,DB2 将分配另一个日志文件 — 辅助日志文件,

  归档日志记录。同样,可以从其名称知道,当使用归档日志记录时,将归档(保留)日志。在循环日志记录中,要覆盖已提交且已外部化的
事务,而在归档日志记录中,将保存它们。
  例如,如果有四个主日志,DB2 可能以如下顺序使用它们:Log #1,Log #2,Log #3,Log #4,(如果 Log #1 的所有事务都已被提
交且外部化,则将其归档),Log #5,
  (如果 Log #2 的所有事务都已被提交且外部化,则将其归档),Log #6 等。
正如您从上面的示例所看到的那样,DB2 将使四个主日志文件保持可用,并且将不重用那些已经用某些事务填满的日志文件,这些
事务已经被提交且外部化。换言之,
它不会覆盖已变成归档日志的日志。
注:在使用归档日志记录之前,需要启用它。要启用它,必须同时打开下列参数或打开其中的任意一个:

LOGRETAIN (db2 update db cfg for database_name using LOGRETAIN ON)
USEREXIT  (db2 update db cfg for database_name using USEREXIT ON)
循环日志记录仅支持崩溃和版本恢复,而归档日志记录支持所有类型的恢复:崩溃恢复、版本恢复和前滚恢复。

用户出口

我们在前几章中多次提到用户出口。用户出口是允许将联机归档日志移到另一个目录(非活动日志目录)或另一个介质的程序。当为完全数据库
恢复进行 ROLLFORWARD 操作期间需要脱机归档日志时,用户出口还会将它们检索到活动日志目录中。要启用用户出口,将 USEREXIT 数据库配置参
数设置为 ON。一旦启用,DB2 将根据需要自动调用用户出口程序。需要将该程序命名为 db2uext2,在 Windows 中,应该将它存储在 sqllib\bin
目录中,在 UNIX 中,应该将它存储在 sqllib/bin 目录中。

## 数据库和表空间备份

#数据库备份 第 2 页(共6 页)




数据库备份是数据库的完整副本。除了数据外,备份副本还会包含有关表空间、容器、数据库配置、日志控制文件以及恢复历史记录文件的信息。注:备份将不存储数据库管理器配置文件或注册表变量。只备份数据库配置文件。

要执行备份,需要 SYSADM、SYSCTRL 或 SYSMAINT 权限。

下面是用于这种备份的 BACKUP 命令实用程序的语法:


BACKUP DATABASE database-alias [USER username [USING password]]
      [TABLESPACE (tblspace-name [ {,tblspace-name} ... ])] [ONLINE]
      [INCREMENTAL [DELTA]] [USE {TSM | XBSA} [OPEN num-sess SESSIONS]] |
   TO dir/dev [ {,dir/dev} ... ] | LOAD lib-name [OPEN num-sess SESSIONS]]
      [WITH num-buff BUFFERS] [BUFFER buffer-size] [PARALLELISM n]
      [WITHOUT PROMPTING]


要使用其它备份选项来执行数据库“sample”的完全脱机备份,可以使用以下命令:


(1) BACKUP DATABASE sample                     
(2)   TO /db2backup/dir1, /db2backup/dir2    
(3)   WITH 4 BUFFERS                         
(4)   BUFFER 4096                            
(5)   PARALLELISM 2                          


让我们更仔细地研究该命令:

指明要备份的数据库的名称(或别名)。
指定用来存储备份的一个或多个位置。
确定在备份操作期间可以使用内存中的多少缓冲区。使用多个缓冲区可以改善性能。
确定每个缓冲区的大小。
确定使用多少个介质阅读器/记录器进程/线程来执行备份。
注:语法中没有关键字 OFFLINE,因为这是缺省方式。要执行 sample 数据库的完全联机备份,必须指定关键字 ONLINE,如下所示:


BACKUP DATABASE sample                  
  ONLINE                              
  TO /dev/rdir1, /dev/rdir2           


我们先前提到过:联机备份允许其他用户在备份数据库时对它进行访问。这些用户所做的一些更改很可能在备份时没有存储在备份副本中。
因此,恢复时需要联机备份和一组完整的归档日志。此外,联机备份一完成,DB2 就强制当前的活动日志关闭;结果,将归档该日志。

注:联机备份要求为数据库启用归档日志记录。 DB CFG: LOGHEAD指向活动的最低编号的日志,小于LOGHEAD的日志
是归档日志且可以移动。可以使用ARCHIVE LOG 命令来对日志进行归档。



#表空间备份
   在只有一些表空间有相当大更改的数据库中,可以选择不备份整个数据库,而只备份特定表空间。
要执行表空间备份,请使用以下语法:

(1) BACKUP DATABASE sample
(2) TABLESPACE ( syscatspace, userspace1, userspace2 )
(3) ONLINE
(4) TO /db2tbsp/backup1, /db2tbsp/backup2
通常,您想要将相关的表空间备份在一起,如数据,索引,LOB
  或定义了表间引用约束的表的表空间
 
  注意:此备份方式只能用于ARCHIVAL LOGGIN 环境中。

  #增量备份
  有两种类型的增量备份:

增量:DB2 备份自上次完全数据库备份以来所更改的所有数据。
delta:DB2 将只备份自上一次成功的完全、增量或差异备份以来所更改的数据。

注意:要执行增量备份,DB CFG中的TRACKMOD必须设置为 YES(跟踪表空间中发生变化的页面).
  在控制中心执行备份。
 
  #备份文件
  磁盘上的 DB2 备份文件的命名约定包含下列几项:

数据库别名
表示备份类型的数字(0 表示完全数据库备份,3 表示表空间备份,4 表示来自 LOAD 的副本)
实例名
数据库节点(对于单一分区数据库始终是 NODE0000)
目录节点号(对于单一分区数据库始终是 CATN0000)
备份的时间戳记
映像序列号

分区数据库的备份:
In the following example, the database WSDB is defined on all 4 partitions,
numbered 0 through 3. The path /dev3/backup is accessible from all
partitions. Partition 0 is the catalog partition, and needs to be backed-up
separately since this is an offline backup. To perform an offline backup of all
the WSDB database partitions to /dev3/backup, issue the following
commands from one of the database partitions:

db2_all ’<<+0< db2 BACKUP DATABASE wsdb TO /dev3/backup’
db2_all ’|<<-0< db2 BACKUP DATABASE wsdb TO /dev3/backup’
posted @ 2005-06-08 19:08 小马歌 阅读(972) | 评论 (0)编辑 收藏
 
#声明临时表
DECLARE GLOBAL TEMPORARY TABLE session.temp1
  LIKE employee
  ON COMMIT PRESERVE ROWS
  NOT LOGGED
IN mytempspace

#ALTER
  可以修改:缓冲池,表,表空间,视图

#DROP
  可以删除:缓冲池,事件监控程序,函数,索引,模式,存储过程,表,表空间,触发器,视图.
#产生数据备份
CREATE TABLE pers LIKE staff

INSERT INTO pers
  SELECT id, name, dept, job, years, salary, comm
    FROM staff
    WHERE dept = 38

#唯一性约束
CREATE TABLE BOOKS (BOOKID INTEGER NOT NULL PRIMARY KEY,
                    BOOKNAME VARCHAR(100),
                    ISBN CHAR(10) NOT NULL CONSTRAINT BOOKSISBN UNIQUE)

ALTER TABLE BOOKS ADD  CONSTRAINT UNIQUE (BOOKID)

#参照完整性约束
CREATE TABLE AUTHORS (AUTHORID INTEGER NOT NULL PRIMARY KEY,
                      LNAME VARCHAR(100),
                      FNAME VARCHAR(100))
CREATE TABLE BOOKS (BOOKID INTEGER NOT NULL PRIMARY KEY,
                    BOOKNAME VARCHAR(100),
                    ISBN CHAR(10),
                    AUTHORID INTEGER REFERENCES AUTHORS)

#表检查约束
ALTER TABLE BOOKS ADD BOOKTYPE CHAR(1) CHECK (BOOKTYPE IN ('F','N') )


#创建索引
CREATE INDEX I2BOOKNAME ON BOOKS (AUTHOID DESC, BOOKNAME ASC)


#设置概要文件注册表
  设置后实例要重新启动
  列出所有的变量: db2set -lr
  设置变量:db2set variable_name=value
  设置为缺省值:db2set variable_name=
  显示设置的变量:db2set -all
# 设置数据库管理器和数据库的参数
  获取当前参数:
    db2 get database manager configuration
db2 get database configuration for database_name
db2 get database manager configuration show detail
  设置参数:
   db2 update database manager configuration using parameter new_value
db2 update database configuration for database_name using parameter new_value
#准备数据库服务端口
  db2set DB2COMM=TCPIP,NETBIOS
  在services文件中包含服务和端口号,
   如:db2icdb2    50000/tcp
  db2 update database manager configuration using svcename db2icdb2
  重新启动数据库.
 
#查看连接的应用程序
  db2 list applications [for database db-name] [show detail]
#断开应用程序
  db2 force application (6,5)
  db2 force application all
#设置客户认证方式
  db2 update database manager configuration authentication auth_type
#创建缓冲池
  create bufferpool BP2 size 25000 pagesize 8 k

CONNECT TO SCCRM;
ALTER BUFFERPOOL IBMDEFAULTBP IMMEDIATE NODE 1 SIZE 50000;
ALTER BUFFERPOOL IBMDEFAULTBP IMMEDIATE NODE 0 SIZE 50000;
CONNECT RESET;

#将表空间的状态复位成正常(NORMAL)
  quiesce tablespaces for table <tablename> reset
 
#有用的目录表
  SYSCAT.COLUMNS:所包含的每一行对应于表或视图中定义的每个列
  SYSCAT.INDEXCOLUSE:列出索引中包含的所有列
  SYSCAT.INDEXES:包含的每一行对应于表或视图中定义的每个索引(包括适用的继承索引)。
  SYSCAT.TABLES:所创建每个表、视图、别名(nickname)或别名(alias)都对应其中一行。所有目录表和视图都在 SYSCAT.TABLES 目录视图中拥有一项。
  SYSCAT.VIEWS:所创建的每个视图都对应其中一行或多行。
 

###监控DB2活动
  ##捕获快照
    数据库,表空间,表,缓冲池,锁,数据库管理器,应用程序
  #拍摄快照
   API,命令行
  UPDATE MONITOR SWITCHES
  #打开和关闭快照
   1,在实例级别上设置监视器开关(影响所有用户和数据库)
     DFT_MON_STMT:语句监视器(用于动态 SQL)
DFT_MON_TABLE:表监视器
DFT_MON_LOCK:锁监视器
DFT_MON_BUFPOOL:缓冲池监视器
DFT_MON_SORT:排序监视器
DFT_MON_UOW:工作单元信息
DFT_MON_TIMESTAMP:跟踪时间戳记信息
     db2 get dbm cfg|grep DFT_MON
     db2 update dbm cfg using monitorSwitch [ON|OFF]
db2 update dbm cfg using DFT_MON_SORT ON

   2,在应用程序级别上设置监视器开关(只适合于特定的应用程序)
   在CLP中打开只适合这个CLP
     Bufferpool
Lock
Sort
Statement
Table
Timestamp
UOW

db2 get monitor switches
    db2 update monitor switches using switchName [ON|OFF]
    3,复位开关
  db2 reset monitor [ALL|for database databaseName] [at dbpartitionnum partitionNum]
将监视器开关的值复位成空或0.
    #数据库快照
     包含如下信息:
     连接
DB2 代理程序

排序
缓冲池活动总数
SQL 活动
SQL 语句数量
日志使用情况
高速缓存使用情况
散列连接
    下面是获取这种快照的命令
db2 get snapshot for database on databaseName

    #数据库管理器快照
    db2 get snapshot for database manager
    #表快照
    db2 get snapshot for tables on drew_db
    #表空间和缓冲池快照
    db2 get snapshot for tablespaces on drew_db
    db2 get snapshot for bufferpools on drew_db

计算缓冲池命中率:
    Ratio = ((1-(physical index and data reads))/(logical index and data reads))*100%

    #锁快照
    db2 get snapshot for locks on drew_db
   
    #动态SQL快照
    #查找执行速度较慢的SQL
     SELECT stmt_text,total_exec_time,num_executions
     FROM TABLE (SNAPSHOT_DYN_SQL('DREW_DB',-1)) as dynSnapTab
     ORDER BY total_exec_time desc
     FETCH FIRST 1 ROW ONLY

    第二个示例查找平均执行时间最长的五条 SQL 语句:


SELECT stmt_text,
CASE WHEN num_executions = 0
THEN 0
ELSE (total_exec_time / num_executions)
END avgExecTime,
num_executions
FROM TABLE( SNAPSHOT_DYN_SQL('DREW_DB', -1)) as dynSnapTab
ORDER BY avgExecTime desc
FETCH FIRST 5 ROWS ONLY

### 事件监控器
     人们用快照来检查某个精确时刻的DB2,并聚集性能信息。事件监控器与此不同,人们用他在固定的时间
    周期内监控DB2性能。事件监视器检查数据库中的转换事件,并将每个事件都当成一个对象。这允许对 DB2 的行为进行非常详细的分析。
        事件监视器捕获的信息类似于快照捕获的信息。同时可以运行多个监视器,并且每个监视器也可以捕获多种事件类型的信息。这允许不同的管理员相互独立地监控不同的活动。

事件监视器可以捕获有关下列内容的信息:

数据库

死锁
表空间
缓冲池
连接
语句
事务
可将事件监视器的信息写到:

SQL 表
文件
管道

   ##创建事件监视器
     CREATE EVENT MONITOR
   ##打开和关闭监视器
     db2 set event monitor eventMonitorName state [0|1]
eventMonitorName 是已创建的事件监视器的名称。0 将关闭监视器,而 1 将打开监视器。
      #获取状态
      SELECT EVENT_MON_STATE('drewTest') FROM SYSIBM.SYSDUMMY1

SYSIBM.SYSEVENTMONITORS 表及该表的视图 SYSCAT.EVENTMONITORS 包含有关已创建的事件监视器的信息。可以对这些表运行 SQL 查询,以确定监视器的状态:
SELECT evmonname, target_type, target,
FROM syscat.eventmonitors
where evmonname LIKE 'drew%'

autostart 选项

用于创建事件监视器的命令中的 autostart 选项表明,每当数据库启动时,自动启动事件监视器。

#清空事件监视器
      注意:事件监控器名称使用大写字母,需要创建目录。
     
     
还可将事件监视器数据清空到磁盘中。如果您希望记录这类信息,如通常仅当终止所有连接时才写的数据库事件,那么这非常有用。下面是一个示例命令:

db2 flush event monitor eventMonitorName
#使用事件监视器
       事件监视器应当用于监控非常具体的一些事件或短时间内的工作负载。它
们旨在为您提供非常具体的信息,以允许您诊断数据库或应用程序的问题或行为。
与快照不同,事件监视器对 DB2 的性能影响极大。这是由于为每个事件对象写的
信息的数量造成的。语句监视器对性能的影响极大,因为数据库引擎必须为每个
查询执行所有额外的工作:不只是能够执行查询,DB2 引擎还必须写出这条查询
的所有特征和运行时信息。该信息必须写入文本文件,这样会进一步降低性能。

#死锁监控
        CREATE EVENT MONITOR DEADLOCK_DB
FOR DEADLOCKS
WRITE TO FILE 'deadlock_db'
MAXFILES 1
MAXFILESIZE NONE
AUTOSTART
              注意:事件监控器名称使用大写字母,需要创建目录。

#SQL监控
        SQL 监视器十分有用,因为它可以俘获动态和静态 SQL 语句。如果应用
程序利用了无法用 SQL 快照捕获的预编译 SQL 语句,那么该监视器就
很重要。

对于每条被执行的 SQL 语句记录一个事件。每个语句的属性(如读取、
选择和删除等等操作的行数)都被记录下来,但是不象在快照中那样以
汇总的方式进行表示。另外还记录执行的时间范围以及启动和停止次数。这允许您对一些事务以及某个应用程序的 SQL 执行对其它应用程序的 SQL 执行有何影响进行详细分析。

还可以使用 SQL 监视器来发现拙劣的执行代码;如果将输出放入表中,
那么通过对个别代码的执行次数进行搜索,可以做到这一点。由于运行
SQL 监视器的信息量以及性能开销,所以只应在短期测试或问题确定中
使用该技术,而不应在生产环境中使用它。

CREATE EVENT MONITOR BAR
FOR STATEMENTS
WRITE TO TABLE
STMT(TABLE drewkb.stmtTab)
includes(rows_read,rows_written_stmt_text)

#捕获事件监视器数据
        db2eva [db databaseName] [evm eventMonitorName]

       #利用EXPLAIN分析SQL
        SQL 的 Explain 通过图形化或基于文本的方式详细说明了 SQL 语句的每个部分是如何执行以及何时执行的。这包括以下一些基本信息:

正被访问的表
正被使用的索引
何时连接数据
何时排序数据
Explain 还捕获更复杂的信息,在细究 SQL 正在发生什么时,该信息非常有用:

表和索引基数
正连接的表和索引的顺序
结果集的基数
在查询的每部分正在选择哪些字段
排序方法
SQL 每部分的时间范围

       要理解 Explain 信息,您需要掌握的最重要概念是 timeron。timeron 是 DB2 优化器使
用的计量单位,用来计量完成查询的时间和资源数量。timeron 综合了时间、CPU 利用率、
I/O 和其它因素。由于这些参数值是变化的,因此执行某个查询所需的 timeron 数量是动态
的,每次执行该查询所需的 timeron 都不同。

#使用控制中心的EXPLAIN SQL
         观察SQL的存取方案,分析优化参数,考虑优化的级别。
        #使用字符工具
         db2 set current explain mode [no|yes|explain]
db2exfmt
可以从命令行调用 db2expln 工具,以获得查询的存取方案。但是,该工具不返回优化器信息。
        db2expln -database drew_db -statement "select * from syscat.tables" -terminal

#SQL故障诊断
        索引使用,是否使用索引,使用索引的顺序
        表基数和"SELECT *" 的使用
        优化级别太低。
        设置优化级别:db2 set current query optimization [0|1|2|3|5|7|9]
   ##使用运行状况中心和内存可视化工具
       # 选定实例使用view memory usage,可以把输出保存到文件。
   除了提供了内存可视化之外,该工具还允许您对某些参数值设置警报。警报的输出将被写到名为
threshold 的文件,该文件与 db2diag.log 位于同一目录下。该目录位于实例主目录下。根据
您创建实例时所做选择的不同,该位置也会不同。
# DB2运行状况中心
         是否有充足的资源(如可用内存、表空间容器或日志存储器)来完成任务
资源使用是否有效
任务是否在可接受的时间周期内完成,或者任务的完成是否不会大幅度降低性能
资源或数据库对象是否不会永远处于不可用状态

  ##DB2查询巡视器和控制器
       IBM 为 DB2 提供了两种主要工具,它们允许您监控和控制数据库上 SQL 的执行。DB2 控制器(Governor)用于控制
用户和应用程序执行其 SQL 的优先级。DB2 查询巡视器(Query Patroller)为决策支持系统提供了查询和资源管理。
该工具接受通过您系统的所有查询,并对其进行分析、优先排序和调度。
      
DB2 查询巡视器为决策支持系统提供了查询和资源管理。该工具可以接受流经您系统的所有查询,并对其进行分析、
优先排序和调度。一旦完成查询,用户也将接到通知。在大型环境(其中完成某些查询可能要花几个小时,或者不
同部门可能具有不同的系统优先级或用途)中,该功能极其有用。

通过将工作重定向到合适的数据库分区,查询巡视器还将执行负载均衡,以确保某个数据库分区的使用不会过于繁重
。该工具只能与 SMP 或 MMP 环境中 DB2 ESE 的多分区选项一起使用。

在经过最新修订以后,IBM 已经对 DB2 查询巡视器彻底进行了重新架构,从而将查询控制功能集成进了类似 DB2 控制
中心的 DB2 查询巡视器中心,并提供了一个易于使用的用户界面。查询巡视器是完全基于服务器的,不需要客户机软件。

#性能  监控命令
get monitor switches  返回会话监控开关的状态
update monitor switches using <monitor> <on|off> 为<monitor>设置会话监控开关的状态
reset monitor all 复位性能监控程序值
get snapshot for dbm
get snapshot for all on <dbname>
get snapshot for dynamic sql on <dbname>   返回动态SQL高速缓存的内容
runstats on table <tbschema>.<tbname> 收集<tbname>的统计信息
reorgchk on table all      确定是否需要重组  reorgchk on table <tbschema>.<tbname>
reorg table <tablename> 通过重组消除碎片
###DB2实用程序
    三种实用程序:EXPORT,IMPORT,LOAD
        这些实用程序支持的文件格式有:

非定界或定长 ASCII(ASC):顾名思义,这种文件类型包含定长 ASCII 数据,以便与列数据对齐。每个 ASC 文件都是一个
ASCII 字符流,这个字符流由根据行和列排序的数据值组成。数据流中的行由行定界符分隔,而通常将行定界符假定为换行符。
定界 ASCII(DEL):它是各种数据库管理器用于数据交换的最常用文件格式。这种格式包含 ASCII 数据,它使用特殊字符定
界符分隔列值。数据流中的行由换行符充当行定界符进行分隔。
PC 版集成交换格式(PC version of the Integrated Exchange Format,PC/IXF):它是数据库表的结构化描述。这种文件格式不仅
可以用于导入数据,还可以用于创建目标数据库中尚不存在的表。
工作表格式(Worksheet Format,WSF):以这种格式存储的数据可以在工作表中显示。这种格式只能用于导出和导入。
游标:游标是用查询声明的。它只能用作装入操作的输入。

#EXPORT 实用程序使用 SQL SELECT 语句将数据从数据库表抽取到某个文件中。对于导出的数据而言,其文件格式可以是 DEL、IXF 或 WSF。建议您在
导出中包含 MESSAGES 子句,以便在导出期间捕获错误、警告和信息性消息。
EXPORT TO myfile.del OF DEL
    MESSAGES msg.out
        SELECT staff.name, staff.dept, org.location
        FROM org,staff
                WHERE org.deptnumb = staff.dept;

   在前一页上的示例中,数据被抽取到一个 DEL 格式的文件中。缺省情况下,列值由逗号(,)分隔,而字符串由双引号(")括起来。如果要抽取
的数据已经包含逗号和双引号,那该怎么办呢?如果是这样的话,导入或装入实用程序不可能确定:哪些符号是实际的数据,哪些是定界符。要定
制 EXPORT 的运作方式,可以使用 MODIFIED BY 子句并指定想用文件类型修饰符修改什么。EXPORT 命令的格式如下:


EXPORT TO file_name OF file_type
    MODIFIED BY file_type_modifiers
    MESSAGES message_file
    select_statement
chardelx
指定 x 为新的单字符串定界符。缺省值是双引号(")。
coldelx
指定 x 为新的单字符列定界符。缺省值是逗号(,)。
codepage=x
指定 x 这个 ASCII 字符串为输出数据的新代码页。在导出操作期间,将字符数据从应用程序代码页转换成这一代码页。
timestampformat="x"
x 是源表中时间戳记的格式。
考虑下面这个示例:


EXPORT TO myfile.del OF DEL
  MODIFIED BY chardel! coldel@ codepage=1208 timestampformat="yyyy.mm.dd hh:mm tt"
  MESSAGES msg.out
  SELECT * FROM schedule


面的命令以 DEL 格式从 SCHEDULE 表导出数据,其间发生了下列行为:

字符串由感叹号(!)括起来
列由 @ 号定界
字符串被转换成代码页 1208
SCHEDULE 表中用户定义的时间戳记具有 yyyy.mm.dd hh:mm tt 这种格式

  #导出大对象
  #可以在控制中心导出表,并进行调度。
  #IMPORT实用程序
   IMPORT FROM file_name OF file_type
    MESSAGES message_file
    [ INSERT | INSERT_UPDATE | REPLACE | REPLACE_CREATE | CREATE ]
    INTO target_table_name


INSERT 选项将导入的数据插入表中。目标表必须已经存在。
INSERT_UPDATE 向表中插入数据,或者用匹配的主键更新表中现有的行。目标表必须存在,且定义了主键。
REPLACE 选项删除现有的全部数据,然后将导入的数据插入现有的目标表中。
有了 REPLACE_CREATE 选项,如果目标表存在,那么实用程序删除现有的数据,然后插入新数据,就好像指定了 REPLACE 选项一样。如果没有定义目标表,那么在导入数据之前将先创建该表及其相关索引。正如您可以想到的那样,输入文件必须是 PC/IXF 格式的,因为这种格式含有导出表的结构化描述。如果目标表是由外键引用的父表,就不能使用 REPLACE_CREATE。
CREATE 选项创建目标表及其索引,然后将数据导入到新表中。它唯一支持的文件格式是 PC/IXF。您也可以指定表空间的名称,新表将创建于其中。
示例:


IMPORT FROM emp.ixf OF IXF
COMMITCOUNT 500
    MESSAGES msg.out
    CREATE INTO employee IN datatbsp INDEX IN indtbsp
       
        如果上面的命令因为某些原因而执行失败,那么您可以使用消息文件确定被成功导入并提交的最后一行。然后,您可以使用
RESTARTCOUNT 选项重新启动导入。在下面的命令中,实用程序将跳过前面的 30000 条记录才开始 IMPORT 操作。


IMPORT FROM myfile.ixf OF IXF
   COMMITCOUNT 500 RESTARTCOUNT 30000
   MESSAGES msg.out
   INSERT INTO newtable

       compound=x
使用非原子的复合 SQL 来插入数据。每次会尝试 x 条语句。
indexschema=schema
在创建索引期间对索引使用指定的模式。
striptblanks
在向变长字段装入数据时,截断任何尾部空格。
lobsinfile
指出要导入 LOB 数据。实用程序将检查 LOBS FROM 子句,以获取输入 LOB 文件的路径。
这里有一个实际使用这些文件类型修饰符的示例:


IMPORT FOR inputfile.asc OF ASC
    LOBS FROM /u/db2load/lob1, /u/db2load/lob2
   MODIFIED BY compount=5 lobinsfile
    INSERT INTO newtable
使用控制中心进行import。

  ##LOAD实用程序概述
        LOAD 实用程序是另一种用数据来填充表的方法。经过格式化的页被直接
写入数据库。这种机制允许进行比 IMPORT 实用程序更有效的数据移动。
不过,LOAD 实用程序不执行某些操作,如引用或表约束检查以及触发器调用。

  LOAD FROM input_source OF input_type
    MESSAGES message_file
    [ INSERT | REPLACE | TERMINATE | RESTART ]
    INTO target_tablename


#example,execute at partition en

date
db2 connect to sccrm user db2inst1 using db2inst1
db2 "LOAD FROM /backup1114/dw_call_cdr_20031002.txt OF DEL modified by coldel; fastparse anyorder replace into dw_call_cdr_20030801"
date

db2 "LOAD FROM /db2home/db2inst1/data/dw_newbusi_smscdr_20031026.txt OF DEL modified by coldel; terminate into dw_newbusi_smscdr_20031026_1"

LOAD 的源输入的格式可以是 DEL、ASC、PC/IXF 或 CURSOR。游标是从 SELECT
语句返回的结果集。使用 CURSOR 作为装入输入的示例显示如下:


DECLARE mycursor CURSOR FOR SELECT col1, col2, col3 FROM tab1;
LOAD FROM mycursor OF CURSOR INSERT INTO newtab;


装入目标必须存在,该实用程序才能启动。这个目标可以是表、类型表或表别名。不支持向系统表或临时表进行装入。

请使用 MESSAGES 选项来捕获装入期间的任何错误、警告和信息性消息。

LOAD 可以以四种不同方式执行:

INSERT 方式将输入数据添加到表中,不更改现有表数据。
REPLACE 方式从表中删除全部现有数据,然后用输入数据填充该表。
TERMINATE 方式终止装入操作,然后回滚到装入操作的起始点。一个例外是:如果指定了 REPLACE 方式,那么表将会被截断。
RESTART 方式用于重新启动以前中断的装入。它将自动从上一个一致性点继续操作。要使用该方式,请指定与前面的 LOAD 命令中相同的选项,
但却使用 RESTART 方式。它允许该实用程序找到在装入处理期间生成的所有必需临时文件。因此
,除非能够确信不需要从装入生成的临时文件,否则就不要以手工方式除去任何这类文件,这一点十分重要。
一旦装入不出任何错误地完成,临时文件就会被自动除去。缺省情况下,临时文件是在当前工作目录中创建的。
可以使用 TEMPFILES PATH 选项指定存储临时文件的目录。
   #装入过程的四个阶段
       完整的装入过程分为四个不同阶段。

装入阶段:
将数据装入表中。
收集索引键和表统计信息。
记录一致性点。
将无效数据放入转储文件,并在消息文件中记录消息。当数据行与表的定义不一致时,这些数据行就被认为是无效数据,
并会被拒绝(不装入表中)。请使用 dumpfile 修饰符来指定文件的名称和位置,以记录任何被拒绝的行。
构建阶段:
根据装入阶段所收集的键创建索引。
删除阶段:
删除导致违反键唯一性的那些行,并将这些行放入异常表中。除了如上所述有些数据只是不满足目标表的定义之外,还有
一些数据已经通过了装入阶段,但却违反了表中定义的唯一性约束。注:这里只将违反键唯一性的行作为坏数据;目前不检查其它约束。
由于这类数据已经装入了表中,因此 LOAD 实用程序将在此阶段删除违规行。异常表可以用来存储被删除的行,使您可以决定在装入操
作完成之后如何处理它们。如果没有指定异常表,那么就删除违规行,而不做任何跟踪,下面对异常表进行了更详细的讨论。
在消息文件中记录消息。
索引复制阶段:
如果 ALLOW READ ACCESS 是用 USE TABLESPACE 选项指定的,那么就会将索引数据从系统临时表空间复制到
索引应该驻留的表空间。
异常表是一个用户定义的表,它必须与要装入的目标表具有相同的列定义。如果至少有一列没有出现在异常表中,那么就
会废弃违规行。只可以向表末尾添加两个额外的列:记录行插入时间的时间戳记列,以及存储(认为行所包含的是坏数据的)
理由(或消息)的 CLOB 列。



LOAD FROM emp.ixf OF IXF
    MODIFIED BY DUMPFILE=c:\emp.dmp
  MESSAGES msg.out
    TEMPFILES PATH d:\tmp
    INSERT INTO employee
    FOR EXCEPTION empexp

在上图中,(1)显示了输入源文件的内容。
(2)中显示的目标表 EMPLOYEE 是用以下列定义创建的:
第一列必须具有唯一性。
最后一列是不能为 NULL 的数字列。
(3)中显示的异常表 EMPEXP 是用与 EMPLOYEE 相同的那些列以及时间戳记和消息列创建的。
在装入阶段,输入文件的所有数据都被装入了 EMPLOYEE — 但用粉红色标记的两行除外,
因为它们不满足 NOT NULL 和 NUMERIC 列定义。由于指定了 DUMPFILE 修饰符,因此这两行被记录在文件 C:\emp.dmp 中。

在删除阶段,用黄色标记的两行被从 EMPLOYEE 中删除了,并且被插入异常表 EMPEXP 中。这是由于违反了 EMPLOYEE 表中第一
列的唯一性而引起的。

在装入结束时,您应该检查消息文件、转储文件和异常表,然后决定如何处理被拒绝的行。
如果装入成功完成,那么就会除去在 D:\tmp 中生成的临时文件。

  #装入选项
      ROWCOUNT n:允许用户指定只装入输入文件中的前 n 条记录。
SAVECOUNT n:每装入 n 条记录之后就建立一致性点。同时会生成消息,并会将其记录在消息文件中,以指出在保存点成功地装入了多少输入行。这一点在输入文件类型为 CURSOR 时是无法做到的。
WARNINGCOUNT n:在发出 n 次警告后停止装入。
INDEXING MODE [ REBUILD | INCREMENTAL | AUTOSELECT | DEFERRED ]:在构建阶段,构建索引。这个选项指定 LOAD实用程序是重新构建索引还是增量式地扩展索引。支持四种不同方式:
REBUILD 方式强制重新构建所有索引。
INCREMENTAL 方式只用新数据扩展索引。
AUTOSELECT 方式允许实用程序在 REBUILD 和 INCREMENTAL 之间进行选择。
DEFERRED 方式意味着在装入期间不创建索引。所涉及的索引都用需要的刷新进行标记。这些索引将在重新启动数据库或第一次访问这类索引时重新构建。
STATISTICS [ YES | NO ]:在执行完装入以后,以前的目标表统计信息极有可能不再有效,因为目标表中已加入了更多的数据。您可以通过指定 STATISTICS YES 来选择收集这些统计信息。
  #文件类型修饰符。文件类型修饰符是用 MODIFIED BY 子句指定的。下面是少数几个您可能会觉得有用的修饰符:

fastparse:减少了对装入数据的语法检查以增强性能。
identityignore、identitymissing 和 identityoverride:分别用来忽略、指出丢失或覆盖标识列数据。
indexfreespace n、pagefreespace n 和 totalfreespace n:在索引和数据页中保留指定量的空闲页。
norowwarnings:禁止行警告。
lobsinfile:指出将装入 LOB 文件;并检查 LOBS FROM 选项以获取 LOB 路径。
 
  ##装入期间的表访问
    在装入表期间,LOAD 实用程序会用互斥锁将它锁定。在装入完成以前,不允许任何其它访问。这是 ALLOW NO ACCESS 选项的缺省行为。在进行这种装入期间,表处于 LOAD IN PROGRESS 状态。有一个方便好用的命令可以检查装入操作的状态,还返回表状态:


LOAD QUERY TABLE table_name


您可能猜到了这一点,即有一个选项允许进行表访问。ALLOW READ ACCESS 选项导致表在共享方式下被锁定。阅读器可以访问表
中已经存在的数据,却不能访问新的数据。正在装入的数据要等到装入完成后才可获得。此选项将装入表同时置于 LOAD IN PROGRESS
状态和 READ ACCESS ONLY 状态。
正如在前一页中所提到的那样,在构建阶段可以重新构建全部索引,也可以用新数据扩展索引。对于 ALLOW READ ACCESS 选项,
如果重新构建全部索引,那么会为该索引创建一个镜像副本。当 LOAD 实用程序到达索引复制阶段时(请参阅装入过程的四个阶段)
,目标表被置为脱机,然后将新索引复制到目标表空间。
无论指定哪个表访问选项,装入都需要各种锁来进行处理。如果某一应用程序已经锁定了目标表,那么 LOAD 实用程序就必须等到
锁被释放。不想等待锁的话,您可以在 LOAD 命令中使用 LOCK WITH FORCE 选项,以强制关闭其它持有冲突锁的应用程序。

  ##检查暂挂表状态
     至此,我们知道:不会将与目标表定义不一致的输入数据装入表中。在装入阶段,这样的数据会遭到拒绝,并被记录在消息文件中。
在删除阶段,LOAD 实用程序会删除那些违反任何唯一性约束的行。如果指定了异常表,违规的行将插入该表。对于表可能定义的
其它约束(如引用完整性和检查约束),怎么办呢?LOAD
实用程序不检查这些约束。表会被置于 CHECK PENDING 状态,这种状态迫使您先手工检查数据完整性,然后才能访问表。如前一页
中所讨论的那样,可以使用 LOAD QUERY 命令查询表状态。系统目录表 SYSCAT.TABLES 中的列 CONST_CHECKED 也指出表中所定义的
每个约束的状态。

       状态类型:Y,N,U,W,F
     要手工为一个或多个表关闭完整性检查,请使用 SET INTEGRITY 命令。下面给出了一些示例,以演示该命令的部分选项。要立即检查表
EMPLOYEE 和 STAFF 追加的选项的完整性,请使用以下命令:
SET INTEGRITY FOR employee, staff IMMEDIATE CHECKED INCREMENTAL
要用 IMMEDIATE UNCHECKED 选项忽略对表 EMPLOYEE 的外键检查:
SET INTEGRITY FOR employee FOREIGN KEY IMMEDIATE UNCHECKED
在装入完成以后,有时您可能想将目标表及其具有外键关系的派生表置于 CHECK PENDING 状态。这样做确保了在对完整性进行手工
检查之前,所有这些表的可访问性都得到了控制。装入选项是 CHECK PENDING CASCADE IMMEDIATE,它指出:立即将外键约束的检查
暂挂状态扩展到所有派生外键表。缺省情况下,只会将装入的表置于检查暂挂状态。这正是装入选项
CHECK PENDING CASCADE DEFERRED 的行为。

## IMPORT VS LOAD
   IMPORT LOAD
   SLOWER ON LARGE AMOUNTS OF DATA FASTER ON LARGE LOADS-WRITES FORMATTED PAGES
   CREATION OF TABLES & INDEXES WITH IXF   TABLES AND INDEXES MUST EXIST
   WSF SUPPORTED WSF NOT SUPPORTED
   IMPORT INTO TABLES AND VIEWS LOAD TABLES ONLY
   NO SUPPORT FOR IMPORTING INTO SUPPORTED
      MATERIALIZED QUERY TABLES
   ALL ROWS LOGGED MINIMAL LOGGING SUPPORTED
   TRIGGERS WILL BE FIRED TRIGGERS NOT SUPPORTED
   TEMPORARY SPACE USED WITHIN THE DATABASE  USED OUTSIDE THE DATABASE
   CONSTRAINTS VALIDATED DURING IMPORT   ALL UNIQUE KEY IS VERIFIED DURING LOAD
   OTHER CONSTRAINTS ARE VALIDATED WITH THE
   SET INTEGRITY COMMAND
   IF INTERRUPTED,TABLE IS USABLE WITH IF INTERRUPTED,THE TABLE IS HELD IN LOAD PENDING
   DATA UP TO THE LAST COMMIT POINT STATE,EITHER RESTART OR RESTORE TABLES EFFECTED
  
   RUN RUNSTATS AFTER IMPORT FOR STATISICS  STATISTICS CAN BE GATHERED DURING LOAD
   IMPORT INTO MAINFRAM DATABASE VIA CANNOT LOAD INTO MAINFRAME DATABASE
      DB2 CONNECT
   NO BACK-UP IMAGE REQUIRED BACKUP CAN BE CREATED DURING LOAD
posted @ 2005-06-08 19:07 小马歌 阅读(2938) | 评论 (0)编辑 收藏
 
六,创建数据库
创建数据库时,完成如下任务:
* 设置数据库所需的所有系统目录表
* 分配数据库恢复日志
* 创建数据库配置文件,设置缺省值
* 将数据库实用程序与数据库绑定

初始数据库分区组的定义
当最初创建数据库时,会为所有在db2nodes.cfg文件中指定的分区创建数据库分区.可以用
add dbpartitionnum 和 drop dbpartitionnum verify 命令来添加或除去其他分区.
定义了三个数据库分区组:
         * 用于容纳syscatspace表空间的ibmcatgroup, 保存系统目录表
         * 用于容纳tempspaces1表空间的ibmtempgroup,保存系统临时表
* 用于容纳userspace1表空间的ibmdefaultgroup,缺省保存用户表和索引

(创建新的数据库后最好重新启动db2clp)

EXAMPLE:
CREATE DATABASE PERSONL
   CATALOG TABLESPACE
     MANAGED BY SYSTEM USING (path 'D:\PCATALOG','E:\PCATALOG')
     EXTENTSIZE 16 PREFETCHSIZE 32
   USER TABLESPACE
     MANAGED BY DATABASE USING (FILE 'D:\DB2DATA\PERSION1' 5000,
                                FILE 'D:\DB2DATA\PERSION2' 5000)
     EXTENSIZE 32 PREFETCHSIZE 64
   TEMPORARY TABLESPACE
     MANAGED BY SYSTEM USING (path 'F:\DB2TEMP\PERSONL')
   WITH "PERSONNEL DB FOR DSCHIEFER CO"

create database sccrm using codeset GBK territory CN

#删除数据库
   DROP DATABASE <DB-NAME>
  

# 数据库目录的定义
  *本地数据库目录(节点的目录中的文件SQLDBDIR)
     本地数据库目录文件存在于定义了数据库的每条路径(或WIN中的"驱动器")
     对于可以从该位置存取得每个数据库此目录都包含一个条目.包含信息:
      数据库名称,数据库别名,数据库注释,数据库的根目录的名称,其他系统信息.
  *系统数据库目录(实例中的目录中的文件SQLDBDIR)
     对于数据库管理器的每个实例,都存在一个系统数据库目录文件,该文件对于针对
     此实例编目的每个数据库都包含一个条目.使用CREATE DATABASE时隐式的编目数据库
     每个数据库包含一条信息: 数据库名,数据库别名,数据库注释,本地数据库目录的位置,
      指示该数据库是间接的指示符,表示它与系统数据库目录文件驻留在相同的机器上.
查看本地或系统数据库目录文件
   LIST DATABASE DIRECTORY ON <location>
   LIST DATABASE DIRECTORY
  
  *节点目录
     数据库管理器在编目第一个数据库分区时会创建节点目录.要编目数据库分区,
     使用CATALOG NODE命令.要显示本地节点目录的内容,使用LIST NODE DIRECTORY
     .在每个数据库客户机上都创建并维护节点目录.对于具有客户机可以存取得一个
     或多个数据库的每个远程工作站,该目录都包含一个条目.db2客户机使用该节点目录中
     的通信端点信息.
     catalog tcpip node my_node_name remote 10.10.10.10 server 54321
uncatalog node my_node_name
     catalog database DB as my_data_alias at node my_node_name
# "轻量级目录访问协议" (LDAP)目录服务
    目录服务是一个关于分布式环境中的多个系统和服务的资源信息的资源库;它
    提供对这些资源的客户机和服务器存取.客户机和服务器将使用目录服务来找出
    如何存取其他资源.
    LDAP是业界标准的存取目录服务的方法.每个数据库服务器实例都会将它的存在情况发布给LDAP,
    并在创建数据库时向LDAP目录提供数据库信息.当客户机与数据库连接后,可从LDAP目录检索
    服务器的目录信息.不再要求每个客户机将目录信息以本地方式存储在每台机器上.

# 创建数据库分区组
    可以使用CREATE DATABASE PARTITION GROUP语句创建数据库分区组.此语句指定表空间
    容器和表数据将驻留其上的一组数据库分区.
      *为数据库分区组创建分区映象.
      *生成分区映象标识
      *将记录插入下列目录表:
       SYSCAT.DBPARTITONGROUPS,SYSCAT.PARTITIONMAPS,SYSCAT.DBPARTITIONGROUPDEF

   CREATE DATABASE PARTITION GROUP <name> ON DBPARTITIONNUMS (<value>,<value>)
 
#创建表空间
表空间建立数据库系统使用的物理存储设备与用来存储数据的逻辑容器或表的关系

CREATE TABLESPACE <name>
    MANAGED BY SYSTEM
    USING ('<path>')
   
CREATE TABLESPACE <name>
    MANAGED BY DATABASE
    USING (FILE'<path>' <size>)
           DEVICE
*指定分区组
CREATE TABLESPACE PLANS IN ODDNODEGROUP
    MANAGED BY DATABASE
    USING (DEVICE '/dev/HDISK0' 10000,DEVICE '/dev/n1hd01' 40000) on node 1
        (DEVICE '/dev/HDISK0' 10000,DEVICE '/dev/n1hd03' 40000) on node 3
        (DEVICE '/dev/HDISK0' 10000,DEVICE '/dev/n1hd05' 40000) on node 5 

CREATE  REGULAR  TABLESPACE CUSTTBS IN DATABASE PARTITION GROUP CUSTOMER
PAGESIZE 4 K  MANAGED BY DATABASE  USING
( FILE 'D:\testdbtbs\custtbs0_1' 5120 ) ON DBPARTITIONNUM (0)
USING
( FILE 'D:\testdbtbs\custtbs1_1' 5120 ) ON DBPARTITIONNUM (1)
EXTENTSIZE 16 OVERHEAD 10.5 PREFETCHSIZE 16
 
   在多分区数据库中创建单分区组.
   CREATE DATABASE PARTITION GROUP single_tbs_grp ON DBPARTITIONNUM(0)
   在单分区组中创建单分区表空间.
   CREATE TABLESPACE single_part_tbs IN DATABASE PARTITION GROUP single_tbs_grp
   MANAGED BY DATABASE USING (FILE 'd:\testdbtbs\single_part_tbs_1' 5120)
  
  在UNIX中使用字符设备.
 
* 创建特定类型的表空间
  创建系统临时表空间
  CREATE SYSTEM TEMPORARY TABLESPACE tmp_tbsp
   MANAGED BY SYSTEM
   USING ('d:\tmp_tbsp','e:\tmp_tbsp')
  
   在分区数据库中创建系统临时表空间 只能在IBMTEMPGROUP中产生
   CREATE  SYSTEM TEMPORARY  TABLESPACE TEMPSYS_TBSP1
    IN DATABASE PARTITION GROUP IBMTEMPGROUP
    PAGESIZE 4 K  MANAGED BY SYSTEM 
    USING ('D:\testdbtbs\sys_temp_0' ) ON DBPARTITIONNUM (0)
    USING ('d:\testdbtbs\sys_temp_1' ) ON DBPARTITIONNUM (1)
    EXTENTSIZE 16 OVERHEAD 10.5 PREFETCHSIZE 16
  创建用户临时表空间
   CREATE USER TEMPORARY TABLESPACE usr_tbsp
    MANAGED BY DATABASE
    USING (FILE 'd:\db2data\user_tZbsp' 5000,
           FILE 'e:\db2data\user_tbsp' 5000)
   
    在分区数据库中创建用户临时表空间 可在除IBMTEMPGROUP中的其他分区组中产生.
   CREATE  USER TEMPORARY  TABLESPACE USER_TEMP_TBSP
    IN DATABASE PARTITION GROUP USER_TEMP_TBSGRP
    PAGESIZE 4 K  MANAGED BY SYSTEM 
    USING ('D:\testdbtbs\user_temp_0' ) ON DBPARTITIONNUM (0)
    USING ('d:\testdbtbs\user_temp_1' ) ON DBPARTITIONNUM (1)       
  
  *指定物理设备
  在WINDOWS上,指定物理硬盘驱动器,使用\\.\PhysicalDriveN (N-0,1,2..)
              指定逻辑驱动器使用\\.\N: (N是系统中的逻辑盘符)
  在UNIX中指定字符设备.
 
   #SMS  当对象增大时,文件每次扩展一页。若需要提高插入性能,可以考虑启用多页分配,如MDC表。
运行db2empfa. 对于多分区数据库必须对每个分区运行此使用程序,一旦启用就不能禁止。
   #DMS 
单分区表空间大小,4kb - 64gb;8kb-128gb;16kb-256gb;32kb-512gb
            在缺省情况下,每个容器都保留一个数据块作为开销,表空间的最小大小是5个数据块。
三个保留给开销使用。两个用于用户表数据。

  #在多个节点上产生表空间
CREATE TABLESPACE TS1 MANAGED BY DATABASE USING
(device '/dev/rcont $N' 20000)

CREATE TABLESPACE TS2 MANAGED BY DATABASE USING
(file '/DB2/containers/TS2/container $N+100' 10000)

CREATE TABLESPACE TS3 MANAGED BY SYSTEM USING
('/TS3/cont $N%2', '/TS3/cont $N%2+2')

  #增加表空间的空间
    ALTER TABLESPACE RESOURCE
       ADD (DEVICE '/dev/rhd9' 10000,
            DEVICE '/dev/rhd10' 10000)
   #改变表空间状态
    DB2 ALTER TABLESPACE <name> SWITCH ONLINE
   #删除表空间
    DROP TABLESPACE <name>
    可以先增加一个系统临时表空间,然后删除老的.
   #获取表空间使用信息
    get snapshot for tablespaces on sample
   #获取表空间的CONTAINER
    LIST TABLESPACE CONTAINERS FOR 0(TABLESPACE_ID) SHOW DETAIL
  
# 创建和填充表

  列出表:
  list tables - 列出当前用户的表
  list tables for all - 列出数据库中所定义的所有表
  list tables for schema schemaname - 列出具有指定模式的表
  describe table tablename - 显示指定表的结构

  产生表和主键
  CREATE TABLE DEPARTMENT
(DEPTNO CHAR(3) NOT NULL,
DEPTNAME VARCHAR(29) NOT NULL,
MGRNO CHAR(6),
ADMRDEPT CHAR(3) NOT NULL,
LOCATION CHAR(16),
PRIMARY KEY (DEPTNO))
  IN RESOURCE
  产生外键
  CREATE TABLE EMPLOYEE
(EMPNO CHAR(3) NOT NULL PRIMARY KEY,
FIRSTNME VARCHAR(12) NOT NULL,
LASTNAME VARCHAR(15) NOT NULL,
WORKDEPT CHAR(3),
PHONENO CHAR(4),
PHOTO BLOB(10m) NOT NULL,
FOREIGN KEY DEPT (WORKDEPT)
REFERENCES DEPARTMENT ON DELETE NO ACTION)
  IN RESOURCE
        ON DELETE NO ACTION 表示如果该部门有任何雇员则该部门不能被删除.
  定义表检查约束
      在创建或改变表时,通过将检查约束定义与表关联来对该表创建表检查约束.
      当INSERT或UPDATE语句修改该表中的数据时,就自动激活此约束.表检查约束对
      DELETE或SELECT没有影响.检查约束不能与类型表相关.
       约束名不能与在同一个CREATE TABLE语句内指定的任何其他约束相同.若不
       指定约束名,系统会自动生成18个字符的唯一标识符.
      表检查约束用于实现键唯一性或引用完整性约束所未涵盖的数据完整性规则.
      如:
CREATE TABLE EMP_ACT
(EMPNO CHAR(6) NOT NULL,
PROJNO CHAR(6) NOT NULL,
ACTNO SMALLINT NOT NULL,
EMPTIME DECIMAL(5,2),
EMSTDATE DATE,
EMENDATE DATE,
CONSTRAINT ACTDATES CHECK(EMSTDATE <= EMENDATE) )
IN RESOURCE
     约束EMSTDATE必须小于EMENDATE

   定义信息性约束
       信息性约束是一个规则,可由SQL编译器使用,但数据库管理器不会强制使用它.
       SQL编译器包括一个重写查询阶段,它将SQL语句变换为可能是优化的格式并改进
       所需数据的存取路径.目的是改进查询性能.
   对新表定义生成列
       生成列在基本表中定义,在这些列中,存储的值是使用表达式计算得出的,而不是
通过插入或更新操作指定.可以改善查询性能,特别是计算很复杂或在查询时要进行
多次表达式求值.
CREATE TABLE t1 (c1 INT,
c2 DOUBLE,
c3 DOUBLE GENERATED ALWAYS AS (c1 + c2)
c4 GENERATED ALWAYS AS
(CASE WHEN c1 > c2 THEN 1 ELSE NULL END))
    创建用户定义临时表
临时表不出现在系统目录中,不能共享此表
DECLARE GLOBAL TEMPORARY TABLE gb1_temp
  LIKE tmpltab1
  ON COMMIT DELETE ROES
  NOT LOGGED
  IN usr_tbsp
 
定义此用户临时表所使用的列的名称和描述与empltabl的列的名称和描述完全相同.
隐式定义只包括列名,数据类型,可空性特征和列缺省值属性.未定义其他列属性,包括
唯一约束,外键约束,触发器和索引.
    对新表定义身份列
        为插入表的每一行自动生成保证唯一数字值的方法.
        只在单分区数据库中支持.
CREATE TABLE test_table ( col1 int,
  col2 double,
  col3 int not null generated always as identity
       (start with 100,increment by 5))

    创建序列
        序列是一个数据库对象,它允许自动生成值.序列特别适合于生成唯一键值.
        与身份列属性不同,未使序列与特定表列相关,也未将它绑定至唯一列,只是仅可通过该表
        列存取.只在单分区数据库中才受支持.
        在多分区环境中的单分区数据库也不行.
        CREATE SEQUENCE order_seq
               START WITH 1
               INCREMENT BY 1
               NOMAXVALUE
               NOCYCLE
               CACHE 24
       使用序列
         insert into order (orderno,custno)
             values (nextval for order_seq,123456);
         insert into line_item (orderno,partno,quantity)
             values (prevval for order_seq,987654,1)
         使用NEXTVAL,PREVVAL可以在两个不同的表中使用相同的序列号.
   对表定义维
  
引用完整性约束 第 13 页(共17 页)




引用完整性约束是在创建表时定义的,或者是在之后使用 alter table 语句定义的。

建立引用完整性的子句有:

primary key 子句
unique constraint 子句
foreign key 子句
references 子句
例如:


create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept)
          references department on delete no action)


让我们了解一下各种引用完整性规则:

插入规则:

有一个隐式规则,在没有找到父项时取消插入。
删除规则:

Restrict:如果有从属行就不能删除父行。
Cascade:删除父表中的行会自动删除其从属表中的任何相关行。
No Action(缺省值):在应用了所有其它引用约束之后强制每个子行的父行都存在。
Set Null:外键字段设置成 null;其它列保持不变。
更新规则:

Restrict:如果从属表中的行与键的初始值相匹配,则不更新父键。
No Action(缺省值):如果从属表中没有任何行与父键相匹配,则不更新父键。

   增加表中的列
   ALTER TABLE EMPLOYEE
     ADD <COLUMN_NAME> <DATA_TYPE> <NULL_ATTRIBUTE>
    
   增加唯一性约束
   ALTER TABLE EMPLOYEE
        ADD CONSTRAINT NEWID UNIQUE(EMPNO,HIREDATE)
   删除唯一性约束
   ALTER TABLE EMPLOYEE
     DROP UNIQUE NEWID
   删除主键
   ALTER TABLE <NAME>
     DROP PRIMARY KEY
   增加主键
  ALTER TABLE <NAME> ADD PRIMARY KEY (COL1,COL2,..)
   删除外键
   ALTER TABLE <name>
DROP FOREIGN KEY <foreign_key_name>
   删除表检查约束
   ALTER TABLE <table_name>
DROP CHECK <check_constraint_name>   
   添加表的外键
     ALTER TABLE <NAME>
        ADD CONSTRAINT <constraint_NAME>
        FOREIGN KEY <COLUMN_NAME>
        references table_name <col_name>
        ON DELETE <ACTION_TYPE>
        ON UPDATE <ACTION_TYPE>
 
   在多个表空间中创建表
       表数据,表索引及与表相关联的任何长型列数据可以存储在同一表空间中,也可以
       放在不同的表空间中.只能使用DMS.
       CREATE TABLE <name>
        (<column_name> <data_type> <null_attribute>)
         IN <table_space_name>
         INDEX IN <index_space_name>
         LONG IN <long_space_name>
        
    在分区数据库中创建表
        必须小心的选择适当的分区建,以后不能跟改.再者,必须将任何唯一索引定义为分区键的一个超集.
        表的大小是(分区数*分区大小(4K是64GB).
        CREATE TABLE MIXREC (MIX_CNTL INTEGER NOT NULL,
             MIX_DESC CHAR(20) NOT NULL,
             MIX_INT INTEGER NOT NULL)
             IN MIXTS12
             PARTITIONING KEY (MIX_INT) USING HASHING
    产生触发器
      用途:
      验证输入的数据
      为新插入的行生成值
      为交叉引用而从其他表中进行读取
      为审计跟踪而向其他表写入
     
      CREATE TRIGGER <name>
        <action> ON <table_name>
        <operation>
        <triggered_action>
       
    创建用户定义函数(UDF)或方法
        UDF扩展并添加了SQL的内置函数提供的支持,且可在可使用内置函数的任何
        地方使用.可使用两种方式创建UDF:
           外部函数,用一种编程语言编写
           有源函数,从另一个现有函数继承产生.
          
          
           三种UDF:标量,返回一个单值答案.
                   列,从一组相似(一列)的值中返回单值答案,如AVG()只能定义有源函数.
                   表,将一个表返回至引用它的SQL,只能在select语句的from子句中引用表函数.
         UDF 记录在SYSCAT.FUNCTIONS AND SYSCAT.FUNCPARMS目录视图中.
    用户定义类UDT
        UDT是由用户在数据库中创建的命名的数据类型.UDT可以是单值类型,它与内部数据类型或
        结构化类型共享一个公共的表示法,结构化类型具有一个命名属性序列,其中每个属性都有一个类型.
        结构化类型可以是另一个定义类型层次结构的结构化类型的子类型.
   
    创建视图
        CREATE VIEW <name> (<column>,<column>,<column>)
           SELECT <column_names> FROM <table_name>
           WITH CHECK OPTION
       WITH CHECK OPTION 子句指示必须根据该视图定义检查该视图的任何更新的行或插入的行,
       如它不符合,则拒绝它,增加了数据完整性.
       CREATE VIEW EMP_VIEW
         SELECT LASTNAME AS DA00NAME,
                EMPNO AS DA00NUM,
                PHONENO
         FROM EMPLOYEE
       WHERE WORKDEPT = 'A00'
       WITH CHECK OPTION
      
    创建具体查询表
        具体查询表是以查询结果为基础所定义的一种表.因此,具体查询表通常包含预先计算的结果,
        这些结果是根据表定义中引用的一个或多个表中的现有数据计算而得.若SQL编译器确定查询
        在针对具体查询表运行时比对一个或多个基本表运行时效率更高,将对具体查询表执行该查询.
       
   创建别名
       别名是引用表,别名或视图的间接方法,这样SQL语句可与该表或视图的限定名无关.
      
       CREATE ALIAS WORKERS FOR EMPLOYEE
      
   索引,索引扩展或索引规范
       索引是行位置的列表,按一个或多个指定列的内容来排序.
       索引扩展是一个索引对象,它配合带有结构化类型或单值类型列的索引使用.
       索引规范是一个元数据结构.它告诉优化器别名所引用的数据源对象(表或视图)
       是否存在索引.只是索引的描述.
         索引顾问,,db2advis
       索引得最大列数是16,最大长度是1024字节.
       CREATE INDEX <name> ON <talbe_name> (<column_name>)
   重命名表或索引
       要重命名的表或索引不能是目录表或索引,总结表或索引,类型表,已声明
       全局临时表以及昵称的名称.
        并且不能在下列任何一个对象中引用现有表或索引:
        视图,触发器,引用约束,总结表,现有引用列的作用域
        表中不能有检查约束,不能有除身份列以外的其他生成列.
       
        RENAME TABLE <SCHEMA_NAME>.<TABLE_NAME> TO <NEW_NAME>
        RENAME INDEX <schema_name>.<index_name> TO <new_name>
       

索引可以:

是升序或是降序(如果没有指定,缺省值是升序)
是唯一的,也可以是不唯一的(如果没有指定,缺省值是不唯一的)
是复合的
用来执行群集
是双向的(这由 allow 或 disallow reverse scans 控制的)
包括其它列(这只适用于唯一索引)。

   删除表
       DROP TABLE <TABLE_NAME>
   删除索引
       DROP INDEX <index_name>
    
   通过命令行处理器调用"性能配置向导"
       使用AUTOCONFIGURE 
      
终止所有应用程序与数据库的连接
db2 force applicaitons all

#给用户授权
GRANT privilege ON object-type object-name
  TO [{USER | GROUP | PUBLIC}] authorization-name
  [WITH GRANT OPTION]
 
  GRANT INSERT,DELETE ON TABLE staff TO USER rosita WITH GRANT OPTION
 
  #撤消用户权利
  REVOKE privilege ON object-type object-name
  FROM [{USER | GROUP | PUBLIC}] authorization-name

  REVOKE ALL PRIVILEGES ON TABLE staff FROM joanna
posted @ 2005-06-08 19:06 小马歌 阅读(1193) | 评论 (0)编辑 收藏
 
db2 -tvf my.sql

db2level 显示db2的版本号

显示SQL出错信息
db2 "? sql6031"

db2mtrk

管理DAS
产生:root运行-dascrt -u dasuser1
删除:root运行-dasdrop
启动:dasusr1运行-db2admin start
停止:dasusr1运行-db2admin stop

db2_kill
ipclean

db2start dbpartitionnum 9 restart

AIX启动控制中心:
db2cc

DB2用户管理:
  db2 use os to manage users.You can use following steps to add a db2 user:
  1,add a user on os.
  2,grant rights to user.
    GRANT  CREATETAB,CONNECT ON DATABASE  TO USER FUJIE;
    grant select, update, delete on table employee to user john with grant option

一,实例

产生
db2icrt -a AuthType(SERVER,CLIENT,SERVER_ENCRYPT) -p PORT_NAME
表空间PREFETCHSIZE的设置,EXTENTSIZE的关系,缓冲池的监控,页清除程序的多少。
   临时表空间页面大小与其他表空间页面大小的设置,临时表空间与缓冲池的设置。
example:db2icrt db2 -s ese -p d:\db2 -u Administrator

注意:在UNIX 上产生实例时需要产生一个和实例名称相同的用户名,和fencedid 用户。
  如:db2icrt -s ese -u db2fenc2 db2inst2 将在db2inst2用户中产生实例db2inst2.

缺省创建32位实例,创建64位实例:db2icrt -s ese -w 64 -u db2fenc2 db2inst2
  
删除
db2idrop instance-name
启动
db2start
停止
db2stop force
连接
db2 attach to testdb2
db2 detach
列出实例
db2ilist
设置当前实例
set db2instance=<instance-name>
得到当前实例
db2 get instance
设置实例自动重启动UNIX
db2iauto -on <instance-name>
db2iauto -off <instance-name>

获取实例的配置参数
db2 get dbm cfg
修改配置参数
例如:db2 update dbm cfg using authentication server_encrypt
     db2stop and db2start
    
二,声明注册表和环境变量
db2set   注意:设置完成后需要退出用户,再注册进入才能生效。
列出所有受支持的变量
db2set -lr
列出当前实例所有已定义的变量
db2set
要列出概要文件注册表中所有定义的注册表变量
db2set -all
列出单个变量
db2set registry_variable_name
更改变量
db2set registry_variable_name=new_value
变量复位为缺省值
db2set -r registry_variable_name

db2set DB2CODEPAGE=819

db2set DB2CODEPAGE=1386

db2 -tvf my_sql.sql

三,创建节点配置文件
db2nodes.cfg

UNIX 格式:dbpartitionnum(0-999) hostname [logical-port [netname]]
WIN  格式:nodenumber hostname computername logical_port netname

四,管理服务器
<配置助手,控制中心,开发中心> 通过DAS来进行工作
创建DAS
db2admin create (windows)
dascrt -u <DASUser>  需要root权限
启动和停止
db2admin start
db2admin stop
列出
db2admin
配置DAS
db2 get admin cfg
db2 update admin cfg using
db2 reset admin cfg
最好stop再start
五,配置多个逻辑节点
可以用两个方法来配置多个逻辑节点:
* 在db2nodes.cfg文件中配置逻辑节点(数据库分区).然后,可使用db2start启动所有逻辑和远程节点.
    对于windows nt,若系统中没有数据库,则必须使用db2ncrt来添加节点,否则,若一个或多个数据库,
    则应使用db2start addnode 命令.在nt 中,不能手工编辑db2nodes.cfg文件.
   db2ncrt /n:1 /u:administrator,yhnu0987 /m:fujie /p:1 /h:fujie
   db2start addnode nodenum 1 hostname guosd port 1 computer GUOSD user db2admin password db2admin

* 在另一个处理器上重新启动一个逻辑节点,其他逻辑数据库分区(节点)已在该处理器上运行.这允许覆盖
  在db2nodes.cfg中为逻辑数据库分区指定的主机名和端口号.
 

在WIN中添加逻辑节点
  db2ncrt /n:1 /u:Administrator,<pwd> /i:db2 /m:FUJIE /p:1
 
#删除逻辑节点
db2ndrop
有数据库的时候使用db2stop drop nodenum
#改变逻辑节点
db2nchg
posted @ 2005-06-08 19:04 小马歌 阅读(849) | 评论 (0)编辑 收藏
 
1.
当使用PreparedStatement\CallableStatement时,尽量使用它提供的setParams的方法。

下面是错误的方法:
CallableStatement cstmt = conn.prepareCall (
  "{call getCustName (12345)}");
ResultSet rs = cstmt.executeQuery ();

下面是正确的方法:
CallableStatement cstmt - conn.prepareCall (
  "{call getCustName (?)}");
cstmt.setLong (1,12345);
ResultSet rs = cstmt.executeQuery();

2.使用批量更新的方法

一般都是使用这样的方法更新:
PreparedStatement ps = conn.prepareStatement(
  "INSERT into employees values (?, ?, ?)");

for (n = 0; n < 100; n++) {

  ps.setString(name[n]);
  ps.setLong(id[n]);
  ps.setInt(salary[n]);
  ps.executeUpdate();
}

如果使用JDBC的高级功能的话,批量更新应该会有更高的效率:

PreparedStatement ps = conn.prepareStatement(
  "INSERT into employees values (?, ?, ?)");

for (n = 0; n < 100; n++) {

  ps.setString(name[n]);
  ps.setLong(id[n]);
  ps.setInt(salary[n]);
  ps.addBatch();
}
ps.executeBatch();

3.正确使用ResultSet的GET方法

尽量不要使用诸如rs.getObject()这样的方法,另外如果还要更高的效率的话,请使用rs.getString(1)这样通过字段索引号的方式来取得字段值,而不是使用象rs.getString("UserName")这样的方法来取得字段值。

4.取得刚增加的记录的自动增加类型的字段的值

如果你的JDBC驱动支持的话,有一个很方便的方法可以取得自增字段的值,如下:

int rowcount = stmt.executeUpdate (
  "insert into LocalGeniusList (name) values ('Karen')",
Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys ();
posted @ 2005-06-08 18:03 小马歌 阅读(194) | 评论 (0)编辑 收藏
 

开发一个系统基本完毕的时候,为了提高系统的响应时间,我们需要把经常从数据库获取而又不经常修改的内容给缓存起来,但是,缓存起来,我们怎么知道是否缓存生效了,没从数据库去取呢?
对于DB2 V8.1数据库,它提供了一个数据库监视器开关,可以监视系统访问数据库里表的记录。
首先,db2cmd,然后db2 connect to dbname user username using pwd;
执行db2 get dbm cfg ,其中可以看到:

 缺省数据库监视器开关
   缓冲池                         (DFT_MON_BUFPOOL) = OFF
   锁定                                   (DFT_MON_LOCK) = OFF
   排序                                   (DFT_MON_SORT) = OFF
   语句                              (DFT_MON_STMT) = OFF
   表                                 (DFT_MON_TABLE) = OFF
   时间戳记                         (DFT_MON_TIMESTAMP) = ON
   工作单元                            (DFT_MON_UOW) = OFF

现在,我们把表的监视器开关给打开,执行 db2 update dbm cfg using dft_mon_table on,
这种方式是 在实例级别上设置监视器开关(影响所有用户和数据库),还有另外一种方式,
执行 db2 get monitor switches,显示

            监视器记录开关

db 分区号 0 的开关列表
缓冲池活动信息        (BUFFERPOOL) = OFF
锁定信息                    (LOCK) = OFF
排序信息                    (SORT) = OFF
SQL 语句信息           (STATEMENT) = OFF
表活动信息                 (TABLE) = OFF
获取时间戳记信息(时间戳记)    = ON  06/08/2005 08:28:10.052196
工作单元信息                 (UOW) = OFF
    db2 update monitor switches using switchName ,这种方式是 在应用程序级别上设置监视器开关(只适合于特定的应用程序)
再执行 db2 get dbm cfg 的时候发现 表的监视开关打开了:   表        (DFT_MON_TABLE) = ON
然后db2admin stop,db2admin start 让表监视器开关生效。
执行 db2 reset monitor for database dbname 让计数器复位,现在就可以运行应用系统了。之后获取数据库的快照可以执行 db2 get snapshot for database on dbname 就可以知道系统是否访问数据库了,缓存是否生效了。

posted @ 2005-06-08 17:57 小马歌 阅读(495) | 评论 (0)编辑 收藏
 
     刚开始学习加载的时候,接触到的是HeloWorld程序,当时不知道为什么在public static void main(String [] args) 方法里写了System.out.println("Hello World!") 就可以在控制台打出“Hello World!”来,确实的说,是什么东西隐蔽在后面执行了我们写的这段代码,通过后来的学习,知道了所有的class都是通过classloader来加载的。java规范这么说,Java的ClassLoader就是用来动态装载class的,ClassLoader对一个class只会装载一次,JVM使用的ClassLoader一共有4种:

         启动类装载器,标准扩展类装载器,类路径装载器网络类装载器
这4种ClassLoader的优先级依次从高到低,使用所谓的“双亲委派模型”。确切地说,如果一个网络类装载器被请求装载一个java.lang.Integer,它会首先把请求发送给上一级的类路径装载器,如果返回已装载,则网络类装载器将不会装载这个java.lang.Integer,如果上一级的类路径装载器返回未装载,它才会装载java.lang.Integer。

       再说说Package权限。Java语言规定,在同一个包中的class,如果没有修饰符,默认为Package权限,包内的class都可以访问。但是这还不够准确。确切的说,只有由同一个ClassLoader装载的class才具有以上的Package权限。比如启动类装载器装载了java.lang.String,类路径装载器装载了我们自己写的java.lang.Test,它们不能互相访问对方具有Package权限的方法。这样就阻止了恶意代码访问核心类的Package权限方法。    
       现在来通过扩展ClassLoader类实现一个自己的类装载器,每个Class对象都有一个引用指向装载他的ClassLoader,可以通过public ClassLoader getClassLoader()方法得到它。为了创建自己的类装载器我们应该扩展ClassLoader类,这是一个抽象类。假设要从本地文件系统使用我们实现的类装载器装载一个类,创建一个FileClassLoader extends ClassLoader,需要覆盖ClassLoader中的findClass(String name)方法,这个方法通过类的名字而得到一个Class对象。

package test.International;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class FileClassLoader extends ClassLoader {
    
public static final String drive = "d:/";
    
public static final String fileType = ".class";
    
public FileClassLoader() {
        super();
    }

    
public FileClassLoader(ClassLoader arg0) {
        super(arg0);
    }

    
public Class findClass(String name) {
        
byte[] data = loadClassData(name);
        
return defineClass(name, data, 0, data.length);
    }

    
public byte[] loadClassData(String name) {
        FileInputStream fis 
= null;
        
byte[] data = null;
        
try {
            fis 
= new FileInputStream(new File(drive + name + fileType));
            ByteArrayOutputStream baos 
= new ByteArrayOutputStream();
            
int ch = 0;
            
while ((ch = fis.read()) != -1{
                baos.write(ch);
            }

            data 
= baos.toByteArray();
        }
 catch (IOException e) {
            e.printStackTrace();
        }

        
return data;
    }

    
public static void main(String[] args) throws Exception {
        FileClassLoader loader 
= new FileClassLoader();
        Class objClass 
= loader.loadClass("HelloWorld"true);
        Object obj 
= objClass.newInstance();
        System.
out.println(objClass.getName());
        System.
out.println(objClass.getClassLoader());
    }

}

现在把HelloWorld.java放到默认包下,然后编译,把HelloWorld.class放到D:\盘根目录下,运行FileClassLoader类,控制台输出:

HelloWorld
sun.misc.Launcher$AppClassLoader@82ba41
可见,我们的确加载上了HelloWorld.class
posted @ 2005-05-19 22:57 小马歌 阅读(1261) | 评论 (4)编辑 收藏
 

      最近,部门的一个关于基础数据和权限控制的项目已近尾声,可由于性能的问题,一直没有做好正式上线运行的准备,由此,引发了一些我对压力测试的认识。
      MI 的LoadRunner8.0是一个工业级负载测试标准工具,用它进行压力测试,可以节约公司的人力,财力, 它本身可以模拟成千上万个用户并发访问系统,给系统一定的压力,模拟实际的生产环境,并且根据测试结果,它可以帮助我们分析系统的瓶颈,提供我们应用系统的性能。它分三个部分,首先要录制脚本,并在此基础上进行一些编辑(例如设置集合点,事务,参数化数据等),然后把这个脚本放到一个特定的场景里去执行,执行前可以进行一些运行期的设置,运行过程中可以监控系统的一些反映参数,最后通过它的分析工具来分析测试结果,给我们的应用系统提供一些性能方面的合理化建议。
     压力测试做完之后,虽然知道了问题,但是问题的方向是比较模糊的,为此,可以借助Quest公司的JProbe Suite性能测试工具进行内存,代码覆盖,方法调用时间方面的分析,查出具体的问题,进行修改发布之后,再利用LoadRunner进行反复测试,看性能是否优化了。
   
  在压力测试的过程中,应用服务器和数据库的一些参数调优也是非常重要的,针对应用服务器,比较重要的参数有jvm占用堆大小,线程池的大小,连接池的大小,prepareStatement Cache条数大小;针对数据库,表空间,索引,事务级别,锁大小,临时表这些参数也对系统应用有重要的影响。同时,在java应用里,sql优化,数据库连接的管理,缓存的使用,查询分页,防内存泄露的代码的使用会直接对应用系统造成巨大的性能影响。

     跟踪应用服务器里jvm垃圾回收的频率和所消耗时间的时候,可以加 -Xverbosegc参数来打印垃圾回收的详细信息。分析gc日志的工具有GCAnalyze 和HeapRoot 。

posted @ 2005-05-19 22:07 小马歌 阅读(326) | 评论 (0)编辑 收藏
 
    以前很早就听说过java是单继承的类结构,即一个类只能继承一个直接父类,并且所有的类都直接或间接继承于java.lang.Object类。对于这一点,一直接受,并且在jdk文档里看到的类继承层次结构也的确是这样。后来,无意中看到一个问题,问数组是不是继承自Object类,这一下还给问糊涂了,因为数组在java里是对象,不过像这种继承结构我还一直未看到呢?后来,写了点代码做了一个小测试,如下:
System.out.println(new int[1].getClass().getName());

发现int型数组的类是:[I 比较奇怪,是吧,并且代码显示:
System.out.println(new int[1].getClass().getSuperClass().getName());

它的直接父类就是java.lang.Object类,即所有类的根类。根据这些,做了一个总结:
第一种情况,当数组元素是基本类型时:
         int [] 对应class [I
         char [] 对应class [C
         byte [] 对应class [B
         short [] 对应class [S
         long [] 对应class [J
         float[] 对应class [F
         double [] 对应class [D
         boolean [] 对应class [Z

第二种情况,当数组元素是对象时:
        统一为 [L java.lang.Object

posted @ 2005-04-09 15:35 小马歌 阅读(343) | 评论 (0)编辑 收藏
 
// 判断是否闰年,如果是,返回true,否则,返回false,
public boolean isLeapYear(int year){
//MAX_YEAR,MIN_YEAR分别代表可以判断的最大年最小年
if(year< MIN_YERA || year> MAX_YEAR){
     
throw new Exception("判断的年份不在判断范围内!");
  }

//觉得精练的地方就在下一行
if((year&3)==0){
    
return ((year%400==0|| (year%100!=0));
  }

 
return false;
}
  写到这里,我想起来“java程序员变态32题”的其中一题了,题目是这么说的:请写出利用 2 最有效率得到 8的代码?答案是 2<<2。
  位操作一直是计算机最擅长的事情,可自从有了高级编程语言之后,我几乎把它忘了。现在明白java要保留位操作的原因了,觉得是效率~ 
  回到这个方法上,一般的人代码写得逻辑清晰,也能实现功能,可是像这么简洁高效的代码才是程序员梦寐以求的!我从此不敢小瞧 编码 。
posted @ 2005-04-08 21:09 小马歌 阅读(2449) | 评论 (8)编辑 收藏
仅列出标题
共95页: First 上一页 87 88 89 90 91 92 93 94 95