ora-1144 与smallfile tablespace中datafile容量大小的限制

今天在创建表空间的时候遇到这个错误ora-1144

 

查看错误解释

$ oerr ora 1144
01144, 00000, "File size (%s blocks) exceeds maximum of %s blocks"
// *Cause:  Specified file size is larger than maximum allowable size value.
// *Action: Specify a smaller size.

 

Q:smallfile tablespace为什么会有datafile大小的限制?限制是多少呢?

结论:datafile上有最大block的限制,最大block的限制来源于存储block id的字段所用的位数。

 

以下是思考过程。

ORACLE表空间分为smallfile tablespace(oracle默认创建)和bigfile tablespace。

先从rowid开始。

z@test10g> select rowid from t where rownum<2  
  2  /  
 
ROWID  
------------------  
AAAXslAAEAAAAC0AAA 

ROWID显示的格式如下,总计18位:

数据对象编号     文件编号     块编号          行编号
AAAXsl                AAE             AAAAC0        AAA
6            +           3         +        6            +      3      =18

rowid是基于64位编码的18个字符显示(数据对象编号(6) +文件编号(3) +块编号(6)+ 行编号(3)=18位),

其中
A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)

共64(26+26+20+2=64)位

 

计算10进制的编码值,计算公式如下:
        d * (b ^ p)
其中:b就是基数,这里就是64,p就是从右到左,从0开始的位置数
如:上面文件号AAE,具体的10进制的编码值应该是:
4*(64^0)=4;
0*(64^1)=0;
0*(64^2)=0;
文件号就是0+0+4=4

 

验证一下:

z@test10g> SELECT U.tablespace_name, D.FILE_ID  
  2    FROM user_tables U, dba_data_files D  
  3   WHERE table_name = 'T' AND U.tablespace_name = D.tablespace_name  
  4  /  
 
TABLESPACE_NAME                   FILE_ID  
------------------------------ ----------  
USERS                                   4  
 

刚才提到的是rowid的显示方式:基于64位编码的18个字符显示,

其实rowid的存储方式是:

      10 个字节,即80位存储,

其中 数据对象编号需要32 位,相关文件编号需要10 位,块编号需要22,位行编号需要16 位,

 

由此,我们可以得出:
32bit的object number,每个数据库最多有4G个对象
10bit的file number,每个对象最多有1022个文件(2个文件预留)
22bit的block number,每个文件最多有4M个BLOCK(2^22=4M=4194304)
16bit的row number,每个BLOCK最多有64K个ROWS

 

 查看datafile的MAXBLOCKS  

 z@test10g> select MAXBLOCKS from dba_data_files  where file_id=4;  
 
 MAXBLOCKS  
----------  
   4194302  
 

 4194304-4194302=2,这里是要预留2个么?(查完后再补充回来)

 


所以,oracle smallfile tablespace数据文件大小受到BLOCK数量的限制,

数据块大小 数据文件最大总量(约等于) 计算
2KB 8GB 8G=2K*2^22
4KB 16GB 16G=4K*2^22
8KB 32GB 32G=8K*2^22
16KB 64GB 64G=16K*2^22
32KB 128GB 128G=32K*2^22

 

我这里使用的数据库采用8KB的block_size,则smallfile tablespace单个datafile容量限制约为为32GB。

检查创建tablespace的语句,发现datafile的SIZE 100M误写成SIZE 100G,于是就报了ora-1144 错误。以后操作要仔细!

 

遗留问题:

1.4194304-4194302=2,这里是要预留2个么?

2.对bigfile tablespace相关内容进行阅读和测试。

 

rowid部分参考 Oracle rowid urowid[精读]  作者:刘颖博 时间:2004-6-12 mail:liuyingbo@126.com

 

请指正~~

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23650854/viewspace-682657/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23650854/viewspace-682657/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值