blogjava-凯发k8网页登录http://www.blogjava.net/i369/category/22055.html北极心空zh-cnfri, 27 jul 2007 03:17:00 gmtfri, 27 jul 2007 03:17:00 gmt60db2使用经验备忘http://www.blogjava.net/i369/articles/132086.html芦苇芦苇tue, 24 jul 2007 08:48:00 gmthttp://www.blogjava.net/i369/articles/132086.htmlhttp://www.blogjava.net/i369/comments/132086.htmlhttp://www.blogjava.net/i369/articles/132086.html#feedback0http://www.blogjava.net/i369/comments/commentrss/132086.htmlhttp://www.blogjava.net/i369/services/trackbacks/132086.html  2.控制中心中无法增删改数据,只能编写sql语句来实现而quest提供的工具虽然能增加数据,但居然无法用复制、粘贴和tab键,必须逐个输入,然后用点击切换现存数据看来可以在单元格中编辑修改,但实际却无法commit,呵呵,还是老老实实写ute语句,至于删除数据,更是非写delete语句不可。不过可以用pb以单元格方式编辑数据,相应的一个缺点是编辑数据的按钮和删除表的按钮太近,万一点错了删除表的按钮,pb可是不作提示就把表给删了的,faint

  3.db2的视图里不能直接用order by语句,必须这样写 select × from(select a,b,c from table1 order by a)as tab

  这种写法的前提是你已经打过补丁了

  4.过程的问题:

  db2提供ltrim函数和rtrim函数,但偏偏不提供trim函数,如果你希望去除字符两端的空格,对不起,必须用ltrim(rtrim()) 的方式调用insert 语句里面居然不能用表达式赋值,必须把值先赋给一个变量调用其他存储过程时竟然不能用常量做参数,必须把这个常量的值赋给一个变量,再以这个变量为参数

  select * from table fetch first n rows only 语句居然在存储过程里不可用

  5.存储过程里可以使用动态sql,但函数里却不可以使用,kao

  6. 遇到commit或rollback时自动关闭游标,所以需要慎重使用单独提交。

  proc builder老是在调试中不足,屏幕花掉。而如果断点调试时暂停不进行下去的时间稍微长一点就会提示超时,受不了。

  7.开发中遇到的一个问题

  在使用 日期变量 1 months or 日期变量-1 months 的方式取日期时,比如日期变量值为 2004-02-29时,存储过程里将日期变量 1 months 赋值给另一

  日期变量时会出错。相应sqlstate为01506(db2 ? 01506): 对 date 或timestamp值进行了调整,以校正算术运算得出的无效日期。

  如果要获取的只是下一月份,可采用的替代方法是获取当前日期所在月份的第一天作为基准后 1 months or -1 months

  8.哈哈,今天帮别人弄存储过程的经验@04.08.05

  搞了半天搞不定,一查原来的文档才了,原来tmd该死的db2的存储过程,是转换为c后,进行编译的。因此在数据库服务器上要安装一个c编译器才能完成存储过程的编译。并且需要使用db2set命令,设置db2_sqlroutine_compiler_path指向c编译器的安装路径。如:db2set

  db2_sqlroutine_compiler_path=e:\programfiles\microsoftvisualstudio\vc98\bin\vcvars32.bat

  9.对变量的赋值不能用select ..into ..方式而要用set v=(select ..)的方式,代码示例如下。

drop function sxfm.isordersubmitdate;
create function sxfm.isordersubmitdate(in_row_id decimal(16,0))
  returns date
  language sql
begin atomic
declare v_submit_date date;
declare v_sell_id decimal(16, 0);
declare v_buy_id decimal(16, 0);

set v_sell_id = (select coalesce(receive_id,-1) from is_order where row_id=in_row_id);
set v_buy_id = (select coalesce(pay_id,-1) from is_order where row_id=in_row_id);
set v_submit_date = (select date(max(a.submit_date)) from am_audit_queue a,sm_user b,sm_user c
where a.table_code='is_order' and a.table_row_id=in_row_id
and a.audit_emp_id=c.row_id and c.branch_id=v_buy_id   --审核方为付款方
and a.submit_emp_id=b.row_id and b.branch_id=v_sell_id); --提交方为收款方

return v_submit_date;
end;
#sync 10;

  10.db2的游标打开后遇到commit和rollback默认是会关闭的。保持游标打开的方法是在定义游标时加上with hold选项

  11.f:导出某张表的数据,且该表包含long varchar型数据,该如何操作q:export:db2 cont to [dbname] user [user] using [password]db2move [dbname] export -tn [tablename] -u [user] -p[password] (单表)db2move [dbname] export -tn [tablename1,tablename2,...] -u [user] -p [password] (多表)import:db2move [dbname] import

 

=============================================================================

db2上机操作指令指南


1. 启动实例(db2inst1):

  db2start

  2. 停止实例(db2inst1):

  db2stop

  3. 列出所有实例(db2inst1)

  db2ilist

  5.列出当前实例:

  db2 get instance

  4. 察看示例配置文件:

  db2 get dbm cfg|more

  5. 更新数据库管理器参数信息:

  db2 ute dbm cfg using para_name para_value

  6. 创建数据库:

  db2 create db test

  7. 察看数据库配置参数信息

  db2 get db cfg for test|more

  8. 更新数据库参数配置信息

  db2 update db cfg for test using para_name para_value

  10.删除数据库:

  db2 drop db test

  11.连接数据库

  db2 cont to test

  11.列出所有表空间的详细信息。

  db2 list tablespaces show detail

  12.列出容器的信息

  db2 list tablespace containers for tbs_id show detail

  13.创建表:

  db2 ceate table tb1(id integer not null,name char(10))

  14.列出所有表

  db2 list tables

  12.插入数据:

  db2 insert into tb1 values(1,’sam’);

  db2 insert into tb2 values(2,’smitty’);

  13.查询数据:

  db2 select * from tb1

  14.数据:

  db2 delete from tb1 where id=1

  15.创建索引:

  db2 create index idx1 on tb1(id);

  16.创建视图:

  db2 create view view1 as select id from tb1

  17.查询视图:

  db2 select * from view1

  18.节点编目

  db2 catalog tcp node node_name remote server_ip server server_port

  19.察看端口号

  db2 get dbm cfg|grep svcename

  20.测试节点的附接

  db2 attach to node_name

  21.察看本地节点

  db2 list node directory

  22.节点反编目

  db2 uncatalog node node_name

  23.数据库编目

  db2 catalog db db_name as db_alias at node node_name

  24.察看数据库的编目

  db2 list db directory

  25.连接数据库

  db2 connect to db_alias user user_name using user_password

  26.数据库反编目

  db2 uncatalog db db_alias

  27.导出数据

  db2 export to myfile of ixf messages msg select * from tb1

  28.导入数据

  db2 import from myfile of ixf messages msg replace into tb1

  29.导出数据库的所有表数据

  db2move test export

  30.生成数据库的定义

  db2look -d db_alias -a -e -m -l -x -f -o db2look.sql

  31.创建数据库

  db2 create db test1

  32.生成定义

  db2 -tvf db2look.sql

  33.导入数据库所有的数据

  db2move db_alias import

  34.重组检查

  db2 reorgchk

  35.重组表tb1

  db2 reorg table tb1

  36.更新统计信息

  db2 runstats on table tb1

  37.备份数据库test

  db2 backup db test

  38.恢复数据库test

  db2 restore db test



芦苇 2007-07-24 16:48
]]>
在db2中创建第一个触发器http://www.blogjava.net/i369/articles/132069.html芦苇芦苇tue, 24 jul 2007 07:47:00 gmthttp://www.blogjava.net/i369/articles/132069.htmlhttp://www.blogjava.net/i369/comments/132069.htmlhttp://www.blogjava.net/i369/articles/132069.html#feedback2http://www.blogjava.net/i369/comments/commentrss/132069.htmlhttp://www.blogjava.net/i369/services/trackbacks/132069.html

当特定事件在 ibm® ® universal database™ 数据库中发生时,您就可以激活 触发器来执行其他一些操作。在本文中,您将在触发器的世界里遨游,看看如何通过触发器来增强数据库中的业务规则。您还将学习如何使用 udb version 8.1 的控制中心来帮助您创建一个应用于简单业务场景的简单触发器。



