DB2 日常维护技巧,第 4 部分

(http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0812chengy2/)

DB2 日常维护技巧,第 4 部分

数据库代码页、表结构等

本文主要介绍数据库管理员(DBA)在日常维护中遇上一些比较紧急的情况如何处理,如何形成自己的应急方案,以及在日常维护中需要注意哪些技巧。“ DB2 日常维护技巧,第 4 部分”主要包括如何更改本地系统名称、如何解决数据库别名已经存在的问题、如何解决 DB2 数据库代码页不相容的问题、如何快速清空一个大表中的所有数据、如何解决不能创建工具数据库的问题、如何获取表结构以及索引的信息等。

程永, 高级信息工程师, IBM

王雪梅, 高级数据库工程师, 自由撰稿人

2008 年 12 月 18 日

  • +内容

如何更改本地系统名称

在安装完 DB2 后,如果想更改 DB2 所在服务器系统的名称,可以通过在 DB2 所在服务器上更改 DB2SYSTEM 注册表变量来实现,具体的步骤如下:

  1. 在 DB2CLP 窗口中,执行 “ db2set db2system= 新系统名 ”。
  2. 在 DB2CLP 窗口中,执行 “ db2 terminate ” 。
  3. 在 DB2CLP 窗口中,执行 “ db2 uncatalog node 原节点名” 。
  4. 在 DB2CLP 窗口中,执行 “ db2 terminate ” 。

如何解決数据库別名已存在问题

我们在创建新的数据库时,经常会碰上数据库别名已经存在的错误,产生这个错误的原因可能有两种:

1. 这个数据库在系统数据库目录中存在。

在控制中心能够看到和 DB2CLP 窗口中使用 LIST DB DIRECTORY 可以看到。

2. 该数据库被“除去”,而不是被“删除”。

另一个可能,这是由于之前我们在控制中心,使用了“除去”数据库功能,而不是“删除”数据库功能(或者在 DB2CLP 窗口中使用“ UNCATALOG DB 数据库名”命令),“除去”数据库只是在逻辑上把数据库的编目信息删除,并没有真实的删除该数据库。只是我们用 LIST DB DIRECTORY 或在控制中心查看的时候,看不到该数据库而已。在我们用这个数据库名创建新的数据库时,就会报 SQL1005N 错。

解决的这个问题的具体的步骤如下:

  1. 首先通过在 DB2CLP 窗口中,发出“ DB2 LIST DB DIRECTORY ”命令,查看系统数据库目录中有没有该数据库。如果有,看这个数据库是否还有用,如果没有用,就删除掉该数据库重新创建即可。
  2. 如果系统数据库目录下没有该数据库存在,就通过 db2 list database directory on location 查看在本地数据库目录中有没有该数据库,location 指定数据库的位置(在 Windows 下只能是各个盘符,比如 C: 或 D:, 在 UNIX 下可以是具体的文件目录),如果有,就先使用 db2 catalog database 数据库名 on location 将数据库 catalog 到节点上,再删除该数据库并重新创建。

下面我们来通过具体的例子来看一下。继续在 DB2CLP 窗口中,发出 LIST DB DIRECTORY 命令,来查看我们目前在系统数据库目录下都有哪些数据库,具体如清单 22

所示:

清单 22. 查看系统数据库目录,都有哪些数据库
C:\>DB2 LIST DB DIRECTORY  系统数据库目录   目录中的条目数 = 7 

数据库 1 条目:

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

数据库 2 条目:

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

数据库 3 条目:

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

数据库 4 条目:

数据库别名 = TEST 
数据库名称  = EMR 
节点名  = NEW 
数据库发行版级别  = c.00 
注释  = 
目录条目类型  = 远程
目录数据库分区号  = -1 
备用服务器主机名 = 
备用服务器端口号  = 

数据库 5 条目:

数据库别名  = MYABC 
数据库名称  = ABC 
节点名  = MYREMOTE 
数据库发行版级别  = c.00 
注释  = 
目录条目类型 = 远程
目录数据库分区号  = -1 
备用服务器主机名  = 
备用服务器端口号  = 

数据库 6 条目:

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

数据库 7 条目:

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

命令成功完成。我们可以看到,目前在系统数据库目录下有 7 条记录,也就是有 7 个数据库或别名。此时我们在控制中心“除去”数据库 SAMPLE_1,具体如图 5 所示:

图 5. 在控制中心除去数据库 SAMPLE_1
在控制中心除去数据库 SAMPLE_1

