SYBASE 数据库迁移到AS 400 db2的FAQ(五)

发表于:2007-07-02来源:作者:点击数: 标签:
以下是我最后的一篇文章。 41.quiesce是一种持续状态的锁,它属于一个连接,当该连接失败时,quiesce状态依然存在。如何将表空间的状态置为正常状态? 答:除去quiesce状态: 1. 连接到数据库 2. 用 list tablespaces 判断哪个tablespace处于quiesce状态和和

 以下是我最后的一篇文章。

41.quiesce是一种持续状态的锁,它属于一个连接,当该连接失败时,quiesce状态依然存在。如何将表空间的状态置为正常状态?

答:除去quiesce状态:
1. 连接到数据库

2. 用 list tablespaces 判断哪个tablespace处于quiesce状态和和取得对象(object)ID

3. 判断对象ID对应的表

用 db2 "select tabname from syscat.tables where tablid=对象ID" 得到表名

b)用 db2 list history 判断是那个表

4. 用 db2 quiesce tablespaces for table 表名 reset 去除quiesce状态

42.在DB2 UDB中如何创建用户定义临时表?

答:可使用 DECLARE GLOBAL TEMPORARY TABLE 语句来定义临时表。此语句需在应用程序中使用。只有在应用程序与数据库断开连接之前,用户定义临时表才是持续的。
此表的说明并不出现在系统目录中,使其对于其他应用程序而言不是持续的,也不能与其他应用程序共享此表。
当使用此表的应用程序终止或与数据库断开连接时,此表中的数据被删除, 此表被隐式卸下。
下面是定义临时表的一个示例:
   DECLARE GLOBAL TEMPORARY TABLE gbl_temp
      LIKE empltabl
      ON COMMIT DELETE ROWS
      NOT LOGGED
      IN usr_tbsp
此语句创建一个名为 gbl_temp 的用户临时表。定义此用户临时表 所使用的列的名称和说明与 empltabl 的列的名称和说明完全相同。隐式定义只包括列名、数据类型、可为空特性和列缺省值属性。未定义所有其他列属性,包括唯一约束、外部关键字约束、触发器和索引。执行 COMMIT 操作时, 若未对该表打开 WITH HOLD 游标,则该表中的所有数据都被删除。不记录 对用户临时表所作的更改。用户临时表被放在指定的用户临时表空间中。此表空间必须存在,否则此表的声明将失败。

 

43.在使用IMPORT命令向数据库出入数据时,如何避免日志空间满错误?

答:在执行IMPORT命令时, 如果使用循环日志, 有时会出现日志满错误,
这时可用COMMITCOUNT参数来解决.
因为日志空间满往往是因为所有的日志均处于活动状态导致的.
而COMMIT执行后, 会释放所占据的资源, 其中包括日志 .
这样, 被当前事务使用的日志在COMMIT命令执行后, 即变成非活动状态了

44.怎么样检查数据库连接有关的错误?

答:以TCP/IP连接为例, 若连接失败,您可以检查下列项目:
A) 在服务器上: 1) db2comm 注册表值包括值 tcpip。
输入 db2set DB2COMM 命令, 以检查 db2comm 注册表值的设置。有关详情,请参考管理指南。
2) 正确地更新了 services 文件。
3) 在数据库管理程序配置文件中正确地更新了服务名 (svcename) 参数。
4) 安全服务已启动。输入.net start db2ntsecserver 命令(仅对于 Windows NT 服务器)。
5) 正确地创建并编目了数据库。
6) 数据库管理程序已停止并再次启动(在服务器上输入 db2stop 和 db2start 命令)。
* 如果在启动一个协议的连接管理程序时出现问题,则会出现警告信息,并将错误信息记录在 db2diag.log 文件中。

B) 在客户机上: 1) 正确地更新了 services 和 hosts 文件(若使用过的话)。
2) 使用正确的主机名 (hostname) 或 IP 地址 (ip_address)编目了此节点。
3) 端口号必须匹配,或服务名必须映射为服务器上所用的端口号。
4) 在数据库目录中指定的节点名 (node_name) 指向节点目录中的正确项目。
5) 数据库已正确编目, 它使用在服务器上创建该数据库时编目的服务器的数据库别名(database_alias),作为客户机上的数据库名 (database_name)。

验证这些项目后,若连接仍失败,则参考 DB2 Troubleshooting Guide

45.一种可以绕开删除整个表操作时遇到交易日志已满的办法

答:以空文件为数据文件导入(IMPORT)并替换(REPLACE)目标表和删除(DELETE)表操作的对比

当用DELETE TABLE命令删除整个表中数据时,该操作会逐条删除表中记录,并记入活动的交易日志。当表中数据量很大时,如果活动的交易日志不够大,就会遇到交易日志已满的错误,并回滚日志。即使活动的交易日志足够大,删除数据量很大的表的操作也会占用很多时间。用以空文件为数据文件导入(IMPORT)并替换(REPLACE)表的办法可以解决这个问题。例如
IMPORT FROM /dev/null OF DEL REPLACE INTO 目标表名

这样交易日志只会记录下该条命令,并立即释放所占的空间,而不会像删除命令一样逐条扫描记录,这就类似于DROP掉该表再创建一个完全相同只是没有数据的表一样。对于属于DMS表空间的表来说,删除命令逐条扫描记录,所占的记录空间仍标记为该表所用,而不立即释放空间,需要用REORG命令才可以释放剩余空间。用 LIST TABLESPACE SHOW DETAIL 可以对比两条命令执行后表空间中的剩余空间的大小。