当一个指定的 sql 操作(如 delete,insert,或者是 update 操作)作用于某张表时,一个定义了一组操作的触发器就可以被激活。触发器并不像参照完整性约束和检查约束那样,我们甚至可以使用对其他表来进行更新。



将一项技术应用于真实世界的一个场景总是有益的。出于教学的目的,让我们在一个银行相关环境中研究触发器,在该模拟环境中,我们仅仅建立了一张表。再次强调,这是被简化了的!我们将要做的是,运用触发器来促进银行提供的透支保护。例如,一个银行客户有一个支票帐户(checking account)和一个储蓄帐户(saving account)。当从支票帐户中取款的金额超过了该帐户的余额时,就会发生一次自动的转帐(叫做透支保护),即自动从客户的储蓄帐户转帐过来。当然,这必须符合一定的条件,即储蓄帐户中必须有足够多的钱来补偿透支的金额。



像上面所提及的,我们的银行仅仅包含一张表。在这张表中,我们将存入客户的支票帐户和储蓄帐户的余额等信息。每个客户通过其社会保险号码来标识。下面是对该表的描述:

表 1. 对 accttable 的描述

column name column type nullable?
ssn* varchar(11) no
lastname varchar(30) no
firstname varchar(30) no
savingbalance decimal (precision: 7, scale: 2) no
checkingbalance decimal (precision: 7, scale: 2) no
* 表示主键

请使用 命令行处理器为上面的表创建一个数据库。将数据库命名为 bnkdb。

db2 => create database bnkdb

接下来,连接到该数据库。我假设您已经在您的机器上有了一个用户名为 db2admin 密码为 db2admin 的帐号。

db2 => connect to bnkdb user db2admin using db2admin

现在,创建 accttable 表:

db2 => create table accttable(ssn varchar(30) not null primary key,
            lastname varchar(30) not null, firstname varchar(30) not null,
            savingbalance decimal(7,2) not null, checkingbalance decimal(7,2) not null)
            

现在向所创建的表中加入两条记录:

db2 => insert into accttable values
            ('111-11-1111','bhogal','kulvir',1500.00,1000)
            
db2 => insert into accttable values
            ('222-22-2222','guy','someother',2000.00,4000)
            

触发器可以在对表的一次 insert、 delete 或者 update 操作 之前之后启动。在我们的例子中,您将创建一个在对accttable 表执行 update 操作之前启动的触发器。在触发器术语中,insert、 delete 或者 update 这些使得触发器启动的事件被称作 触发事件。触发器的启动是在触发事件之前还是之后则称为触发器的 激活时间



打开 control center 开始创建触发器,展开您创建的数据库(即 bnkdb),鼠标右键点击 triggers 选项并且选择 create.....



create trigger 屏幕中,可以指定触发器所在的模式。请选择 admin 模式。记住,触发器是与表相关的,所以我们需要选择相关表的模式。然后请再次选择 admin 模式:



在同一个屏幕中, 需要指定一个触发器的名字。将触发器命名为 overdraft。而且,需要指定与该触发器相关的表的名字。这里选择您创建的 accttable



time to trigger action区域中,选择 before



operation that causes the trigger to be executed区域中选择 update of columns 操作并且指定被操作列为 checkingbalance



点击 triggered action标签页来创建该触发器:





udb 能够跟踪在启动触发器的那条语句之前和之后的一行的状态。请在 correlation name for the old rows 一栏中填入 oldrow,correlation name for the new rows 一栏中填入 newrow



注意,您也许无法指定其中的一个 correlation name,因为它依赖于引起触发器启动的特定操作和激活时间的组合。例如,假设您的触发器选择的 time to trigger actionbefore,触发事件是 delete 语句。在这种情况下,我们就无法指定一个 "correlation name for the new rows"。为什么呢?因为在执行了一个删除操作以后,新行是不存在的。

因为您创建的触发器是在 update 之前被激活,所以不能编辑 temporary table for the old rowstemporary table for the new rows选项。

您将注意到,在这种情况下(一个在 update 之前被激活的触发器),您只能指定触发器针对 而不是针对每个 语句触发。



引起触发事件的语句可能会同时影响数据库中的多行。"for each row" 选项意味着触发器将在每一行被修改时激活。另一方面,"for each statement" 选项("before" 型触发器是不允许的)则意味着触发器定义的操作只在调用一次 sql 语句后执行一次。

可以点击 show sql按钮来看看底层的 sql 语句到目前为止是什么样子:





现在该创建触发动作了。我们的业务规则是支票帐户的余额必须低于 0 才能激活该触发器。也就是说,我们需要指定 search-condition 为 newrow.checkingbalance<0 。我们之所以指定 newrow.checkingbalance 是因为需要分析在 update 操作之后支票帐户的余额将会是多少。



现在我们将要在 triggered action 文本区域中替换 triggered-sql-statement (参见下面)。



用来替换的代码如下:

declare overage decimal (7,2);
            set overage = (newrow.checkingbalance*-1);
            if overage>oldrow.savingbalance then signal sqlstate '70001'
            ('overdraft protection unsuccessful');
            else set newrow.savingbalance =
            oldrow.savingbalance-overage, newrow.checkingbalance = 0;
            end if;
            

让我们一句一句地仔细研究一下这段代码。在触发器主体中,可以声明将要在主体中使用的变量。我们使用下面这行代码来声明变量: decimal(7,2)declare overage decimal (7,2) ; 这样就定义了一个类型为 decimal(7,2) 名为 overage 的变量。

下一步我们将 overage 变量的值设置为 (newrow.checkingbalance*-1) ;

我们将使用该算式计算出我们想要从支票帐户取出的超额(overage)的数目。指定 newrow.checkingbalance 是因为我们需要分析支票帐户的余额在 update 操作发生后是多少。

set overage = (newrow.checkingbalance*-1);



如果违反了您在触发器中定义的业务规则,就可以使用 signal 语句来抛出一个错误条件信号。在我们的例子中,不允许有人拥有的支票帐户余额为负数。如果有人想要将支票帐户的余额列更新为一个负数,我们就可以试着看看在储蓄帐户中是否有足够多的钱来补偿这个负数。如果没有,那么就可以发出一条 sql 状态为 '70001' 的信息 "'overdraft protection unsuccessful"。

认识到包含 signal 语句的效果是很重要的。signal 语句回滚由触发语句(也就是我们的 update 语句)尝试的更改。signal 语句也将回滚在触发器内发生的更改。此外,假设我们是使用 java™ 应用程序来与数据库进行交互的,并且试图执行一次会触发我们的触发器并违反业务规则的 update 操作。java 应用程序将接受我们所指定的 sqlstate 以及值为 -438 的 sqlcode。在这行中我们使用 signal sqlstate 属性:

if overage>oldrow.savingbalance then signal sqlstate '70001'
            ('overdraft protection unsuccessful');
            

该行说明,如果我们的 overage 比储蓄帐户的余额数目还要大,那么就需要抛出一个危险信号。



如果储蓄帐户的余额数目足够补偿超出的数目,这时就会发生转帐。如果满足这种条件,我们将对新行作两处修改:

  1. 修改 "new row" 的 savingbalance 列,将其减去 overage 以促成透支转帐。
  2. 将支票帐户的余额设置为 0。我们使用下面的代码来完成:

            else set newrow.savingbalance = oldrow.savingbalance-overage,
            newrow.checkingbalance = 0; end if;
            



可以再次通过 show sql按钮来看看最后的结果:



在点击 close之后,您将看到 overdraft 触发器已经创建好了:





可以通过一个 update 语句来进行测试。打开命令行编写下面的语句:

db2=> update accttable set checkingbalance = -500 where ssn='111-11-1111'
            

根据我们创建的业务逻辑,这个 update 操作将启动该触发器,由于支票帐户透支,该触发器将从 savingbalance 列取出 500.00 到支票帐户。因此,ssn 为 111-11-1111 的帐户的 checkingbalance 会变成 0.00 而 savingbalance 将变成 1000.00(原来的余额 1500 - 透支的 500)。下面的查询验证了该结果:





您已经在一个假想的业务场景中创建了一个 触发器。触发器是 数据库的一个非常强大的特性,您可以使用它将业务逻辑分化到关系数据库这边。如果考虑到有多个应用程序都将与同一个数据库进行交互,您就会发现这种分化是非常强大的。在一个大型企业中,您可能多次遇到过这样的情况,即不知道要创建的是怎样一个将与数据库交互的应用程序。与其只是希望这些应用程序遵守被认为是您的组织机构的戒律的业务规则,还不如使用触发器作为您工具箱中的一种工具,以确保现在和将来与数据库进行交互的所有的应用程序强制遵守这些业务规则。一个触发器只能关联一个表,而不能关联一个视图。您也许可以考虑使用 instead of 触发器来与视图交互。




芦苇 2007-07-24 15:47
]]>
q 复制和 consistent change data 表http://www.blogjava.net/i369/articles/131319.html芦苇芦苇thu, 19 jul 2007 09:31:00 gmthttp://www.blogjava.net/i369/articles/131319.htmlhttp://www.blogjava.net/i369/comments/131319.htmlhttp://www.blogjava.net/i369/articles/131319.html#feedback0http://www.blogjava.net/i369/comments/commentrss/131319.htmlhttp://www.blogjava.net/i369/services/trackbacks/131319.html

扩展您的架构

文档选项

未显示需要 javascript 的文档选项



级别: 中级

(), americas techworks sme, ibm

2006 年 7 月 10 日

即将发布的 q replication 将支持一种新的目标表,即 consistent change data (ccd) 表。探索 q replication 用户之所以需要这些表的原因,并考虑在使用 ccd 表作为目标的情况下,可能出现的一些新的复制架构。学习如何定义和使用 ccd 表,这需要对 q replication 的安装和配置有基本的了解。另外,还看看在使用 ccd 表作为目标的情况下有哪些限制。

consistent change data (ccd) 表一直是 sql replication 中一种流行的目标表。通过支持 ccd 表作为另一种目标选项,对于熟悉 q replication 的人来说,他们就可以利用这种新功能了。这时您可能要问,“为什么我应该在我的复制架构中考虑 ccd 表?” ccd 表通过关联的跟踪机制暴露数据,以便准确地描绘源表的事务历史。换句话说,ccd 允许重现源表的历史。让我们看看用到 ccd 的三个例子。







历史表 —— 在任何系统中,都会有一些关键的表需要能够恢复或重建。通过将关键的源表复制到一个 ccd 目标表,就可以逐个事务地从头开始重建这个表。更棒的是,如果表中输入了坏的数据,ccd 记录还允许您查看哪些行受到影响,让您很容易改变主意,或者正确地更新所需的值。

扇出场景登台(fan out scenario staging)表 —— 传统上,ccd 目标表用于帮助创建扇出架构,将一个源复制到多个目标。这意味着之前 sql replication 不能接受的一些高吞吐量的工作负载现在可以被复制到多个目标了。

不受支持的数据库登台表 —— 对于将数据放到 q replication 受支持的结构之外的数据库中这一任务而言,ccd 目标表也是一种理想的方法。有了最新的修复包(用于 oracle 和 sybase 的修复包版本为 9;用于 microsoft sql server 和 informix 的修复包版本为 10),db2® 之外的数据库可以作为 q replication 的目标数据库,不过仍然有很多目标数据库不可用。虽然 ccd 目标表不能自动将数据复制到不受支持的目标数据库中,但是它通过用户应用程序暴露数据。所以,只需简单地从 ibmsnap_operation 列选择数据到一个动作变量,然后结合对源列的值的选择,使用一个用于 insert、update 和 delete 的 case 语句,便可以将事务复制到任何您想在其上编程的数据源。







接下来我们看看如何创建 ccd 目标表。本节假设您已经知道如何配置 q replication —— 因此着重讲解队列映射和队列订阅的创建。以前,当选择一种目标表类型时(如果使用 replication center's create queue subscription 向导的话,就在这个向导中的第 5 步),您有两个选择 —— 表或存储过程。现在您可以选择 ccd table,但是必须指定您想要哪种类型的 ccd。如果使用的是 asnclp,那么语法如下:



                        >>-create qsub-- ------------ -- ------------------------- ----->
                        '-subtype--u-'  '-using replqmap--mapname-'
                        ...
                        trg-clause
                        >-- ------------------------------- ---------------------------->
                        '-type-- -usertable----------- -'
                         -storedproc---------- 
                         -nickname------------ 
                        '-ccd--| ccd-clause |-'
                        ...
                        ccd-clause
                        |-- -------------------- -- ------------------- ---------------->
                        '-condensed-- -on-- -'  '-complete-- -on-- -'
                        '-off-'                '-off-'
                        

要创建一个 ccd,必须指定两个新属性 —— condensed(压缩的)和 complete(完整的)。 展示了这些属性如何影响目标表的创建:




complete 目标表创建好之后,其中填充有源表中的所有行。 目标表创建好之后为空。
condensed 目标表只包含行中最近被更改的值。 目标表包含所有行的所有历史值。

创建 ccd 目标表只要做这些就可以了。那么,有了 ccd 表之后,如何使用它呢?让我们将这些值与之前介绍的那些用法联系起来。



complete condensed 用法
这种配置将支持扇出到多个目标。
这是标准的历史表。每个源行和目标的记录使得表和事务可以被重建。还可以根据这种版本的 ccd 表创建新的用户拷贝。
这种版本的 ccd 表用于扇出场景的登台表,在该场景中,远程已经存在用户数据的一个拷贝。由于缺少源行,因此不能从这种类型的 ccd 表创建新的用户拷贝。
这种 ccd 表用于作为只需要访问被更改的数据的应用程序的登台表。








接下来我们看看 ccd 表与源表有什么不同。ccd 表与源表的不同在于多了几个附加的列:



列名 描述 数据类型
ibmsnap_intentseq 这是一个序号,惟一地标识一次更改。 char(10) for bit data
ibmsnap_operation 该列表明对一个记录的操作的类型:
i -- insert
u -- update
d -- delete
char(1)
ibmsnap_commitseq 这是一个序号,描述事务的提交顺序。 char(10) for bit data
ibmsnap_logmarker 这是数据被提交的时间。 timestamp


这些列附件在行的后面,因此该 ccd 表可用于创建其他拷贝,更新其他拷贝,或者使应用程序可以访问事务历史。如果启用了数据库审计功能,那么 ccd 表中还可能提供以下几列:



列名 描述 数据类型
ibmsnap_authid 与事务相关联的授权 id。这一列同时可用于 db2 for linux®、unix® 和 windows® 以及 z/os®。对于 z/os,这是主授权 id。 char(128)
ibmsnap_authtkn 与事务相关联的授权标志。这一列仅用于 db2 z/os,它是相关 id。对于 db2 linux、unix 和 windows,这一列的值为 null。 char(12)
ibmsnap_planid 与事务相关联的计划名称。这一列仅用于 db2 z/os。对于 db2 for linux、unix 和 windows,这一列的值为 null。 char(128)
ibmsnap_uowid 这个工作单元的日志记录中的工作单元标识符。这一列同时可用于 db2 for linux、unix 和 windows 以及 db2 z/os。 char(10)


如果手动创建 ccd 目标表,则语法应该像下面这个例子一样。注意, 的数据类型应该与源表中相应的列的数据类型一致。



                        create table ccd (
                        ibmsnap_intentseq char(10) for bit data not null,
                        ibmsnap_operation char(1) not null,
                        ibmsnap_commitseq char(10) for bit data not null,
                        ibmsnap_logmarker timestamp not null,
                        ibmsnap_authid char(128),
                        ibmsnap_authtkn char(12),
                        ibmsnap_planid char(128),
                        ibmsnap_uowid char(10) for bit data,
                        
                        );
                        







幸运的是,您只需清楚三个限制,另外再注意一点:

  1. ccd 目标表只在单向架构中有效。
  2. ccd 目标表不能是别名。
  3. ccd 表中必须有惟一性约束 —— 可以通过主键或者源表或 ccd 表上的惟一索引实现。

另外一个您可能失察的地方是 delete 的行为。如果您在使用一个压缩 ccd 表,那么在处理 delete 操作时,现有的行将被更新,而 ibmqrep_operation 列将被设为 ‘d’。如果这一行不存在,那么该行将被忽略,并且被记录到异常表中。对于非压缩 ccd 表,所有事务都生成新的行。delete 会生成一个新行,其中仍然使用当前各列的值,但是 ibmqrep_operation 列被设为 'd'。

 







关于这个话题就讲到这里了。希望本文提供的信息能帮助您利用扩展的架构,并将数据暴露给更多的用户。



学习
  • 您可以参考本文在 developerworks 全球网站上的 。

  • (developerworks):这里可以找到更多关于 q replcation 的参考资料,q replcation 是 websphere information integrator replication edition 和 websphere information integrator replication for z/os 中提供的功能。

  • “”(developerworks,2005 年 5 月):遵循逐步指南完成 websphere information integrator replication edition 中联邦功能的设置。

  • :扩展您在 websphere information integration 产品方面的技能。

  • :扩展您在所有 ibm information management 产品方面的技能。

  • 随时关注 。


芦苇 2007-07-19 17:31
]]>
如何用代理键实现 db2 udb 主键http://www.blogjava.net/i369/articles/131318.html芦苇芦苇thu, 19 jul 2007 09:29:00 gmthttp://www.blogjava.net/i369/articles/131318.htmlhttp://www.blogjava.net/i369/comments/131318.htmlhttp://www.blogjava.net/i369/articles/131318.html#feedback0http://www.blogjava.net/i369/comments/commentrss/131318.htmlhttp://www.blogjava.net/i369/services/trackbacks/131318.html
  >    >

