必须先配置db_16k_cache_size等非标准块缓存参数且值大于0,否则create tablespace会报ora-29339;块大小仅支持2k/4k/8k/16k/32k,且不能与db_block_size重复,设值会被自动向上取整至granule边界。

必须先配缓存,否则 CREATE TABLESPACE 直接报 ORA-29339
创建非标准块大小表空间前,db_nK_cache_size 参数必须已启用且值 > 0。Oracle 不会自动为你分配对应缓存——哪怕你只打算建一个 16K 表空间,也得提前执行 alter system set db_16k_cache_size = 32M scope=both;。常见错误是跳过这步,直接建表空间,结果立刻触发 ORA-29339: tablespace block size does not match configured cache。
注意:db_16k_cache_size 这类参数不能在 PDB 级别设置(19c+ CDB 架构下),必须在 CDB root 执行;而且设的值会被 Oracle 自动向上取整到 granule 边界(如 4MB × CPU 数),设 1M 实际可能变成 32M。
块大小只能选 2K/4K/8K/16K/32K,且不能和 DB_BLOCK_SIZE 重复
Oracle 只接受 2 的幂次方块大小:2048、4096、8192、16384、32768 字节(即 2K/4K/8K/16K/32K)。其他值如 3K、6K、64K 都会触发 ORA-00382: specified block size XXX is invalid。
关键限制:db_nK_cache_size 中的 n 不能等于当前 db_block_size 值。例如默认 db_block_size=8192,则 db_8k_cache_size 是非法参数,设了会报错或被忽略——它只用于非标准块。
- Windows 平台不支持 32K,仅限 2K/4K/8K/16K
- 块大小一旦写入数据文件,就不可更改;建错只能删文件重建
非标准块表空间的数据文件不能混用标准块对象
把一张表从 8K 表空间 MOVE 到 16K 表空间后,它的物理块数会减少约一半(同样数据量),但逻辑结构完全不变。不过反向操作有风险:如果某段(如索引)依赖标准块的区管理特性,硬塞进非标准块空间可能引发隐式转换异常。
更实际的问题是备份与恢复:RMAN 能识别不同块大小的文件,但某些第三方备份工具或旧版脚本可能假设全库统一块大小,导致校验失败或恢复中断。
生产中建议:只对明确受益的场景用非标准块,比如大 LOB 或宽列频繁全表扫描的表——不是“为了用而用”。
单个数据文件最大容量由块大小决定,超限会静默截断
Oracle 单个数据文件最多容纳 4194304 个数据块。所以最大文件大小 = 4194304 × blocksize。例如:
- 8K 块 → 最大 32G
- 16K 块 → 最大 64G
- 32K 块 → 最大 128G
如果你执行 create tablespace tbs32k datafile '/path/tbs32k.dbf' size 200G blocksize 32k;,Oracle 不会报错,而是默默把文件建为 128G —— 多余的 72G 被丢弃。这种静默行为容易在扩容时埋坑,务必提前算好。