除去的方式,也可以在 DB2CLP 窗口,通过发出“ UNCATALOG DB SAMPLE_1 ”命令“除去”数据库 SAMPLE_1,也就是取消编目数据库 SAMPLE_1,然后再发出“ TERMINATE ”命令。具体如清单 23 所示:

清单 23. 除去数据库 SAMPLE_1
C:\> DB2 UNCATALOG DB SAMPLE_1 
 DB20000I UNCATALOG DATABASE 命令成功完成。
 DB21056W  直到刷新目录高速缓存之后,目录更改才生效。


 C:\> DB2 TERMINATE 
 DB20000I TERMINATE 命令成功完成。

命令成功完成。下面我们再次发出 LIST DB DIRECTORY 命令,来查看我们目前在系统数据库目录下都有哪些数据库,发现已经没有了数据库 SAMPLE_1,具体如清单 24 所示,使用控制中心也看不到数据库 SAMPLE_1,具体如图 5 所示:

清单 24. 查看系统数据库目录,都有哪些数据库
C:\>DB2 LIST DB DIRECTORY  系统数据库目录   目录中的条目数 = 6 

数据库 1 条目:

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

数据库 2 条目:

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

数据库 3 条目:

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

数据库 4 条目:

数据库别名  = TEST 
数据库名称  = EMR 
节点名  = NEW 
数据库发行版级别  = c.00 
注释  = 
目录条目类型  = 远程
目录数据库分区号  = -1 
备用服务器主机名  = 
备用服务器端口号 = 

数据库 5 条目:

数据库别名  = MYABC 
数据库名称  = ABC 
节点名  = MYREMOTE 
数据库发行版级别  = c.00 
注释  = 
目录条目类型  = 远程
目录数据库分区号 = -1 
备用服务器主机名  = 
备用服务器端口号  = 

数据库 6 条目:

数据库别名  = SAMPLE 
数据库名称  = SAMPLE 
本地数据库目录  = C: 
数据库发行版级别  = c.00 
注释  = 
目录条目类型  = 间接
目录数据库分区号  = 0 
备用服务器主机名  = 
备用服务器端口号  =
图 5. 控制中心,找不到数据库 SAMPLE_1
控制中心,找不到数据库 SAMPLE_1

此时我们在 DB2CLP 窗口中,发出“ CREATE DB SAMPLE_1 ”命令,会得到“ SQL1005N 数据库别名 "SAMPLE_1" 已存在于本地数据库目录或系统数据库目录中。”错误,提示已经有数据库 SAMPLE_1 存在了,具体如清单 24 所示:

清单 24. 创建数据库 SAMPLE_1
C:\> DB2 CREATE DB SAMPLE_1 
 SQL1005N  数据库别名 "SAMPLE_1" 已存在于本地数据库目录或系统数据库目录中。

解决这个问题的办法,就是把原来存在的数据库重新 CATALOG 上,然后再“删除”掉,而不是“除去”,这样处理过后,就可以使用这个数据库名创建新的数据库成功了。

下面我们继续在当前 DB2CLP 窗口中,发出“ LIST DB DIRECTORY ON C: ”命令,可以看到数据库 SAMPLE_1 还在本地目录中存在,参照本小节开头的解决方法第二步,需要先 CATALOG 该数据库,再 DROP 掉该数据库,才能重新创建,具体如清单 25 所示:

清单 25. 创建数据库 SAMPLE_1
C:\> db2 list db directory on c: 

 c: 上的本地数据库目录   目录中的条目数 = 4 

数据库 1 条目:

数据库别名  = EMR 
数据库名称 = EMR 
数据库目录  = SQL00001 
数据库发行版级别  = c.00 
注释  = 
目录条目类型  = 本地
目录数据库分区号  = 0 
数据库分区号  = 0 

数据库 2 条目:

数据库别名  = DBSAMPL2 
数据库名称  = DBSAMPL2 
数据库目录  = SQL00004 
数据库发行版级别  = c.00 
注释  = 
目录条目类型  = 本地
目录数据库分区号  = 0 
数据库分区号  = 0 

数据库 3 条目:

数据库别名   
				 = SAMPLE_1 数据库名称   
				 = SAMPLE_1 数据库目录   
				 = SQL00003 数据库发行版级别   
				 = c.00 注释   
				 = 目录条目类型 = 本地
目录数据库分区号   
				 = 0 数据库分区号   
				 = 0 数据库 4 条目:

数据库别名  = SAMPLE 
数据库名称  = SAMPLE 
数据库目录  = SQL00002 
数据库发行版级别  = c.00 
注释 = 
目录条目类型  = 本地
目录数据库分区号  = 0 
数据库分区号  = 0 

 C:\> db2 catalog db sample_1 
 DB20000I CATALOG DATABASE 命令成功完成。
 DB21056W  直到刷新目录高速缓存之后,目录更改才生效。

 C:\> db2 terminate 
 DB20000I TERMINATE 命令成功完成。

 C:\> db2 drop db sample_1 
 DB20000I DROP DATABASE 命令成功完成。

 C:\> db2 create db sample_1 
 DB20000I CREATE DATABASE 命令成功完成。

命令成功完成。

如何解决 DB2 数据库代码页不相容的问题

当数据库的环境变量 DB2CODEPAGE 和数据库的代码页不兼容时,我们连接数据库就会收到错误代码为 SQL0332N 的错误,查看该错误的帮助,可以发现这是由于 DB2 不支持从源代码页 "< 源代码页 >" 到目标代码页 "< 目标代码页 >" 的字符转换引起的,错误具体信息如清单 26 所示:

清单 26. 查看 SQL0332N 错误信息的帮助
C:\> db2 ? SQL0332N 


 SQL0332N  不支持从源代码页 " < 源代码页 > " 到目标代码页 " < 目标代码页 > " 的字符转换。

说明 : 

操作失败,因为 " < 源代码页 > " 与 " < 目标代码页 > " 之间不存在代码页转换。这
可能是由下列其中一个原因引起的:
 1. 源代码页与目标代码页的字符指令表不兼容,因此,当源代码页与目标代码页   之间进行转换时,
这可能会导致字符丢失和破坏。
 2. 不支持此特定代码页转换。

可能会导致此错误的某些操作包括:
 *  将客户机连接至数据库,而客户机的代码页与数据库代码页不相同。
 *  执行 SQL 语句,客户机的代码页与数据库代码页不相同。
 *  导入或导出 WSF 或 IXF 文件,而该文件的代码页与数据库代码页不相同。
 *  联合系统用户:数据源不支持指定的代码页转换。

用户响应 : 

 1. 使源代码页与目标代码页互相兼容。使用短语 " 代码集地域代码 " 来搜索 DB2  信息中心
