[20130520]统计那个对象生成的redo多.txt
http://timothyhopkins.net/2009/09/summarise-redo-by-object/
如果统计那个对象生成的redo多,一直是我比较头疼的问题.我以前遇到3次程序员编程错误,导致生成大量redo,要找到这些问题
可以通过awr,ash等报表,logminer来确定是那个对象执行问题,但是有时候定位问题并不是很好.
昨天找到以上链接,通过dump redo或者archivelog就可以知道那些对象生成的redo多.自己测试看看.
1.建立测试环境:
--确定跟踪文件以及当前使用那个redo sequence#=426.
2.建立测试:
--从结果可以看出使用redo sequence是426以及427,两个redo文件.(当前是428).
3.转储 redo文件:
--T1(object_id=274945)做的操作是delete操作,redo_size=29023956.
--T2(object_id=274946)做的操作是update操作,redo_size=31144940.
--T3(object_id=274947)做的操作是insert操作,redo_size= 8666276.
-- object_id=274948 是T1上的索引,可以发现产生的redo也不少.redo_size=16169668.
4.转储archivelog看看,应该结果也是一致的,另外产生的文件很大,我的测试
$ du -sm /u01/app/oracle11g/diag/rdbms/test/test/trace/test_ora_2878_local.trc
415 /u01/app/oracle11g/diag/rdbms/test/test/trace/test_ora_2878_local.trc
--415M.
--作者的链接使用管道文件,我也测试看看.这样不消耗磁盘空间.
5.采用别的方式认证看看:
--删除重新建立看看.
SQL> set autotrace traceonly ;
SQL> delete from t1;
45510392 redo size
-- 29023956 + 16169668=45193624 ,很接近.
SQL> update t2 set OBJECT_NAME=lower(OBJECT_NAME);
27756536 redo size
-- 31144940 有一些差距,不知道为什么?
SQL> insert into t3 select * from t2;
9011404 redo size
-- 8666276 还是有一些差距.
6.附上redo_summary.pl的脚本:
--BTW,好像不复杂,但是我没看懂,不知道得出的结果是否正确.^_^.
http://timothyhopkins.net/wp-content/uploads/2009/09/redo_summary.zip
$ cat redo_summary.pl
# TDH 2008-09-26
# Analyses a formatted redo dump and
# summarises redo bytes by object.
#
my $current_object;
my $current_bytes;
my %object_bytes = ();
sub DescendingNum {
$object_bytes{$b} $object_bytes{$a};
}
while () {
if (/LEN: 0x([a-f0-9A-F]+) VLD/) {
if (defined($current_object)) {
$object_bytes{$current_object} += $current_bytes;
}
elsif (defined($current_bytes)) {
$object_bytes{"NON-OBJECT REDO"} += $current_bytes;
$current_bytes = hex($1);
$current_object = undef;
}
elsif (/objn: (\d+) objd/) {
$current_object = $1;
printf "%20s %40s\n","OBJECT_ID","REDO_SIZE";
foreach my $key (sort DescendingNum(keys(%object_bytes))) {
printf "%20s %40s\n",$key,$object_bytes{$key};