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统计,但速度较慢.
对不起,这篇文章暂时关闭评论。