(http://publib.boulder.ibm.com/infocenter/db2luw/v9),以了解受支持的 DB2 代码页的兼容性。
要将客户机的代码页设置为与数据库代码页兼容: *  在 Unix 平台上,将 LANG、LC_CTYPE 
或 LC_ALL 环境变量设置为这样一   种语言环境:其代码页与数据库代码页相兼容。请查阅
平台文档,以了解   有效的语言环境名称以及与每个语言环境名称相关联的代码页。 
 *  在 Windows 平台上,设置 DB2CODEPAGE 注册表变量,以使用一个与数据库代码页兼容
的值来覆盖客户机的代码页。

 2. 要获取数据库管理器代码页支持,请使用短语 " 代码集地域代码 " 短语来搜索  DB2 信息中心
(http://publib.boulder.ibm.com/infocenter/db2luw/v9)。对于联合系统用户,请参阅《联合系统指南》
以了解数据源代码页。如果源代码页与目标代码页兼容,那么说明 DB2 当前不支持此特定的代码
页转换。请   与技术服务代表联系以确定是否可以添加这种支持。

 DB2 UDB iSeries 版的用户应该知道:具有 CCSID 65535 的字符列或图形列是不
受支持的。必须将使用 CCSID 65535 的字符列或图形列转换为受支持的 CCSID(
使用 CAST 来进行转换)之后,才能使用 DB2 Connect 来访问这些列。  sqlcode: -332 sqlstate: 57017

针对这种问题,我们需要查找 DB2 信息中心,使用短语“代码集地域代码”来搜索数据库代码页对应的字符集,然后修改 DB2CODEPAGE 环境配置变量,比如数据库字符集为 DBK,我们修要修改 DB2CODEPAGE 环境配置变量为 1386,具体如清单 27 所示:

清单 27. 修改 DB2CODEPAGE 环境配置变量为 1386
C:\> db2set db2codepage=1386 

 C:\> db2 terminate 
 DB20000I TERMINATE 命令成功完成。

命令成功完成。

如何快速清空一个大表中的所有数据

在 DB2 数据库中,如果想快速清空一张大表(类似在 ORACLE 中使用 TRUNCATE TABLE 快速清空一张大表),有两种方法:

  1. 使用 “ ALTER TABLE 表名 ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE ” 命令。
  2. 使用空文件为数据文件导入并替换表中数据。
  • 在 windows 平台,可以先使用 EXPORT 导出一个空文件,再使用 IMPORT 命令从空文件中导入并替换该表中数据,比如:
    export to test.ixf of ixf messages log.txt select * from test where 1=2
    import from test.ixf of ixf messages log1.txt replace into test
  • 在 UNIX 平台,除了使用 A 方法以外,还可以使用从空(NULL)中导入并替换该表数据,比如:
    import from /home/null of del replace into test

如果使用“ DELETE TABLE ”命令删除整个大表中的数据,由于这个命令采用逐条删除,并把该操作记入活动的交易日志,将会耗费大量的活动日志空间,有可能造成数据库交易日志已满错误,另外,这样删除大表数据耗费的时间也很长。对于属于 DMS 表空间的表来说,删除命令逐条扫描记录,所占的记录空间仍标记为该表所用,而不立即释放空间,需要用 REORG 命令才可以释放剩余空间。

使用以上两种方法快速清空一张大表,将使 DB2 交易日志只记录该条命令,并立即释放所占用的空间,而不会像删除命令一样逐条扫描记录,从而节省大量的数据库交易日志和处理时间。用 LOAD 命令加 REPLACE 参数可以达到类似 IMPORT 命令加 REPLACE 的效果,但是由于 LOAD 本身不记日志,所以对于可恢复的数据库,LOAD 完成后建议马上做一下联机备份的,相比之下,IMPORT 命令加 REPLACE 操作上比较简单一些。

解决不能重新创建工具数据库的方法

工具目录数据库包含“任务中心”和“控制中心”创建的任务信息。这些任务是由 DB2 管理服务器的调度程序运行的。调度程序和工具目录数据库始终一起工作,缺一不可。调度程序是 DB2 管理服务器的一个特定段,该服务器充当代理程序以读取工具目录数据库,并在其各自的时间里运行任务。

在 DB2 数据库中,一般初次创建工具目录数据库,都会成功,如果是以前创建过工具目录数据库,删除后,想再次重新创建,默认情况下,是无法创建成功的。解决的方法是更新管理服务器(DB2 ADMIN SERVER)配置参数 SCHED_ENABLE 和 TOOLSCAT_DB,具体命令如 28 所示:

清单 28. 更新 DB2 ADMIN SERVER 配置参数
C:\> db2 get admin cfg  管理服务器配置

认证类型 DAS ( AUTHENTICATION ) = SERVER_ENCRYPT 

 DAS 管理权限组名 ( DASADM_GROUP ) = 

 DAS 发现方式  ( DISCOVER ) = SEARCH 
 DB2 服务器系统的名称  ( DB2SYSTEM ) = CYONG 

 Java Development Kit 安装路径 DAS ( JDK_PATH ) 
          = AUTOMATIC ( C:\Program Files\IBM\SQLLIB\java\jdk ) 
 Java Development Kit 安装路径 DAS ( JDK_64_PATH )
     = AUTOMATIC ( C:\Program Files\IBM\SQLLIB\java\jdk ) 

 DAS 代码页  ( DAS_CODEPAGE ) = 0 
 DAS 地域  ( DAS_TERRITORY ) = 0 

联系人列表的位置 ( CONTACT_HOST ) = 
执行到期的任务  ( EXEC_EXP_TASK ) = NO 
调度程序方式   ( SCHED_ENABLE ) = ON

SMTP 服务器  (SMTP_SERVER) = 

工具目录数据库  (TOOLSCAT_DB) = TOOLSDB 
工具目录数据库实例  (TOOLSCAT_INST) = DB2 
工具目录数据库模式  (TOOLSCAT_SCHEMA) = RHETTE 
调度程序用户标识  = 

诊断错误捕获级别  (DIAGLEVEL) = 2 

 C:\> db2 update admin cfg using SCHED_ENABLE off 
 DB20000I UPDATE ADMIN CONFIGURATION 命令成功完成。

 C:\> db2 update admin cfg using TOOLSCAT_DB null 
 DB20000I UPDATE ADMIN CONFIGURATION 命令成功完成。

 C:\> db2 terminate 
 DB20000I TERMINATE 命令成功完成。

 C:\> db2stop 
 2008-04-05 13:21:57 0 0 SQL1064N DB2STOP 处理成功。
 SQL1064N DB2STOP 处理成功。

命令成功完成。这个时候再次重新创建工具目录数据库,就会成功了。

如何获取表结构以及索引的信息

列出表或视图的结构:

DESCRIBE TABLE <TABLE_NAME>

列出 select 语句结果的结构:

DESCRIBE < SELECT STATEMENT>

列出表或视图的索引结构:

DESCRIBE INDEXES FOR TABLE 表名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值