我的机器是 RHEL 6.2,文件系统 BLOCK SIZE 是 1024。
# tune2fs -l /dev/sda1
...
Block size: 1024
...
Run Code Online (Sandbox Code Playgroud)
我的 Oracle 是 11g,数据库块大小是 8192。
SQL> show parameters db_block_size;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
Run Code Online (Sandbox Code Playgroud)
我创建了一个表空间,设置块大小为 16K。
CREATE BIGFILE TABLESPACE "C_IDX" DATAFILE '/u01/oradata/weixin/c_idx1.dbf'
SIZE 4096M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING EXTENT
MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO blocksize 16K;
Run Code Online (Sandbox Code Playgroud)
然后我收到错误ora-29339。
ORA-29339: tablespace block size 16384 does not match configured block sizes
Run Code Online (Sandbox Code Playgroud)
看来原因 DEFAULT 16K buffer cache是0。
SQL> select component, current_size from v$sga_dynamic_components;
COMPONENT CURRENT_SIZE
shared pool 402653184
large pool 16777216
java pool 16777216
streams pool 16777216
DEFAULT buffer cache 1308622848
KEEP buffer cache 0
RECYCLE buffer cache 0
DEFAULT 2K buffer cache 0
DEFAULT 4K buffer cache 0
DEFAULT 8K buffer cache 0
DEFAULT 16K buffer cache 0
DEFAULT 32K buffer cache 0
Shared IO Pool 0
ASM Buffer Cache 0
Run Code Online (Sandbox Code Playgroud)
现在的问题是我应该设置多大,或者根据我设置的值?
SQL> alter system set db_16k_cache_size= ?
Run Code Online (Sandbox Code Playgroud)
谢谢。
你的 db_block_size 是 8k,你的 db_16k_cache_size = 0。
通常我们不会构建具有多个块大小的数据库,因为优化器不会考虑不同的块大小。如果您仍然想这样做,请从以下内容开始
alter system set db_16k_cache_size = 16m;
Run Code Online (Sandbox Code Playgroud)
然后再试一次。它与文件系统块大小没有太大关系,但是将数据库存储块大小与存储块大小对齐是明智的做法。