平时经常要监测数据库中各表的情况,于是写了两个shell,用起来蛮方便。。。
一、检查数据库中所有的表的extents数并输出到文件中。输出的文件中,表是按extents数目大小倒序排列。
>cat check_extents.sh
[code:1:a96ccbdc4e]
today=date +%Y%m%d%H%M%S
dbaccess - <
1<eof> sql_tab_ext_${today}.txt
2database sysmaster;
3select dbsname,tabname,
4count(*) num_of_extents,
5sum( pe_size ) total_size
6from systabnames,sysptnext
7where partnum = pe_partnum
8group by 1, 2
9order by 3 desc,4 desc;
10EOF
11[/code:1:a96ccbdc4e]
12
13二、如发现表的extents过大,可采取下列步骤
140。dbschema 导出表结构
151。rename 原表名
162。以原结构新建表,但增大extents和next size
173。unload出原表数据
184。dbload 数据到新表
19
20例如发现表t_prox_pb_log的extents过大,可以这样:
210.dbschema -t t_prox_pb_log -d dbname -ss t_prox_pb_log.sql
221-4步可以写成pblog.sh如下:
23>cat pblog.sh
24(表结构用第0步生产的结构即可)
25[code:1:a96ccbdc4e]
26dbaccess << \-- 2>>pblog.err
27!
28database dbname;
29rename table t_prox_pb_log to t_pb_log_bak;
30
31create table t_prox_pb_log
32(
33oper_kind char(3) not null ,
34oper_detail char(6) not null ,
35trn_mode char(1) not null ,
36user_no1 char(20) not null ,
37cust_name char(40) not null ,
38trn_amt float,
39cert_no integer,
40cert_num integer,
41trn_code char(4),
42trn_date char(8),
43trn_time char(6),
44trn_bank char(4),
45oper_no char(4),
46seq_no smallint,
47trn_stat char(1),
48primary key (trn_date,trn_bank,oper_no,seq_no)
49) extent size 2048 next size 1024 lock mode row;
50revoke all on t_prox_pb_log from "public";
51
52create index i_prox_pb_log2 on t_prox_pb_log (user_no1);
53
54
55unload to "t_pb_log.txt" select * from t_pb_log_bak;
56!
57\--
58dbload -d dbname -c load_log -l dbload_errlog -n 1000 -k
59
60[/code:1:a96ccbdc4e]
61控制文件load_log如下:
62> cat load_log
63FILE t_pb_log.txt DELIMITER '|' 15;
64INSERT INTO t_prox_pb_log;</eof>