用LOAD命令加REPLACE参数可以达到类似IMPORT命令加REPLACE的效果,但是由于LOAD本身不记日志,所以对于可恢复的数据库,LOAD完成后建议马上做一下联机备份的,相比之下,IMPORT命令加REPLACE操作上比较简单一些。
46. 怎么样获取表结构以及索引的信息

答:您可以使用"describe" 命令:
(1) 显示关于SELECT语句的 SQLDA 信息;
(2) 显示表或视图的列信息;
(3) 显示表或视图的索引信息;

举例:1) 下面的例子用于描述 SELECT 语句:
db2 "describe select * from staff"
SQLDA Information
sqldaid : SQLDA sqldabc: 896 sqln: 20 sqld: 7
Column Information
sqltype sqllen sqlname.data sqlname.length
--------------- ------ -------------- ---------------
500 SMALLINT 2 ID 2
449 VARCHAR 9 NAME 4
501 SMALLINT 2 DEPT 4

 

2) 下面的例子用于描述表结构:
db2 describe table user1.department
Table: USER1.DEPARTMENT
Column
name Type
schema Type
name Length Scale Nulls
--------- ------- ----------- -------- ------ ------
AREA SYSIBM SMALLINT 2 0 No
DEPT SYSIBM CHARACTER 3 0 No
DEPTNAME SYSIBM CHARACTER 20 0 YES

3) 下面的例子用于描述索引结构:
db2 describe indexes for table user1.department
Table: USER1.DEPARTMENT
Index
schema Index
name Unique
rule Number of
columns
------------ ---------- ------------ ----------------
USER1 IDX1 U 2

47.如何在Unix平台上启动DB2控制中心(Control Center)

答:再Unix平台上启动DB2控制中心需要一下几个步骤,以AIX操作系统为例:

1. 安装DB2时选择安装DB2控制中心(Control Center);
2. 以root账号登录,输入xhost +命令(每次重新启动Unix后需输入该条命令以启动控制中心);
3. 以DB2实例管理员账号登录,输入以下命令
a. db2jstrt
b. db2cc
这样,就启动了DB2控制中心(Control Center)。
#xhost +
#su - db2inst1
$db2jstrt
$db2cc
db2cc使用的是jdk118
export JAVA_HOME=/usr/jdk118
export PATH=/usr/jdk118/bin:$PATH

48.如何更改本地系统名称

答:首先,从控制中心(Control Center)中知道本地系统所在的原节点名。
然后退出控制中心,在命令行处理器中输入以下命令:
1. db2set db2system=新系统名
2. db2 terminate
3. db2 uncatalog node 原节点名
4. db2 terminate
重起控制中心,可以看到,本地系统名已更改。

 

 

DECLARE UNDO HANDLER FOR SQLEXCEPTION

SET errmsg = @#ERROR, ROLLBACK WAS ISSUED@#;

 

49.DB2SIGNAL 和 RESIGNAL的用法?

答:举例

CREATE PROCEDURE xhzq_db.G10()

LANGUAGE SQL

BEGIN

DECLARE c1 CONDITION FOR SQLSTATE @#38001@#;

DECLARE CONTINUE HANDLER FOR C1

INSERT INTO XHZQ_DB.ZZ_RESULT(proc,res) VALUES (@#exec of G10@#,@#EXIT handler fired@#);

INSERT INTO XHZQ_DB.ZZ_result(proc,res) VALUES (@#exec of G10@#,@#START of Proc@#);

SIGNAL SQLSTATE @#38001@#;

INSERT INTO XHZQ_DB.ZZ_result(proc,res) VALUES (@#exec of G10@#,@#END of Proc@#);

END;

如果调用后,select *  from  XHZQ_DB.ZZ_result ;

结果如下:

proc          res

exec of G10     START of Proc

exec of G10     EXIT handler fired

exec of G10     END of Proc

举例

CREATE PROCEDURE G11()

LANGUAGE SQL

BEGIN

DECLARE c1 CONDITION FOR SQLSTATE @#38001@#;

INSERT INTO result(proc,res) VALUES (@#exec of G11@#,@#START of Proc@#);

SIGNAL SQLSTATE @#38001@#; /*the handler will be fired by this statement*/

INSERT INTO result(proc,res) VALUES (@#exec of G11@#,@#END of Proc@#);

END;

如果调用后,select *  from  result ;

结果如下:

proc          res

exec of G11     START of Proc

 

 

49.关于AS400DB2中存储中文的问题

答:AS400下db2存储中文作了特殊处理。

格式为 0e 开头+ 中文字符串 + 0f结尾,如果有中文和英文字符串混合的字符串,其中每个中文字符串都加0e和0f

例如:  中国  存储后 0e中国0f

        AV中国制造KK湖南  存储后:  AV0e中国制造0fKK0e湖南0f

注意:除了a-z,A-Z以外的字符全部按中文字符串同样处理。

50.SQLCODE的捆绑声明语句

答:

DECLARE SQLCODE INTEGER DEFAULT 0;

DECLARE SQLSTATE CHAR(5) DEFAULT ’00000’;

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET retcode=SQLCODE;

DECLARE CONTINUE HANDLER FOR SQLWARNING SET retcode=SQLCODE;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET retcode=SQLCODE;

到此我已经完成了我的内容,希望感兴趣的朋友!可以和我联系交流!

QQ:50839655

msn:dekkerdillon@hotmail.com

email:zhangtao@xhzq.com,dekker99@163.com

htmp://www.xhzq.com

原文转自:http://www.ltesting.net