dba_extents和dba_segments不一致(转)

上一篇 / 下一篇  2008-04-17 14:17:35 / 个人分类:Oracle专题

在不少production系统上看到

select sum(bytes) from dba_extents where wner=:o_name and segment_name=:seg_name;
select sum(bytes) from dba_segments where wner=:o_name and segment_name=:seg_name;

出来的结果不一致,而且有些表差别很大。那么究竟哪一个是准确的?

Metalink上有篇文章 HOW TO DISCOVER AND FIX THE MISTMATCH BETWEEN DBA_SEGMENTS AND DBA_EXTENTS DICTIONARY VIEWS (note id:463101.1)提到这一问题。

解释中说dba_extents中的值是可以依赖的,而dba_segments中的值可能会不准确。一些DDL/DML操作会导致其不一致,例如parallel index creation, frequent deletes/inserts。相关的还提到两个bug:

Bug 5665912 BYTES, # OF EXTENTS IN DBA_SEGMENTS NOT MATCH WITH DBA_EXTENTS
Bug 4771672 DBA_SEGMENTS.BLOCKS WRONG AFTER PARALLEL CREATE INDEX

你可以通过下面的SQL来找出不一致的记录:

  1. select
  2. /*+ RULE */ s.tablespace_name,s.segment_namesegment,s.partition_name,
  3. s.owner owner,s.segment_type,
  4. s.blocks sblocks,e.blockseblocks,
  5. s.extents sextents,e.extentseextents,s.bytessbytes,e.bytesebytes
  6. from
  7. dba_segments s,
  8. (select count(*)extents,sum(blocks)blocks,sum(bytes)bytes,segment_name,
  9. partition_name,segment_type,owner 
  10. from dba_extents 
  11. group
  12. by segment_name,partition_name,segment_type,owner)e 
  13. where s.segment_name=e.segment_name 
  14. and s.owner=e.owner 
  15. and (s.partition_name=e.partition_nameors.partition_nameis
  16. null) 
  17. and s.segment_type=e.segment_type 
  18. and s.ownernotlike'SYS%' 
  19. and ((s.blocks<>e.blocks)or(s.extents<>e.extents)or(s.bytes<>e.bytes));

解决方法是运行procedure: TABLESPACE_FIX_SEGMENT_EXTBLKS

DBMS_SPACE_ADMIN.TABLESPACE_FIX_SEGMENT_EXTBLKS(’tablespace_name’);

Issuing DBMS_SPACE_ADMIN.TABLESPACE_FIX_SEGMENT_EXTBLKS fixes the DBA_SEGMENTS values. The tablespace
must be kept online and read/write when this procedure is called.Runing this procedure requires COMPATIBLE parameter to be set to 10.0.0.0 or greater.

The procedure fixes extents, blocks and bytes in the segment headers to synchronize seg$ and
segment header entries.
It holds the allocation enqueue for the tablespace till the command is completed and this may delay some sort of operations in this tablespace (new extent allocation, deallocate extent, etc.). So it needs to be run during an idle period.

对于application并没有什么影响,只是会影响一些依赖于dba_segments做监控的monitoring tool。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-09-08  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 304
  • 日志数: 10
  • 建立时间: 2008-01-02
  • 更新时间: 2008-06-18

RSS订阅

Open Toolbar