必须将lob列从basicfile迁移到securefile,并确保表空间为assm管理、db_securefile设为always或force,否则19c rac中lob性能无法释放。basicfile不支持并行i/o、无压缩加密、gc块争用严重;securefile采用chunk级锁、支持compress/deduplicate,显著降低跨节点同步压力与等待事件。
直接结论:必须将lob列从basicfile迁移到securefile,并确保表空间为assm管理、db_securefile设为always或force,否则19c rac中lob性能无法释放。
为什么BASICFILE在19c RAC中会成为性能瓶颈
BASICFILE是Oracle 10g时代的遗留架构,它不支持并行I/O优化、无内建压缩/加密、且在RAC环境下对全局缓存(GC)块争用严重。尤其当多个实例频繁UPDATE同一LOB列时,gc current block busy和gc cr block busy等待会飙升。SecureFiles则专为RAC设计:底层采用chunk-level locking而非segment-level,GC资源粒度更细;同时支持COMPRESS HIGH减少传输量,DEDUPLICATE降低跨节点重复数据同步压力。
常见错误现象包括:
- LOB字段
SELECT响应时间忽高忽低,AWR中lob read等待占比超15% - RAC集群中某节点CPU持续高于其他节点,
top显示大量ora_dbw*进程在刷LOB buffer - 导出导入后LOB访问变慢——因
expdp默认不保留SECUREFILE属性,还原成BASICFILE
迁移LOB到SECUREFILE的实操步骤与关键参数
不能直接ALTER TABLE ... MODIFY LOB切换类型,必须重建LOB段。推荐在线重定义(DBMS_REDEFINITION),避免业务中断:
- 确认源表满足重定义前提:
SELECT * FROM TABLE(DBMS_REDEFINITION.CAN_REDEF_TABLE('SCHEMA','TABLE_NAME'));,重点检查是否含NOT NULL约束或函数索引 - 新建临时表时显式指定SECUREFILE:
CREATE TABLE table_new (...) LOB (lob_col) STORE AS SECUREFILE (COMPRESS MEDIUM DEDUPLICATE ENCRYPT USING 'AES256'); - 执行重定义:
DBMS_REDEFINITION.START_REDEF_TABLE→SYNC_INTERIM_TABLE(多次同步减少锁时间)→FINISH_REDEF_TABLE - 迁移后验证:
SELECT segment_name, securefile FROM dba_lobs WHERE table_name = 'TABLE_NAME';,结果必须为YES
注意:COMPRESS级别影响CPU与I/O权衡——HIGH适合归档类LOB(如PDF),MEDIUM适合OLTP高频读写场景;ENCRYPT在RAC中需统一配置TDE wallet路径,否则节点间无法解密。
db_securefile参数必须设为ALWAYS或FORCE
19c默认仍是PERMITTED,这意味着只有显式写STORE AS SECUREFILE才生效,而RAC中很多工具(如Data Guard redo apply、GoldenGate)可能隐式创建BASICFILE。必须强制统一:
- 动态修改(立即生效但重启后失效):
ALTER SYSTEM SET db_securefile=FORCE; - 持久化修改(需重启):
ALTER SYSTEM SET db_securefile=ALWAYS SCOPE=SPFILE; - 验证是否生效:
SHOW PARAMETER db_securefile;,输出值必须为ALWAYS或FORCE,不能是PERMITTED
若设为NEVER或IGNORE,即使DDL写了SECUREFILE也会静默降级为BASICFILE,且dba_lobs.securefile仍显示YES——这是19c已知bug,必须通过SELECT segment_type FROM dba_segments WHERE segment_name = 'SYS_LOB...'查实际段类型确认。
RAC专属优化:ASM磁盘组与LOB chunk大小匹配
SecureFiles的I/O效率高度依赖底层存储对齐。在RAC中,ASM磁盘组的ALLOCATION UNIT(AU)大小必须≥LOB CHUNK大小,否则每次读写触发多次AU访问:
- 查看当前ASM AU大小:
SELECT name, allocation_unit_size FROM v$asm_diskgroup;,生产环境建议设为4MB - 创建LOB时指定
CHUNK:STORE AS SECUREFILE (CHUNK 32768 ...),32KB是19c RAC推荐值(4MB AU / 128 = 32KB) - 避免使用
ENABLE STORAGE IN ROW——RAC中行内存储LOB会加剧buffer busy waits,一律禁用 - 监控实际I/O对齐:
SELECT name, value FROM v$sysstat WHERE name LIKE '%lob%read%';,若lob reads远高于lob read bytes,说明chunk太小导致碎片化读取
最容易被忽略的是:SecureFiles的DEDUPLICATE在RAC中需所有节点共享同一DB_SECUREFILE_DEDUPE内存池,该池默认仅分配128MB。若LOB总量超TB级,必须手工扩大:ALTER SYSTEM SET "_securefile_dedup_cache_size"=1073741824 SCOPE=SPFILE;(1GB),否则dedupe失效退化为纯BASICFILE行为。











