DBA教材的第一部分就讲到了一旦create database,db_block_size就是不可更改的。因为oracle是以块为单位存储数据的,任何一个存储元素最少占用一个块,如果你改变了db_block_size,必然导致部分块不能正常使用。 其实在unix类操作系统中,文件块和oracle块的关系非常紧密(建议相等),这样才能保证数据库的执行效率。在windows下可能就不这么讲究了。建议使用8k以上的块,我做过测试,同样的配置,8k的块比4k快大约40%,比2k快3倍以上(从hit_ratio来看)。
一般么人都是8k,通过 select value from v$parameter where name='db_block_size' 查看具体大小
假设你的事物将对磁盘单元写入32KB的数据,DB_BLOCK_SIZE参数就设为8KB。在这个例子中,Oracle必须执行四个I/O工作单元(32KB/8KB=4)来完成这一操作。
=======================
很不幸,你遇到了一个很难碰到的问题。很不幸,你现在一定心急火燎。能遇到这种错误的人绝不是一般人。那么你一定不是一个凡人,you are special。 呵呵,不和你开玩笑了。现在就分析这个问题的原因。 oracle支持的文件大小和他的db_block_size和db_block的数量决定的。在oracle 9i以前,oracle 的db_block的数量最大只能为2的22次方个,而我们通过oracle默认的模板建的数据库实例的db_block_size是8K。所以oracle 9i以前支持的单个文件的默认大小是32GB。虽然在oracle 11g没有这个限制,但是它默认的能力也是这么多。所以我在前面讲如果你遇到这个问题,说明你不是一般人,你在创建一个单个文件超过32GB的表空间。 那么怎么解决这个问题呢,我这里提供三个参考方案,你使用选择其中对你合适的,呵呵: 一)不要创建单个文件超过32GB的表空间 如果你创建的表空间超过32GB,请把这个表空间存储为多个数据文件,每个文件不大于32GB。这样,就可以成功的创建表空间。二)扩大db_block_size 根据oracle的算法,我们很容易想到这个解决方法。数目衡定,但是db_block_size可以更改(db_block_size的最大大小为32KB)。如果把db_block_size扩大到32KB(32位系统好像是16KB,我在Red Hat 企业版的操作系统创建32KB的block_size失败。),那么我们的系统就可以支持单个数据文件最大128GB。 这个方案听起来好像很迷人,但是实际上并不是那么回事。因为要修改db_block_size并不是很容易的事。因为这个db_block_size在创建实例的时候就要指定。而且不能通过简单修改参数来指定db_block_size。创建更大的db_block_size的数据库实例我会在以后讲。 三)创建bigfile表空间 在oracle11g中引进了bigfile表空间,他充分利用了64位CPU的寻址能力,使oracle可以管理的数据文件总量达到8EB。单个数据文件的大小达到128TB,即使默认8K的db_block_size也达到了32TB。 创建bigfile的表空间使用的sql语句也很简单。 create bigfile tablespace... 后面的语句和普通的语句完全一样。 需要注意的是使用bigfile表空间,他只能支持一个数据文件。也就是说这个文件的最大大小就是表空间最大大小,你不可能通过增加数据文件来扩大该表空间的大小。所以oracle说,如果你的这个文件没有剩余空间的话,你还是不要使用bigfile表空间了,这个表空间你没有扩展的余地了,呵呵。 oracle也同样告诉你了,建议你使用lvm或者别的软件管理磁盘,以使你的空间可以动态扩大。呵呵,先讲到这里,如果还有不明白的,请告诉我。
====================
如果db_block_size为8k(默认一般也是8k),则表空间文件(单个数据文件)大小最大为32G。但是也要看是什么文件系统是什么,虽然oracle表空间单个数据文件最大可以为32G,但是如果文件系统是FAT32,那么该文件系统本身所支持的单个文件最大为4G,所以,oracle单个表空间最大也就只能为4G。其他的文件系统如unix的貌似最大才能为2G。
|