blogjava-凯发k8网页登录

考察生成惟一序列数字的几种选择

文档选项

未显示需要 javascript 的文档选项



级别: 初级

(), 软件开发人员, ibm

2004 年 9 月 01 日

如何将代理键(surrogate key)用作 db2 udb 中的主键?代理键是生成惟一序列号的一种有效方法。从本文中可以了解三种实现:传统方法,使用键管理器,以及使用新的 db2 udb 特性。

使用代理键凯发天生赢家一触即发官网的解决方案是为了发现一种生成惟一序列号的有效方法。本文描述了三种实现:

  • 使用传统方法。
  • 使用键管理器。
  • 使用 db2 udb 特性。

代理键也叫 内键(internal key)。当创建一个表时,可以添加一个额外的列作为代理键。这个列应该是 not null,并且没有商业意义。可以将该代理列指定为主键列。例如可以有一个数字代理列。代理键的值从某一个数字开始,例如 "1",以这个数字作为该列在表中第一行的值,之后的每一行中该列的值都按 1 递增。

例如,如果我们有表 employee:

create table employee (	firstname		char(64),
                        lastname		char(64),
                        salary 			decimal(10, 2))
                        

那么可以添加一个代理键列 serialnumber,并将其指定为主键列。这样,这个表的定义就变为:

create table employee (	serialnumber	bigint not null,
                        firstname	char(64),
                        lastname	char(64),
                        salary 		decimal(10, 2),
                        primary key (serialnumber))
                        

那么,怎样将惟一的值赋给每一行的 serialnumber 列呢?首先需要为代理键生成惟一的值。下面我将讨论三种可行的凯发天生赢家一触即发官网的解决方案。







传统方法是使用简单的 sql 或触发器生成惟一的值。

以表 employee 为例。您可以在 insert 语句中实现代理键生成函数:

insert into employee (serialnumber, firstname, lastname,
                        salary) values ((select max(serialnumber) from employee) 1,
                        ‘john’, ‘smith’, 999.99)
                        

sql 语句 " (select max(serialnumber) from employee) 1 " 将找出最大的 serialnumber 并将其加 1,这样新行就有一个惟一的 serialnumber。

这样做存在的一个问题是,当将第一行插入表中时,可能会得到如下错误:

sql0407n  assignment of a null value to a not null.
                        sqlstate=23502.
                        

得到上述错误的原因是,当表为空时," select max(serialnumber) from employee " 的返回为 null。因此,我们必须使用 coalesce() 来处理这个问题:

insert into employee (serialnumber, firstname, lastname,
                        salary) values (coalesce((select max(serialnumber)
                        from employee), 0) 1, ‘john’, ‘smith’, 999.99)
                        

另一种传统方法是使用触发器来生成代理键:

create trigger autosurrogatekey no cascade
                        before insert on employee
                        referencing new as n
                        for each row
                        mode db2sql begin atomic
                        set n.serialnumber = coalesce((select max(serialnumber)
                        from employee), 0) 1;
                        end
                        

传统方法易于理解,而且容易在所有系统上实现。但是,这种实现实际上会导致事务处理系统中出现并发问题。因为该实现只允许一次执行一条 insert 操作。

因此,在获得最大的 serialnumber 之前," select max(serialnumber) from employee " 必须等待其他所有事务完成对表 employee 的 insert 或 update 操作。例如,如果有两个事务正在对 employee 表进行 insert 操作,那么其中有一个事务会被另一个事务阻塞。显然,这种“逐次插入”的凯发天生赢家一触即发官网的解决方案不适合多用户的事务处理系统。







很多大型的应用程序使用键管理器方法维护所有表的代理键。键管理器可以是一个助手类。每当需要向表插入一个行时,便可以调用键管理器生成新的键值,然后将获得的键值插入新行。

首先,需要创建表 keys 来记录每个表的当前代理键值。键管理器类将使用该表生成新键值。

create table keys (	tablename		char(256),
                        colnumname		char(256),
                        surrogatekeyvalue	bigint,
                        increment		bigint,
                        primary key(tablename, colnumname));
                        

第二,将新表(例如表 employee)注册到表 keys 中。

insert into keys (tablename, columnname, surrogatekeyvalue,
                        increment) values (‘employee’, ‘serialnumber’, 0, 1);
                        

第三,编写 keymanger 类来维护每个已注册表的代理键。keymanager 将提供两个方法:

/**
                        *intialize the keymanger
                        */
                        keymanager.singleton();
                        /**
                        *return the unique surrogate key value according to the input table
                        *name and column name.
                        */
                        keymanager. getsurrogatekey(string tablename, string columnname);
                        

要查看更详细的 keymanger 的代码,请参考附录。

第四,调用 keymanger 来获得主键值:

…
                        keymanager km = keymanager.singleton();
                        long surrogatekey = km.getsurrogatekey("employee", "serialnumber");
                        …
                        

显然,键管理器是模块化设计的一个很好的例子。键管理器封装了代理键生成函数。这种实现也易于定制。您可以在 keys 表中为 surrogatekeyvalue 或 increment 指定不同的值,以得到不同的代理键。而且,这种实现可以在大多数数据库系统上实施。但是,为了进行维护,需要一个单独的表和编写代码。所以,这种方法更适合于大型的跨数据库系统。







db2 udb 提供了三种方法来生成惟一值。您可以使用这些方法来实现代理键。

  • db2 udb version 6.1 中的 generate_unique() sql 函数。
  • db2 udb version 7.2 中 create table 语句的 identity 选项。
  • db2 udb version 7.2 中的 sequence 对象。

凯发天生赢家一触即发官网的解决方案的思想

generate_unique() 最初是在 db2 udb version 6.1 中提供的一个 sql 函数。该函数返回当前系统时间戳。我们可以使用该函数为代理键列生成惟一值。

示例

create table employee (	serialnumber	char(13) for bit
                        data not null,
                        firstname		char(64),
                        lastname		char(64),
                        salary 			decimal(10, 2),
                        primary key (serialnumber))
                        

然后可以用下面的 sql 语句插入一行:

insert into employee (serialnumber, firstname, lastname,
                        salary) values(generate_unique(), ‘john’, ‘smith’, 999.99)
                        

优点和问题

这里需要清楚两件事情。

首先,当多个事务在同一时刻插入行时,generate_unique() 可能会返回相同的时间戳。在这种情况下,generate_unique() 不能为每个事务生成一个惟一的返回值,因而这种方法不适合有大量事务的系统。

第二,一旦系统时钟需要向后调整,那么 generate_unique() 将可能返回重复的值。

由于上述限制,我决不会在生产系统中使用 generate_unique()。但是,当您需要在有限的时间内完成一个原型时,这也许是一种选择。

