首页/文章列表/文章详情

ORA-01658创建表或索引报错分析

编程知识1872024-07-29评论

一、报错信息

某项目最近在 SQL Loader 导数据时偶尔会报错,类似如下:

SQL loader ORA-01658 unable to creale INITIAL extent for segment in tablespace ADS5GP2P_1

这个报错的意思是,没有足够的连续空间为表或索引创建 INITIAL extent:

[oracle@node1:1 ~]$ oerr ora 165801658, 00000,"unable to create INITIAL extent for segment in tablespace %s"// *Cause: Failed to find sufficient contiguous space to allocate INITIAL// extent for segment being created.// *Action: Use ALTER TABLESPACE ADD DATAFILE to add additional space to the// tablespace or retry with a smaller value for INITIAL

二、报错分析

数据库版本是 Oracle 11G,实际查看该表空间仍有2T多的剩余空间,根据以往经验,最大的可能是这2T多的剩余空间大多是碎片,在业务忙时无法提供足够可用的连续空间,以下做验证。
DBA_FREE_SPACE describes the free extents in all tablespaces in the database.
数据字典 DBA_FREE_SPACE 描述了所有的可用 extent 情况:

select trunc(bytes/1048576) mb, count(*) from dba_free_space where tablespace_name = 'ADS5GP2P_1' group by trunc(bytes/1048576) order by 1; 02374933 161526 221622 313995 434797 55133 66851 73687 816463 92883101785111348125552137421466615615166029173261830019398202553219422622349248225412621279282629153012......

以上可见空闲的空间里有大量的碎片,可能的原因是频繁、长时间的修改、导入数据逐步导致的。这些碎片的大小达到了 2T,如下:

select tablespace_name, sum(bytes/1048576) mb from dba_free_space where trunc(bytes/1048576) < 1 group by tablespace_name;---ADS5GP2P_1: 2162858.375

结论是:
虽然空闲空间很多,但是这些空闲空间大都是小于 1M 的小碎片,这些小碎片加起来达到了2T,导致可能有时没法及时分配 INITIAL extent 给应用使用,从而报错。
以下进一步确认这些碎片的具体大小:

select trunc(bytes/65536) k64, count(*) from dba_free_space where tablespace_name = 'ADS5GP2P_1' group by trunc(bytes/65536) order by 1; 131756 28567 36803 410116 53230 61748 72027 82492 9111431049881111831218751321457144351215222891816125117151181521923020177

以上可见 15*65536=960k 的 extent 达到了 2228918,合计 2T 多。
可见这些小碎片大多是 960k 的小碎片,理论上对于大多数 64k 的 INITIAL extent 是可用、不会报错的。

三、解决方案

因此最终的解决方案是,修改报错表和索引的 INITIAL extent,让他们小于多数碎片的大小,即小于 960k。这个只能在业务闲时操作,确保操作的表不要引起其他问题,比如先备份表。

神弓

博客园

这个人很懒...

用户评论 (0)

发表评论

captcha