ORA-29339: 表空间块大小 16384 与配置的块大小不匹配

Ron*_*Ron 6 oracle

我的机器是 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)

谢谢。

ik_*_*elf 8

你的 db_block_size 是 8k,你的 db_16k_cache_size = 0。

通常我们不会构建具有多个块大小的数据库,因为优化器不会考虑不同的块大小。如果您仍然想这样做,请从以下内容开始

alter system set db_16k_cache_size = 16m;
Run Code Online (Sandbox Code Playgroud)

然后再试一次。它与文件系统块大小没有太大关系,但是将数据库存储块大小与存储块大小对齐是明智的做法。

  • Ron,优化器会做各种关于 IO 成本的计算。为此,块大小是一个被忽略的关键因素。如果可能,尽量坚持使用 1 块大小的数据库。 (2认同)