创建非标准块的表空间

在默认情况下创建的数据库块大小是由db_block_size参数决定的,一般默认是8k,即8192。db_block_size参数在建库时设置好后,就无法更改。这时候如果我们想要创建16k的表空间用来存放索引,那又该怎么办呢?

DB_BLOCK_SIZE参数

SQL> show parameter db_block_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192
SQL>

db_block_size是指定一个Oracle DB块的大小(字节)。此值是在创建数据库时设置的,此后不可更改。此值指定了数据库的标准块大小。所有表空间默认情况下将使用该大小。取值范围:2048到32768(与操作系统相关),即32位操作系统,最大为16k,64位系统最大为32k。默认值:8192 。

表空间的数据文件容量的大小是由db_block_size决定的。

smallfile tablespace的数据文件最大值为 4194304×DB_BLOCK_SIZE/1024M。
即:
4k最大数据文件为:16384M=16G
8K最大数据文件为:32768M=32G
16k最大数据文件为:65536M=64G
32K最大数据文件为:131072M=128G

DB_nK_CACHE_SIZE参数

Oracle是可以配置Multiple Block Sizes的

SQL> show parameter cache_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_size             big integer 0
db_16k_cache_size                    big integer 0
db_2k_cache_size                     big integer 0
db_32k_cache_size                    big integer 0
db_4k_cache_size                     big integer 0
db_8k_cache_size                     big integer 0
db_cache_size                        big integer 0
db_flash_cache_size                  big integer 0
db_keep_cache_size                   big integer 0
db_recycle_cache_size                big integer 0

如果要配置Multiple Block Sizes,就要配置db_nk_cache_size参数,这些参数默认值都是 0。

db_nk_cache_size参数指定nK的buffer,在指定cache时,要确保有足够的空间。而且不能和db_block_siez参数冲突,n的取值范围是2、4、8、16、32 。

实验:

我们这里以16k为例

1. 查看db_block_siez

SQL> show parameter db_block_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192

2. 查看系统位数

 [root@ocm ~]# cat /proc/cpuinfo | grep flags | grep 'lm' | wc -l
1

结果大于0,说明支持64位计算。

3. 查看db_16k_cache_size参数的默认值

SQL> show parameter db_16k_cache_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_16k_cache_size                    big integer 0

该参数默认值为0,表示未启用。

4. 创建数据库高速缓存区

SQL> alter system set db_16k_cache_size=1m scope=both;

系统已更改。

SQL> show parameter db_16k_cache_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_16k_cache_size                    big integer 4M

即使在这里指定1M了,但是系统还是使用了默认的最小值,取值的范围官方文档有说明:
Minimum: 0 (values greater than zero are automatically modified to be either the granule size * number of processor groups, or 4 MB * number of CPUs, whichever is greater)
Maximum: operating system-dependent

5. 创建16k的非标准块表空间

SQL> create tablespace TEST datafile '+DATA/ocm/datafile/test01.dbf' size 10M AUTOEXTEND on NEXT 10M MAXSIZE 100M blocksize 16k;

表空间已创建。

验证:如果创建未启用对应的Cache buffer会有什么结果,且创建和db_block_siez一样的值表空间。

SQL> create tablespace TEST04k datafile '+DATA/ocm/datafile/test021.dbf' size 10M AUTOEXTEND on NEXT 10M MAXSIZE 100M blocksize 4k;
create tablespace TEST04k datafile '+DATA/ocm/datafile/test021.dbf' size 10M AUTOEXTEND on NEXT 10M MAXSIZE 100M blocksize 4k
*
第 1 行出现错误:
ORA-29339: 表空间块大小 4096 与配置的块大小不匹配

SQL> create tablespace TEST01 datafile '+DATA/ocm/datafile/test011.dbf' size 10M AUTOEXTEND on NEXT 10M MAXSIZE 100M blocksize 8k;

表空间已创建。

在创建非db_block_size 标准的表空间时,必须先设置对应的DB_nK_CACHE_SIZE 参数来创建nK 的buffer,不然会报:

ORA-29339: tablespace block size 4096 does not matchconfigured block sizes

使用和db_block_siez一样值来创建表空间也是可以的,其实就等于是默认参数。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据