凯发天生赢家一触即发官网的解决方案的思想

identity 是 db2 udb version 7.1 和后期版本提供的 create table 语句中的一个选项。在创建表时,可以将某个列指定为 identity 列。对于每条 insert 语句,db2 将负责为其中的这一列生成一个惟一的值。

示例

create table employee (	serialnumber	bigint not null
                        generated always as identity
                        (start with 1, increment by 1),
                        firstname	char(64),
                        lastname	char(64),
                        salary 		decimal(10, 2),
                        primary key (serialnumber))
                        

然后可以用下面的语句插入一行:

insert into employee (firstname, lastname, salary) values
                        ( ‘john’, ‘smith’, 999.99)
                        

insert 语句不需要指定 serialnumber 列的值。db2 udb 将根据列的定义自动生成惟一值,即 "generated always as identity (start with 1, increment by 1)"。

优点和问题

identity 函数在大多数情况下是代理键函数的一个好的凯发天生赢家一触即发官网的解决方案。db2 import 和 export 实用程序也支持 identity 选项。

然而,在某种情况下,这种凯发天生赢家一触即发官网的解决方案不大方便。在运行 insert 语句之后,应用程序将永远都不知道放入了主键列中的是什么值。如果应用程序必须继续向子表插入一个行,那么它就不得不对父表运行一条 select 语句,以得到主键值。不过,如果这一点对于您的系统不成问题的话,那么使用 identity 选项是一个好主意。

凯发天生赢家一触即发官网的解决方案的思想

sequence 对象是在 db2 udb version 7.2 中引入的一个特性。用户可以在数据库中创建一个 sequence 对象,就像创建表对象或视图对象一样,然后从 sequence 中请求值。db2 保证用户每次可以得到一个惟一的序列值。

示例

您可以在数据库中创建一个 sequence 对象:

create sequence empserial
                        as bigint
                        start with 1
                        increment by 1
                        

如果有一个如下所示的 employee 表:

create table employee (	serialnumber	bigint not null,
                        firstname		char(64),
                        lastname		char(64),
                        salary 		decimal(10, 2),
                        primary key (serialnumber))
                        

那么可以用下面的语句插入一个行:

insert into employee ( serialnumber, firstname, lastname,
                        salary) values(nextval for empserial, 'john', 'smith', 99.99)
                        

在这里使用 " nextval for empserial " 从 sequence 中获得惟一值。

您可以使用 " prevval for empserial " 获得当前连接会话中最近生成的序列值。应用程序就可以知道放入主键列中的是什么值,从而继续向子表插入一个行。这里,“在当前连接会话中”这一点很重要,这意味着 "prevval" 将只返回在相同连接会话中生成的值。

例如,考虑这样的情况:有两个应用程序连接到数据库,并按照如下顺序运行下面的 sql 语句。

(假设 sequence " empserial " 的当前值是 3)。

应用程序 1:

insert into employee ( serialnumber, firstname, lastname,
                        salary) values(nextval for empserial, 'martin', 'wong', 1000.00)

从 empserial 生成的 " nextval " 是 4。

应用程序 2:

insert into employee ( serialnumber, firstname, lastname,
                        salary) values(nextval for empserial, 'patrick', 'chan', 99.99)
                        

从 empserial 生成的 " nextval " 是 5。

应用程序 1:

select prevval for empserial from employee
                        

" prevval " 将返回 4,而不是 5。

而且, prevvalnextval 的值不会受事务回滚的影响。

例如,假设 sequence " empserial " 的当前值是 30。某个应用程序开始了一个事务:

insert into employee ( serialnumber, firstname, lastname,
                        salary) values(nextval for empserial, 'william', 'chen', 99.99)
                        

执行 rollback 操作。

然后,如果运行:

select prevval for empserial from employee
                        

则 " prevval " 将返回 31,而不是 30。

优点和问题

sequence 是最近 db2 udb 为生成惟一值而实现的函数。它还有一个缓存函数,用于提高性能(要了解详细信息,请参阅 )。该函数比 identity 函数更灵活,因为它是数据库中的一个独立对象。必要时候,可以通过运行 alter sequence 语句更改其设置。

如果系统只在 db2 udb 上运行,那么 sequence 也许是最好的凯发天生赢家一触即发官网的解决方案,因为它易于使用,而且不像键管理器那样需要额外的代码,并且可以随需求的变化很轻易对其进行更改。







本文描述了实现作为主键的代理键的三种方法。文中主要讨论了如何为代理键生成惟一的序列值。

传统方法适合于简单的、单用户(非并发)系统。对于实现对于大型系统和跨平台系统,键管理器是一个好选择。但是,如果项目只在 db2 udb 上运行的话,可以考虑 db2 udb 提供的特性。identity 和 sequence 函数提供了一种容易的、灵活的凯发天生赢家一触即发官网的解决方案。

在创建 identity 列和 sequence 对象时,可以使用很多选择。请参阅 和 ,以获得完整的细节。







import java.sql.connection;
                        import java.sql.drivermanager;
                        import java.sql.preparedstatement;
                        import java.sql.resultset;
                        import java.sql.sqlexception;
                        public class keymanager {
                        private static keymanager	singleton;
                        private preparedstatement getkeystmt = null;
                        private preparedstatement updatekeystmt = null;
                        static final string db2driver = "com.ibm.db2.jdbc.app.db2driver";
                        static final string db2urlpfx = "jdbc:db2:";
                        public keymanager singleton() throws classnotfoundexception,
                        sqlexception{
                        if (singleton == null) {
                        if (singleton == null)
                        singleton = new keymanager();
                        }
                        return singleton;
                        }
                        private keymanager() throws classnotfoundexception, sqlexception{
                        class.forname(db2driver);
                        connection connection = drivermanager.getconnection(db2urlpfx  "dbname",
                        "username", "password");
                        getkeystmt = connection.preparestatement("select surrogatekeyvalue
                        from keys where tablename = ? and columnname = ?");
                        updatekeystmt = connection.preparestatement("update keys set
                        surrogatekeyvalue = surrogatekeyvalue   increment where
                        tablename = ? and columnname = ?");
                        }
                        public long getsurrogatekey(string tablename, string columnname)
                        throws sqlexception{
                        long keyvalue = null;
                        getkeystmt.setstring(1, tablename);
                        getkeystmt.setstring(2, columnname);
                        updatekeystmt.setstring(1, tablename);
                        updatekeystmt.setstring(2, columnname);
                        updatekeystmt.execute();
                        resultset rs = getkeystmt.executequery();
                        if (rs.next() == true) {
                        keyvalue = new long(rs.getlong(1));
                        }
                        return keyvalue;
                        }
                        }
                        



  • 您可以参阅本文在 developerworks 全球站点上的 .







芦苇 2007-07-19 17:29
]]>
利用 ibm tivoli directory server v5.2 实现 websphere application server v6.0.x 的全局安全性并保护 was 管理控制台http://www.blogjava.net/i369/articles/130750.html芦苇芦苇tue, 17 jul 2007 02:31:00 gmthttp://www.blogjava.net/i369/articles/130750.htmlhttp://www.blogjava.net/i369/comments/130750.htmlhttp://www.blogjava.net/i369/articles/130750.html#feedback0http://www.blogjava.net/i369/comments/commentrss/130750.htmlhttp://www.blogjava.net/i369/services/trackbacks/130750.html  websphere  > 利用 ibm tivoli directory server v5.2 实现 websphere application server v6.0.x 的全局安全性并保护 was 管理控制台 ...  

芦苇 2007-07-17 10:31
]]>
ibm tivoli directory integrator 服务器的命令行选项http://www.blogjava.net/i369/articles/118329.html芦苇芦苇fri, 18 may 2007 05:41:00 gmthttp://www.blogjava.net/i369/articles/118329.htmlhttp://www.blogjava.net/i369/comments/118329.htmlhttp://www.blogjava.net/i369/articles/118329.html#feedback0http://www.blogjava.net/i369/comments/commentrss/118329.htmlhttp://www.blogjava.net/i369/services/trackbacks/118329.html以下是用于 ibm tivoli directory integrator 服务器的命令行选项(ibmdisrv [options]):

