ORA-01144: File size (string blocks) exceeds maximum of string blocks

今天公司的ORACLE服务器突然停止工作

在一个裸设备上扩展一个表空间的时候遭遇了这个错误,想知道具体原因是什么。

SQL> alter database datafile 5 resize 33G;
alter database datafile 5 resize 33G
*
ERROR at line 1:
ORA-01144: File size (4325376 blocks) exceeds maximum of 4194303 blocks


AIX 64位的平台

下面是oracle err messages:

ORA-01144: File size (string blocks) exceeds maximum of string blocks
Cause: Specified file size is larger than maximum allowable size value.

Action: Specify a smaller size.

开始以为是操作系统的限制导致的,但是查了一下,没看到相关的限制(都已经-1了)

具体原因是什么呢?

这要从Oracle的伪列rowid说起,话说.....

先看看关于rowid一段文章就明白了:(关于什么是rowid请baidu)

rowid在磁盘上需要10 个字节(byte)的存储空间并使用18 个字符来显示它包含下列组件:数据对象编号,相关文件编号,块编号,行编号

rowid在磁盘上需要10 个字节(byte)的存储空间并使用18 个字符来显示它包含下列组件:

数据对象编号:每个数据对象如表或索引在创建时都分配有此编号,并且此编号在数据库中是唯一的;
相关文件编号:此编号对于一个表空间中的每个文件是唯一的;
块编号:表示包含此行的块在文件中的位置;
行编号:标识块头中行目录位置的位置;

在内部数据对象编号需要32位(bit),相关文件编号需要10位(bit),块编号需要22位(bit),位行编号需要16位,加起来总共是80位或10 个字节,ROWID 使用以64为基数的编码方案来显示该方案将6个位置用于数据对象,编号3个位置用于相关文件编号,6个位置用于块编号,3个位置用于行编号以64为基数的编码方案使用字符A-Z a-z 0-9 + 和/共64 个字符,如下例所示:
AAAB/R AAB AAAGmS AAA

由于block是22位(bit),

22bit就是一个22位二进制数,换算成十进制就是 2的22次方-1=4194303 也就是说,一个datafile最多容纳这么多个blocks


2K数据库的数据文件的size最大只能是8G
而依此类推8K数据块的一个数据文件的最大size只能是32G

解决方法为:1)创建一个类似的表空间

2)直接在原来的表空间增加表空间

 

----------------------------------------------------------------------------------------------------------------------------------------------------

 

在Oracle 10G及以上中,表空间有bigfile tablespace和smallfile tablespace的区别:
 
    bigfile tablespace是Oracle10g的新特性。Bigfile tablespaces包含1个最大4G个blocks 的datafile。因此,使用8KBdata blocks 的bigfile tablespace 最大可以达到32TB。
Bigfile tablespaces 常用于非常大的DB。 如果很大的DB有成千的 read/write datafiles, 那么checkpoints之类的操作将非常费时。如果用一个很大的datafile,减少datafiles的数量,将会提高效率。
创建时使用BIGFILE关键字如下:
CREATE BIGFILE TABLESPACE BIG_DEMO
DATAFILE '/ORADATA/PROD/BIG_DEMO.DBF' SIZE 25G;
 
    Smallfile tablespace是原Oracle tablespace datafile 选项的新名字。 smallfile tablespace中,你可以包含多个datafiles。每个datafile 有最多4M个data blocks。因此, 使用8KB data blocks的smallfile tablespace 中的datafiles 最大32GB。smallfile tablespace最多有1,023 个datafiles。SYSTEM和SYSAUX tablespaces总是smallfile tablespaces。
ORA-01144即表示你的单个数据文件超出了oracle的限制:
如:ORA-01144: File size (4194304 blocks) exceeds maximum of 4194303 blocks
表示你的表空间是Smallfile tablespace,单个数据文件最大只可以有2^22=4194303个blocks,换成KBytes时即乘上你数据库的block_size即可,解决方法是用多个数据文件,不是把单个数据文件设得很大.
-----------------------------------------------------------------------------------------------------------------------------

今天在solaris sparc10上安装单节点oracle10g,dbca报ora-01144,说数据文件大于限制,其实之前也奇怪为什么一个数据文件要150g。 后来发现原来是自己的理解错误,要求中并没有说只能用一个数据文件,但是metalink查到相关信息如下,以备参考:

fix:

FIX 1:

   Specify a smaller file size.

   The maximum file size is
       db_block_size * 4194303

   For example, if db_block_size is 2kB then maximum file size is limited
   to 2k*4194303, 8Gb-2k.

FIX 2:

   Change db_block_size.  This can only be done by recreating of
   database.
  
       db_block_size    Maximum data file size
       -------------    ----------------------  
            2kb                 8Gb-2kb
            4kb                16Gb-4kb
            8kb                32Gb-8kb
           16kb                64Gb-16kb
           32kb               128Gb-32kb

 

可见db_block_size对 maximum data file size还是起决定作用的

还有就是不能轻易的勾bigfile tablespace 这东西只允许表空间中存在一个数据文件~差点儿犯错误~ 呵呵~

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值