根本原因是RAC多节点对共享存储元数据竞争及克隆路径未指定本地临时位置,导致NFS/GPFS上inode争用和缓存延迟,FILE_NAME_CONVERT未全覆盖则fallback至共享路径引发锁等待。
为什么 CREATE PLUGGABLE DATABASE 在 RAC 上卡住十几分钟?
根本原因往往不是数据库性能差,而是多节点对共享存储的元数据竞争 + 克隆路径未显式指定本地临时位置。rac 下 pdb 克隆默认走 cdb 的 db_create_file_dest(通常是 asm 或共享 nfs),但实际克隆过程会先在本地 tempfile 和 undo 段上做大量同步写入,若该路径落在共享文件系统(如 gpfs、nfsv3)且未关闭属性缓存或未启用 direct i/o,节点间 stat/inode 操作就会反复阻塞。
- 现象:SQL*Plus 执行
CREATE PLUGGABLE DATABASE ... FROM ... FILE_NAME_CONVERT=...后长时间无响应,v$session_longops显示“RMAN: clone datafile”卡在 0% 多达 15 分钟 - 关键线索:检查
v$asm_diskgroup或df -T,确认db_create_file_dest是否指向跨节点挂载的 NFS/GPFS;再查v$parameter中local_listener是否每个实例都指向本机地址(否则 RMAN channel 可能被调度到远端节点) - 实操建议:强制把克隆中间产物落到本地磁盘——加
STORAGE (ONLINE LOGFILE GROUP 1 ('/u01/oradata/local_redo01.log') SIZE 100M)并确保TEMPFILE路径明确指向本地/tmp或/u01/tmp
FILE_NAME_CONVERT 在 RAC 克隆中为什么必须显式配全?
RAC 不会自动按实例号补路径,FILE_NAME_CONVERT 缺少任意一对映射(比如漏了 temp 表空间或 undo 表空间的路径),克隆时就会 fallback 到共享路径并触发节点间锁争用,尤其在 ASM 中表现为 ASM file open 等待事件飙升。
- 常见错误:只写了
DATAFILE映射,没写TEMPFILE和UNDO对应项,导致 temp 文件仍创建在+DATA/CDB1/TEMPFILE这种全局 ASM diskgroup 下 - 正确写法示例:
FILE_NAME_CONVERT = ('+DATA/CDB1/DATAFILE/', '+DATA/PDB2/DATAFILE/', '+DATA/CDB1/TEMPFILE/', '+DATA/PDB2/TEMPFILE/', '+DATA/CDB1/ONLINELOG/', '+DATA/PDB2/ONLINELOG/') - 注意:如果使用 NFS,路径必须以相同挂载点开头(如都以
/nfs/oradata/开头),否则 Oracle 认为“无法转换”,直接报错ORA-65139: mismatched file names
如何快速判断是否是 NFS 缓存导致的克隆卡顿?
不是看挂载参数有没有 noac,而是看 strace -p 某个 ora_pmon 进程时,是否高频出现 stat("/nfs/oradata/...", {st_mode=S_IFDIR|0755, ...}) = 0 且耗时 >10ms —— 这说明 NFS 客户端在反复刷新目录属性,而 RAC 节点又在争抢同一 inode。
- 验证命令:
strace -e trace=stat,fstat,openat -p $(pgrep -f "ora_pmon_$ORACLE_SID") 2>&1 | grep -E "(oradata|pdb)" | head -20 - 临时缓解:在所有 RAC 节点执行
echo 0 > /proc/sys/fs/nfs/nfs_congestion_threshold(仅限测试环境) - 长期方案:改用 NFSv4.1+ 并启用
minor_version=1和hard,intr,rsize=1048576,wsize=1048576,acregmin=0,acregmax=0
克隆后 PDB 打不开,报 ORA-01157 或 ORA-01110 怎么办?
这不是文件真丢了,而是 RAC 各节点对新 PDB 的数据文件路径缓存不一致。节点 1 成功创建了文件,节点 2 的 controlfile 还没刷入最新路径,或 ASM alias 未同步完成。
- 先查:
SELECT con_id, name, status FROM v$pdbs WHERE name = 'PDB2';—— 若status是MOUNTED但OPEN_MODE是MOUNTED,说明控制文件已识别 PDB,但数据文件路径未就绪 - 强制刷新:在所有实例执行
ALTER SYSTEM CHECKPOINT;,再ALTER PLUGGABLE DATABASE pdb2 OPEN; - 终极手段:用
srvctl stop database -d CDB1全停,再srvctl start database -d CDB1,让所有实例从磁盘重新加载 controlfile
真正麻烦的是跨平台克隆(比如从单机 Linux 克隆到 AIX RAC)——此时 FILE_NAME_CONVERT 的路径分隔符、大小写敏感性、甚至 ASM diskgroup 名称长度限制都会在第二步 open 时才暴露,别等最后才发现。










