天天看点

[20130520]统计那个对象生成的redo多.txt

[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};

继续阅读