9i中单个数据文件超过32G?

今天同事在review change的时候看到有个给表空间加数据文件的,发现加的数据文件竟然超过了32G,按照原来的思维,在9i中,非bigfile的单个数据文件单个大小不能超过32G。这个加32G数据文件的change是不是有误?查了一下原来的表空间情况,发现已经存在127.99G的数据文件了。该数据库不是9i,且该表空间下含多个数据文件。

我们先来看一下该表空间的信息:

明确看到datafile id为20的数据文件大小为127.99G。为什么会有这样的情况?难道9i可以有超过32G的单个数据文件?

答案是可以的。首先我们要明白这个32G是怎么来的。

在9i数据库中,默认的数据块是8k,在一个数据文件最多能容纳多少个数据块?
我们随便dump一个看看:

我们看到这里的rdba: 0x05000003,这是datafile中data block的地址,该值得取值范围从0x00000000到0xffffffff,,而转换成二进制后的前十位表示file id,后22位表示block id,也就是说,一个datafile中最多有1111111111111111111111(二进制)个数据块,即4194303个数据块。 也就是说,一个datafile最大的大小受到该值的约束。

当在9i的数据库中,默认block size为8k时,我们将0xffffffff转换成十进制即为4294967295:8k×4294967295=32G。(感谢指出 Sidney,这句话有误。) 在9i的数据库中,默认block size为8k时,我们将8k×4194303=32G,即最大32G。

那么对于刚刚系统中的那个数据文件,我们来看看。我们先dump出file header:

我们看到block size的大小为32k,那么32k每个block,乘以4294967295(感谢指出 Sidney,这句话有误。) 4194303个,即为128G了。即在我们这个系统中,这个该表空间的单个数据文件最大可到128G。

最后,我们来看看这个表空间的DDL,我们也会发现它指定了block size为32k:

所以,单个数据文件最大32G只是一个默认情况,知其然,知其所以然,才能更好的了解数据库。


======== END ========



如果觉得文章好,欢迎打赏:
pay

相关文章

8条评论

  1. 作为一个接触了运维了数据库这么多年的人,还写这样层次的文章,博主应该检讨一下

  2. 非常精辟的文章
    如果能顺带讲解一下为什么要把BLOCK SIZE设置成32K,或者设置成不同的BLOCK SIZE的影响就完美了

  3. re zs21cn: 设置大的block size的tablespace,主要用在数据仓库类型的数据库,因为在单块读取时,大的block size能减少IO消耗。如做insert操作,如果要插入512k的数据,每次读取一个块,
    如果tablespace block 8k,就要读取64次,即64个IO消耗,如果tablespace block 16k,就读取32次,即32个IO消耗。
    但是大的block size的tablespace也有缺点,会让比较多的数据集中在一个块上引起争用。这也就是为什么适合在数据仓库而不是OLTP的原因。

  4. hi 小何
    这篇文章的结论是对的,但是过程有误。

    首先这一句的计算
    当在9i的数据库中,默认block size为8k时,我们将0xffffffff转换成十进制即为4294967295:8k×4294967295=32G。

    正确的结果是
    sid@CS11GR2> select 8 * 1024 * 4294967295 / 1024 / 1024 / 1024 “GB” from dual;

    GB
    ———-
    32768

    这是32768GB,而不是32GB. 单个8K块的数据文件真的可以这么大吗?
    问题在于32位的RDBA并不是全部拿来表示block number,前面10位表示relative file number, 后面22为表示block number.
    RDBA is 32 bit length, the format is: {relative_file_number[10]} {block number[22]}.

    8K块数据文件大小上限32G,32K数据块大小上限128G是因为:

    sid@CS11GR2> select power(2,22) * 8 * 1024 / 1024 / 1024 / 1024 “8K_FILE_GB” from dual;

    8K_FILE_GB
    ———-
    32

    sid@CS11GR2> select power(2,22) * 32 * 1024 / 1024 / 1024 / 1024 “32K_FILE_GB” from dual;

    32K_FILE_GB
    ———-
    128

  5. re Sidney: 谢谢指出。你是对的。rdba是后后22位表示block number。后面的22位最大是1111111111111111111111,即4194303, 8k×4194303=32G。我会修改我的文章。非常高兴你指出我的错误。

发表评论

电子邮件地址不会被公开。 必填项已用*标注