示例:

ibmdisrv -c"c:\demos\rs.xml" -r"access2ldap" -l"c:\metamerge\mydemo.log"
注:
  1. 在选项字母和值之间没有空格。请使用引号来保留值中可能出现的空格或逗号。
  2. windows shell 执行程序最多允许以下列表中的 9 个参数。而在其它平台上没有任何限制。
-s
指定凯发天生赢家一触即发官网的解决方案所位于的工作目录。tdi 中以及您的“配置”等中的所有相对文件引用都将相对于这个位置。这必须是第一个指定的参数。
-c
配置文件。如果不指定此选项,将装入和启动 autostart 文件夹中的各项(除非指定了 -d 禁止装入和启动这些项)。通配符也允许,如 *.xml
-n
用来编写配置文件的编码。这必须是 java2 中有效的字符集标识;请参阅 iana 字符集注册表()以了解这些编码值的完整列表。请注意 java2 仅支持这些值的子集。
-r
要启动的组装流水线名称的列表。要启动组装流水线 ab,请使用命令 -r a b。也支持其它语法:-ra,b-ra -rb
注:
如果您使用 include 和名称空间,则组装流水线可以为 mynamespace:/assemblylines/alname (假定名称空间 mynamespace 和组装流水线名称 alname)。
-t
要启动的事件处理程序名称的列表。要启动事件处理程序 ab,请使用命令 -t a b。也支持其它语法:-ta,b-ta -tb
-t
启用 jlog 样式的跟踪,并将这些跟踪记录到 trace.log 文件,该文件位于 /tdi/logs/ 目录中。缺省是将跟踪记入内存(如果发生未处理的异常,可通过 jffdc 的 traceback 例程将跟踪从内存中检索出来)。
-d
用于禁用 autostart 文件夹中的事件处理程序和/或项目启动的标志。
-w
如果指定了 -r(或 -t),则此标志会使 ibm tivoli directory integrator 等待每个组装流水线的事件处理程序完成后再启动下一个。如果未指定此标志,则 ibm tivoli directory integrator 会并行地启动所有由 -r 参数指定的组装流水线。当最后一个组装流水线和显式启动的事件处理程序完成时,服务器停止。
注:
当服务器中没有活动线程时,该服务器停止。然而,我们发现对于 perl,perl 任务将作为活动线程计数。使用 -w 强制 ibm tivoli directory integrator 在最后一个组装流水线完成后停止。
-e
指定此选项将使服务器以安全方式运行。使用特定于该服务器的主密码,它将解密和加密所有的配置文件以及服务器 api 注册表。
-v
显示版本信息并退出。这仅记录在日志文件中。
-p
密码(如果配置文件加密的话)。
-p
在启动时转储 java 属性。请注意,您仍必须提供一个配置文件,在 java 属性转储之前将读取该文件。
-m
启动管理和监视器控制台(amc)服务器。同时启动 mobj 接口。请参阅 中的“administration and monitor console”获取更多有关 amc 的信息。
-m
禁用 mobj(管理扩展)和 amc,而不考虑 global.properties 中的设置。
-d
在此机器上启动一个“守护程序”,即。服务器为每个指定的配置启动一个线程,再加上一个额外线程。没有任何线程将终止。
-z
指示组装流水线在检查点表为空的情况下进行操作。所有在命令行上提供的 al 将清空它们的检查点表。
-q
接受一个参数,mode。mode=1 表示以记录方式运行,mode=2 表示以回放方式运行。
-l
日志文件(缺省控制台输出)。执行的操作很少,因为很少有消息转至控制台。要为大部分记录更改日志文件,请更改 log4j.properties。
-r
禁用远程 api,而不考虑 global.properties 中的设置。
-w
所有的“配置”在同一个线程中启动,但它们不终止,而是永远等待。
-s
此选项仅内部用于“配置编辑器”和“服务器”之间的通信;它用于在两者之间传递配置文件。请勿自行使用此选项。
-?
打印用法消息,简要显示所有选项。

当 ibm tivoli directory integrator 终止时,它会返回以下某个退出代码:

0
用户使用 -v 参数(显示信息并退出)启动了 ibm tivoli directory integrator
1
  • 无法打开日志文件(-l 参数)
  • 无法打开配置文件
  • 由管理请求停止
2
在自动运行后退出。当您通过指定 -w 启动 ibm tivoli directory integrator 时,ibm tivoli directory integrator 会运行由 -r 参数执行的组装流水线,然后退出。
注:
从“配置编辑器”中运行的组装流水线是以不同的方式启动的,它不会以状态 2 退出。
9
许可证已到期或无效(废弃不再使用)。


芦苇 2007-05-18 13:41
]]>
关于aix下xmanager、cde、ftp、telnet问题的小结http://www.blogjava.net/i369/articles/117611.html芦苇芦苇tue, 15 may 2007 07:08:00 gmthttp://www.blogjava.net/i369/articles/117611.htmlhttp://www.blogjava.net/i369/comments/117611.htmlhttp://www.blogjava.net/i369/articles/117611.html#feedback0http://www.blogjava.net/i369/comments/commentrss/117611.htmlhttp://www.blogjava.net/i369/services/trackbacks/117611.html
      1.如果cde无法启动,查看是否安装了cde,如没有将系统盘第一张插进光驱,simt 中有个install software bundle ,选择cde安装就行了,我看到ibm网站和一些资料都是告诉你安装哪些fileset,很麻烦的,此法安装很方便。
         如果装好了cde,有时却无法启动cde,就运行一下/etc/rc.dt

      2.如果xmanager无法登陆,请检查/etc/hosts文件,将ip与主机名设置正确,改完之后一定要重启系统!

      3.如果ping小机丢包,telnet很慢(丢包也能telnet,只不过要等很久),请检查你的ip 地址,还有路由,正确设置后ping 就不会丢包了,但telnet还会很慢,这时就检查/etc/resolv.conf,如果存在就把它删掉.
      
      4.如果不能ftp,将/etc/ftpusers清空或删掉,还不行?用农哥这招:rm /etc/resolv.conf,还搞不定?那我也没办法了。

如果哪位还有补充,请跟贴分享,如果有什么漏洞还请指出,谢谢!

芦苇 2007-05-15 15:08
]]>
aix cde不能启动的故障一般性解决方法http://www.blogjava.net/i369/articles/117606.html芦苇芦苇tue, 15 may 2007 06:59:00 gmthttp://www.blogjava.net/i369/articles/117606.htmlhttp://www.blogjava.net/i369/comments/117606.htmlhttp://www.blogjava.net/i369/articles/117606.html#feedback0http://www.blogjava.net/i369/comments/commentrss/117606.htmlhttp://www.blogjava.net/i369/services/trackbacks/117606.html

cde不能启动的故障一般性解决方法
document #: 1811114i23000

body:
cde不能启动的故障一般性解决方法

环境:aix all

问题描述:
用户经常会遇到cde桌面启动不了的情况,那么遇到这种情况应该如何解决呢?

解答:
1、检查是否从图形控制台上能看到login图形提示。如果可以看到,问题仅仅发生在输入用户名密码之后出现篮屏等等不能登陆的情况,那么检查:a>各个文件系统的空间有没有满的。有的话删除部分文件或者扩大文件系统。b>hostname 在/etc/hosts文件中是否和正在使用的ip地址有对应关系。如果有错误,请用hostname更改主机名或者修改/etc/hosts文件。
2、如果不能启动cde,并且连login的图形提示都无法看到。那么尝试以下步骤:a>执行/usr/dt/bin/dtconfig -kill b>执行ps-ef|grep dt查看是否有dtlogin进程,如果有,用kill -9 pid 杀死该进程 c>在图形主控台上执行 /etc/rc.dt 命令启动cde桌面,到login提示符。
3、如果上述操作不能成功,或者根本没有/usr/dt/bin/dtconfig 和/etc/rc.dt文件,那么请从光盘上安装所有以x11.*的文件集。安装的时候,请注意选择 overwrite same or newer versions? 为yes。(默认是no)在安装完之后执行第二步,不需要重启。  




本文地址:

