About
Value : 16K of 32K (* 1024)
This parameter in the init.ora is the most important. This can be done only during creation time. If you have already created the Database you cannot change this value. You will have to re-create the Database with a different size.
When you start to think about larger block sizes, remember that a 32KB undo block size can be a source of wasted I/O.
This block size is used for the SYSTEM tablespace and by default in other tablespaces.
The maximum value to which you can set the DB_BLOCK_SIZE is 16 KB on Linux x86. It is 32 KB on other platforms.
Articles Related
Metadata
Show
gerardnico@orcl>show parameter DB_BLOCK_SIZE NAME TYPE VALUE ------------------------------------ ----------- --------- db_block_size integer 8192
View
SELECT * FROM v$parameter WHERE name = lower('DB_BLOCK_SIZE');
=================================================================
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