首页 » ORACLE 9i-23c » Oracle 12c 在bigfile表空间可能dba_segment 显示不正确的大小

Oracle 12c 在bigfile表空间可能dba_segment 显示不正确的大小

在Oracle存储空间中,表空间的大小(dba_data_files size)几乎等于空闲空间的大小(dba_free_space size)加上段的大小(dba_segments size)。通常情况下,这两个值之间的差异是很小的,可能是由于一些header和bitmap block未计算在其中,但这些差异通常是很小的,以KB或MB为单位。然而,同事遇到了在一个bigfile表空间发现巨大的差异,达到了10TB以上。现在的问题是,这些空间去了哪里?

环境oracle 12c, TABLESAPCE A (bigfile) sum(dba_data_files.bytes)是31T,  TABLESAPCE A (bigfile) sum(dba_free_space.bytes)是0.6T(680G), 但是sum(dba_segments.bytes)为17T。 查询条件中都有增加tablespace_name,非SQL级错误。

dba_free_space size+dba_segments size≈dba_data_files size

现在缺少了近13T空间,首先,让我们来看一下可能导致这种差异的两个可能原因:1 dba_free_space少, 2 dba_segments size少。

dba_free_space少

因为表空间位图错误,在对象drop 后extent没有标记为free, 案例在JL 《Lost Space》文章记录过,可以使用dbms_space_admin 验证,如execute dbms_space_admin.assm_tablespace_verify (‘TEST_8K_ASSM’, dbms_space_admin.ts_verify_bitmaps)。

损坏较多,还可以使用dbms_space_admin.tablespace_rebuild_bitmap 重建位图,如果较少可以使用dbms_space_admin.tablespace_fix_bitmaps() 标记为free, 如下:该方法同样可用于因bug出现的两个segment的extent互相覆盖问题,需要drop不完整对象,手动标记为free。

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure tablespace_fix_bitmaps(
      tablespace_name         in    varchar2 ,
      dbarange_relative_file  in    positive ,
      dbarange_begin_block    in    positive ,
      dbarange_end_block      in    positive ,
      fix_option              in    positive
);
--
--  Marks the appropriate dba range (extent) as free/used in bitmap
--  Input arguments:
--   tablespace_name         - name of tablespace
--   dbarange_relative_file  - relative fileno of dba range (extent)
--   dbarange_begin_block    - block number of beginning of extent
--   dbarange_end_block      - block number (inclusive) of end of extent
--   fix_option              - TABLESPACE_EXTENT_MAKE_FREE or
--                      TABLESPACE_EXTENT_MAKE_USED

dba_segments size少

另一种可能是dba_segments统计的小,可以通过dba_extents统计大小,或用dba_extents+dba_free_space检查数据文件是否有未覆盖到的block , 可以使用DR Timothy S Hall的脚本ts_extent_map.sql, 这个案例从dba_extents统计大小后发现空间是对的,原比dba_segments的大,消失的10几TB空间都可以统计到,说明仅dba_segments显示错误, MOS中查找相关bug.

DBA_SEGMENT view shows zero bytes incorrectly for Partitions in BIGFILE tablespace (Doc ID 2773547.1)
Bug 23594093 – DBA_SEGMENTS FOR PARTITION SHOWS THOUGH IT HAS >100K RECORD

该bug仅影响在bigfile tablespace中的分区对象大小,显示为0.

解决方法

应用 patch 23594093补丁(18c后修复)或使用dba_extent代替dba_segments统计,但速度较慢.

 

打赏

, ,

对不起,这篇文章暂时关闭评论。