芦苇 2007-05-15 14:59
]]>
用xmanager等终端软件无法连接aix的凯发天生赢家一触即发官网的解决方案http://www.blogjava.net/i369/articles/117607.html芦苇芦苇tue, 15 may 2007 06:59:00 gmthttp://www.blogjava.net/i369/articles/117607.htmlhttp://www.blogjava.net/i369/comments/117607.htmlhttp://www.blogjava.net/i369/articles/117607.html#feedback0http://www.blogjava.net/i369/comments/commentrss/117607.htmlhttp://www.blogjava.net/i369/services/trackbacks/117607.html显示错误:
xdmcp connection failed.try again?

解决方法:
aix上无须进行任何配置,但是必须有xdmcp协议。服务程序在监听xdmcp端口。cde的xdmcp服务器为
dtlogin,x window本身的xdmcp服务器为xdm,当然gnu也有一些其它的服务器。如果aix上安了cde,则只要启动cde即可。如果没有安装cde,需要启动xdm。

以下命令可以确认xdmcp服务器已经启动:
netstat -an|grep 177

检查输出,确认状态为listen。如果一切正常,就可以使用xmanager通过登录了。

安装完xmanager后,在xbrowser中new一个xdmcp,选择xdm query,在host输入框输入主机名或ip
地址,选apply,然后done,启动xmanager就会显示图形登录介面了。 



芦苇 2007-05-15 14:59
]]>
aix常用命令 http://www.blogjava.net/i369/articles/117605.html芦苇芦苇tue, 15 may 2007 06:55:00 gmthttp://www.blogjava.net/i369/articles/117605.htmlhttp://www.blogjava.net/i369/comments/117605.htmlhttp://www.blogjava.net/i369/articles/117605.html#feedback0http://www.blogjava.net/i369/comments/commentrss/117605.htmlhttp://www.blogjava.net/i369/services/trackbacks/117605.html


查看交换区信息:
lsps -a 显示交换区的分布信息
lsps -s 显示交换区的使用信息
slibclean 清除处理程序遗留的旧分页信息
smit mkps 建立交换区空间信息
swapon -a 启动所有的分页空间
/etc/swapspaces 存放分页空间表格信息
-------------------------------------------------
显示卷信息:
lsvg 显示卷的名称
lsvg -l rootvg 显示rootvg卷的详细信息

-------------------------------------------------
mount卷的方法:
varyonvg datavg 加载datavg卷
mount /dev/data1 加载datavg下的一个data1卷

裸设备类型:raw,jfs jfs可以转变成文件系统,而raw则不行
-------------------------------------------------

在裸设备上安装oracle系统:
修改裸设备的权限,如裸设备名为system01,安装数据库用户为oracle
chown oracle:dba /dev/system01
chown oracle:dba /dev/rsystem01
在使用文件时必须用rsystem01
-------------------------------------------------

smit快速路径名称:(smit:图形方式,smitty:字符方式)
dev 设备管理
diag 诊断
jfs 定期档案管理系统
lvm 逻辑卷册系统管理员管理
nfs nfs管理
sinstallp 软件安装及维护
spooler 列印队列管理
system 系统管理
tcpip tcp/ip管理
user 使用者管理
clstart,clstop:启动和停止cluster
lssrc -g cluser:查看cluser的状态
-------------------------------------------------

查看已安装的软件信息:
ls -af /usr/lpp (lpp:licensed program products)
查看安装媒体内容:
installp -q -d /dev/cdrom -l
-------------------------------------------------

启动时自动加载文件系统信息:
需要加载的信息存放在/etc/filesystems
mount -t nf 加载所有在/ect/filesystems中定义type=nfs的文件系统
显示已加载的文件系统及状态: df -v,mount
-------------------------------------------------

查看错误日志信息:
errpt -a
-------------------------------------------------

有关tcp/ip的命令
网路卡:
smit chgenet,chgtok,chgfddi,opschange,mktty:adptr架构快速路径
smit mkinet,ppp:slip与ppp快速路径
ifconfig:config界面
位址:
/etc/hosts 静态主机表
/etc/resolv.conf 位址解析的名称服务器
/etc/named.boot 名称服务器架构
/etc/named.ca 根名称服务器快取
/etc/named.data 位址列表
/etc/named.rev 反转指标列表
nslookup 查询名称服务器资讯
网络路由:
route 管理路由
netstat -rn 列出定义的路由
routed 路由(daekmin rip)
gated 路由(daekmin rip、egp、hello)
/etc/gateways 已知网关
/etc/networks 已知网路
服务:
/etc/services
/etc/inetd.conf
tcp/ip群组子系统:
/etc/rc.net
startsrc -g tcpip 启动全部的tcpip子系统
startsrc -s inetd 启动主要internet
除错:
iptrace 启动封包追踪
ipreport 追踪结果格式化输出
netstat 网络统计
ping 检查是否可以到达
查看hacmp,外部硬盘信息:
lscfg -v
lsdev -cc adapter
对等机器信息:
/etc/.rhosts
/etc/hosts.equiv
/etc/hosts
-------------------------------------------------

观察进程内存使用情况:
ps aux 观察参数%mem:内存使用百分比 rss:实际使用内存
vmstat free的单位为块,缺省值为4096bytst
-------------------------------------------------

创建raw设备时选择的类型:
raw_lv

自己总结的aix的命令,且都在小型机上通过!

登陆
cmd->telnet 10.122.149.1
修改密码
#passwd
关机
#shutdown
#shutdown –f
重启计算机
#shutdown –fr
进入目录
#cd app(目录名)
回退:
#cd ..
查看设备状态
#lsdev -cc disk查看磁盘是否可用
#lsdev -cc adapter查看适配器是否可用
#lsdev -cc tape 查看磁带是否可用
查看磁盘的基本属性
#lsattr -el hdisk5
从root用户修改为oracle用户
#chown oracle:dba aa.txt(文件名称/磁盘名称)
修改disk5磁盘的读写权限
#chmod 755 *hdisk5
删除磁盘
#rmdev –dl hdisk5
磁带备份
#cfgmgr –v 确认磁带机
#lsdev –cc tape 看磁带机是否可用
开始备份
#smitty mksysb
#选择可用磁带机回车(esc 4)选择
镜像
#smitty vg
#选择 mirror a volume group
#选择 rootvg
#hdisk1需要一段时间
#bosboot –ad hdisk1
#bootlist –m normal hdisk0 hdisk1 硬盘启动的顺序
hacmp 启动和停止
(1)、启动 hacmp
使用以下步骤启动 hacmp:
        以 root 用户 login aix
        使用 smitty cl_admin 进入 hacmp 管理界面
        选择 manage cluster services 菜单项,按 enter 键
选择 start cluster services 菜单项,按 enter 键
        按 enter 键启动 hacmp
(2)、停止 hacmp
使用以下步骤启动 hacmp:
        以 root 用户 login aix
        使用 smitty cl_admin 进入 hacmp 管理界面
        选择 manage cluster services 菜单项,按 enter 键
        选择 stop cluster services 菜单项,按 enter 键
        按 enter 键停止 hacmp
查看ip地址和子网掩码,端口号
#ifconfig -a
#netstat -i
#netstat -in
#uptime 运行天数
#ps –ep|grep ora 查看ora进程
#ps –ep|grep 查看所有的进程
#ps –ep|pg 按页显示进程
ftp命令
cmd下 ftp 10.122.149.1
#bin二进制模式下传送
#mput a.txt上传文件
#mget a.txt下载文件
#errpt 查看错误信息
#errpt >/tmp/errpt2007110.txt保存errpt为txt文件
#errclear 0 把errpt错误日志清0
#kill -9 pid 关掉进程
# cd oracle/app/crs/product/10.2/log/hdmis1/crsd
# ls
core.2006-12-20-21:55:28  core.2006-12-20-23:21:45  core.2006-12-21-01:16:46  crsd.l01
core.2006-12-20-22:12:57  core.2006-12-20-23:25:46  core.2006-12-21-01:52:35  crsd.log
core.2006-12-20-22:50:42  core.2006-12-20-23:30:20  core.2006-12-21-15:33:27
core.2006-12-20-23:17:50  core.2006-12-21-00:19:30  core.2007-01-08-15:39:35


 

