Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91498735
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-04-03 20:38:28

时经常要监测数据库中各表的情况,于是写了两个shell,用起来蛮方便。。。

一、检查数据库中所有的表的extents数并输出到文件中。输出的文件中,表是按extents数目大小倒序排列。
>cat check_extents.sh
代码:

today=`date +%Y%m%d%H%M%S`
dbaccess - < sql_tab_ext_${today}.txt
database sysmaster;
select dbsname,tabname,
count(*) num_of_extents,
sum( pe_size ) total_size
from systabnames,sysptnext
where partnum = pe_partnum
group by 1, 2
order by 3 desc,4 desc;
EOF


二、如发现表的extents过大,可采取下列步骤
0。dbschema 导出表结构
1。rename 原表名
2。以原结构新建表,但增大extents和next size
3。unload出原表数据
4。dbload 数据到新表

例如发现表t_prox_pb_log的extents过大,可以这样:
0.dbschema -t t_prox_pb_log -d dbname -ss t_prox_pb_log.sql
1-4步可以写成pblog.sh如下:
>cat pblog.sh
(表结构用第0步生产的结构即可)
代码:

dbaccess  << -- 2>>pblog.err
!
database dbname;
rename table t_prox_pb_log to t_pb_log_bak;

create table t_prox_pb_log
  (
    oper_kind char(3) not null ,
    oper_detail char(6) not null ,
    trn_mode char(1) not null ,
    user_no1 char(20) not null ,
    cust_name char(40) not null ,
    trn_amt float,
    cert_no integer,
    cert_num integer,
    trn_code char(4),
    trn_date char(8),
    trn_time char(6),
    trn_bank char(4),
    oper_no char(4),
    seq_no smallint,
    trn_stat char(1),
    primary key (trn_date,trn_bank,oper_no,seq_no)
  ) extent size 2048 next size 1024 lock mode row;
revoke all on t_prox_pb_log from "public";

create index i_prox_pb_log2 on t_prox_pb_log (user_no1);


unload to "t_pb_log.txt" select * from t_pb_log_bak;
!
--
dbload -d dbname -c load_log -l dbload_errlog -n 1000  -k


控制文件load_log如下:
> cat load_log
FILE t_pb_log.txt DELIMITER '|' 15;
INSERT INTO t_prox_pb_log;

阅读(515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~