aixibm公司开发的业界领先的优秀商务unix操作系统,在可靠性、可用性、开放性、扩展性、高性能、安全性等方面都非常突出,尤其是在internet的关键应用领域以及系统和硬件管理能力方面,其性能表现更为出色,受到了业界的普遍认可和广泛使用。以下是笔者几年来使用aix系统的一点心得,兹供使用该系统的其他读者参考。

 

1.如何禁止终端上的中断键(ctrl c)?

在很多应用系统中,系统管理员希望普通用户只运行自己的应用程序,不能进入系统的shell提示符下,但缺省情况下当用户在终端上按ctrl c键时就会退到系统提示符下。由于用户终端一般没有固定的端口号,为了禁止使用中断键,可采取下面办法:

1)如果使用ksh, 可在$home/.profile中第一行加入如下内容:

trap "echo 'abnormal operation'; exit" 123915

(2)如果使用csh(ksh亦可),可用如下命令:

%stty intr ^!

如果恢复正常情况,键入下列命令:

% stty intr ^c

 

2.如何在shell中不回显(echo)字符?

在实际应用中,一般当我们在键盘上键入口令时不希望将其显示在屏幕上,为此可采用下面的两种办法:

·使用stty 命令

stty -echo # do not display password

echo "enter password: \c"

read passwd #get the password

stty echo # restore standard configuration

·使用echo命令

设置保密属性:echo "\033[8m"

取消保密属性:echo "\033[m"

 

3.如何在某个目录及其所属子目录的所有文件中查找字符串?

在程序维护过程中,有时需要在某个目录及其所属子目录的所有文件中查找某一个字符串,为此可用下面两种方法(假设在*.cp文件中查找字符串"abc",结果放在文件out中):

1cat /dev/null > out

find ./ -name "*.cp" -exec grep "abc"{} >> out

2find ./ -name "*.cp" | xargs grep "abc" > out

推荐使用第二种方法,因其系统开销小、速度快。

 

4.如何对/etc/inittab文件中的一行进行注释?

我们都知道在shell中使用"#"作为注释符号,但在/etc/inittab中注释一行的方法是在第一个字符前插入字符""

 

5.如何转换dosaix两种格式的文本文件?

如欲转换dosaix两种格式的文本文件,有两种方法:

1)用ftp命令:设置ascii传输类型,在一台运行aix的机器和另外一台运行windows的机器之间互相传送,这里不再赘述。

2)使用aix2dosdos2aix命令

如将dos格式的文本文件转换为aix格式,可用命令ados2aix inputfile outfile,反之可用命令:aix2dos inputfile outfile,关于dos2aixaix2dos命令的详细用法可参阅"dos2aix -h ""aix2dos -h "。注意要使用这两个命令,必须首先安装文件集bos.pci

 

6.如何解决某一pv上的vgdaodm库不一致的问题?

在系统维护过程中,因为操作错误或其他特殊原因,有可能使某一pv上的lvcbvgda与其对应的odm库不一致,导致odm库紊乱,对pv的有关操作无法进行,这时可采用如下两个aix命令加以解决:

redefinevg -d hdisk_name vg_name

该命令以指定pv上的lvm信息重新定义给定vgodm库。

或:synclvodm -p -v vgname

该命令同步或重建给定vgodm库和lvm信息。

 

7.如何设置用户的文件大小限制?

aix系统中,用户使用系统资源是有一定限制的。如用户缺省可创建或扩展的最大文件为1g(参见/etc/security/limits: fsize = 2097151, fsize_hard=fsize 512-bytes blocks)。

如欲修改,可使用smit:

# smit chuser 选择用户,修改下面两项:

soft file size [4194302]

# (2g,可根据需要设定)

hard file size [4194302]

# (2g, 可根据需要设定)

用该用户身份登录,使用"ulimit -f ""ulimit -hf"可分别显示其fsizefsize_hard的大小。

 

8、如何按文件大小排序列出一个文件系统下的文件?

当监控某一文件系统的空间使用情况时,如果该文件系统剩余空间较少或已使用空间增长较快,则有必要排序列出该文件系统中所有大于某一给定字节数的文件,以便进一步维护管理。为此,可用如下命令:

# find [filesystem_name] -xdev -size [512-bytes bloks] -ls | sort -r -n -k7



芦苇 2007-05-15 14:55
]]>
ibm mqseries使用指南http://www.blogjava.net/i369/articles/114115.html芦苇芦苇fri, 27 apr 2007 08:14:00 gmthttp://www.blogjava.net/i369/articles/114115.htmlhttp://www.blogjava.net/i369/comments/114115.htmlhttp://www.blogjava.net/i369/articles/114115.html#feedback0http://www.blogjava.net/i369/comments/commentrss/114115.htmlhttp://www.blogjava.net/i369/services/trackbacks/114115.html阅读全文

芦苇 2007-04-27 16:14
]]>
ibm mq常用命令http://www.blogjava.net/i369/articles/114114.html芦苇芦苇fri, 27 apr 2007 08:12:00 gmthttp://www.blogjava.net/i369/articles/114114.htmlhttp://www.blogjava.net/i369/comments/114114.htmlhttp://www.blogjava.net/i369/articles/114114.html#feedback0http://www.blogjava.net/i369/comments/commentrss/114114.htmlhttp://www.blogjava.net/i369/services/trackbacks/114114.html创建队列管理器
crtmqm –q qmgrname
-q是指创建缺省的队列管理器
删除队列管理器
dltmqm qmgrname
启动队列管理器
strmqm qmgrname
如果是启动默认的队列管理器,可以不带其名字
停止队列管理器
endmqm qmgrname 受控停止
endmqm –i qmgrname 立即停止
endmqm –p qmgrname 强制停止
显示队列管理器
dspmq –m qmgrname
运行mqseries命令
runmqsc qmgrname
如果是默认队列管理器,可以不带其名字

往队列中放消息
amqsput qname qmgrname
如果队列是默认队列管理器中的队列,可以不带其队列管理器的名字
从队列中取出消息
amqsget qname qmgrname
如果队列是默认队列管理器中的队列,可以不带其队列管理器的名字
启动通道
runmqchl –c chlname –m qmgrname

启动侦听
runmqlsr –t type –p port –m qmgrname

停止侦听
endmqlsr -m qmgrname

mqseries命令
定义死信队列
define qlocal(qname) defpsist(yes) replace
设定队列管理器的死信队列
alter qmgr deadq(qname)
定义本地队列
define ql(qname) replace
定义别名队列
define qalias(qaliasname) targq(qname)
远程队列定义
define qremote(qrname)
rname(aaa) rqmname(qmgrname)
xmitq(qtname)
定义模型队列
define qmodel(qname) deftype(tempdyn)
定义本地传输队列
define qlocal(qtname) usage(xmitq) defpsist(yes)
initq(system.channel.initq)
process(processname) replace

创建进程定义
define process(proname)
descr(‘string’)
appltype(windowsnt)
applicid(’ runmqchl -c sdr_test -m qm_ test’)
其中appltype的值可以是:cics、unix、windows、windowsnt等

创建发送方通道
define channel(sdrname) chltype(sdr)
conname(‘100.100.100.215(1418)’) xmitq(qtname) replace
其中chltype可以是:sdr、svr、rcvr、rqstr、clntconn、svrconn、clussdr和clusrcvr。

创建接收方通道
define channel(sdr_ test) chltype(rcvr) replace

创建服务器连接通道
define channel(svrconnname) chltype(svrconn) replace

显示队列的所有属性
display queue(qname) [all]

显示队列的所选属性
display queue(qname) descr get put
display queue(qname)maxdepth curdepth

显示队列管理器的所有属性
display qmgr [all]

显示进程定义
display process(proname)

更改属性
alter qmgr descr(‘new description’)
alter qlocal(qname) put(disabled)
alter qalias(qname) targq(targqname)

删除队列
delete qlocal(qname)
delete qremote(qrname)

清除队列中的所有消息
clear qlocal(qname)

常用补充命令
显示队列管理器 dspmq
显示文件名 dspmqfls

启动本地队列管理器 strmqm
结束本地队列管理器 endmqm
启动通道启动进程 runmqchi/runmqchl


芦苇 2007-04-27 16:12
]]>
网站地图