ORA-39006/ORA-39213错误源于RAC下Data Pump跨实例调度失败,\_CLUSTER=FALSE仅在单实例本地导出中绕过集群协调,需ALTER SESSION设置且不适用于expdp命令行;根本解决需确保directory路径全节点可写、使用绑定单实例的service或CLUSTER=N命令行参数。
导出时遇到 ORA-39006 / ORA-39213 错误,_CLUSTER=N 真的能解决?
不能直接解决。这两个错误本质是 data pump 在 rac 环境下尝试跨实例访问共享元数据或调度作业失败,而 _cluster=n 只是让当前会话不参与集群级作业协调,并不修复底层权限、服务名配置或实例状态问题。
它真正起作用的场景,是当你明确只在**单个节点上执行本地导出**(比如用 expdp 连接指定实例,且不依赖 DBMS_DATAPUMP 的集群作业调度),此时关闭集群感知可绕过部分内部协调逻辑。
- 必须显式连接到目标实例,例如:
expdp system/password@db1 INSTANCES=(db1),不能只连 service_name -
_CLUSTER=N是隐含参数,需在会话级设置:ALTER SESSION SET "_CLUSTER"=FALSE;(注意值是FALSE,不是N) - 该参数对
expdp命令行无效,只影响 PL/SQL 调用或已建立的 SQL*Plus 会话中的 Data Pump API 调用 - RAC 中若使用默认 service 启动 job,Data Pump 仍可能把 worker 分配到其他节点 —— 此时关
_CLUSTER没用,得改 service 的CLB_GOAL和GOAL
为什么 expdp 默认会在多节点写 dump 文件导致失败?
不是 Data Pump 主动“多节点写”,而是 RAC 的 service 配置 + Data Pump 的并行 worker 调度机制共同导致:dump 文件路径若挂载在本地文件系统(而非 ACFS/NFS),某个 worker 进程被调度到无该路径的节点,就会报 ORA-39070(无法打开日志文件)或 ORA-39087(目录不可访问)。
- 根本原因在于 directory 对象指向的路径未在所有节点上一致可写 —— 检查用:
SELECT directory_path FROM dba_directories WHERE directory_name = 'DATA_PUMP_DIR'; - 即使路径是共享的(如 ACFS),也要确认所有实例对该路径有读写权限,且
ORACLE_HOME下的extproc或外部表相关权限没被限制 - 使用
PARALLEL参数时,worker 数量 > 1 且未绑定实例,就极易触发跨节点调度;建议导出时加PARALLEL=1先验证基础路径是否通 - 别依赖
INSTANCES参数来“限定节点”—— 它只影响 metadata 读取范围,不约束 worker 进程落点
安全启用 _CLUSTER=FALSE 的前提和副作用
这个参数不是开关,是会话级行为标记,开启后当前会话发起的 Data Pump job 将放弃集群作业框架(DBMS_SCHEDULER 的集群 job),转为单实例调度。代价是失去高可用保护:如果该节点宕机,job 直接中断,无法 failover。
- 仅适用于短时、低风险、可重跑的导出任务(如开发环境小库迁移)
- 必须配合
ATTACH和日志检查使用,因为 job 不再自动注册到集群视图,DBA_DATAPUMP_JOBS可能查不到或状态不准 - 若数据库启用了
ENABLE_DDL_LOGGING或审计策略,_CLUSTER=FALSE下部分操作日志可能缺失上下文(如实例 ID、service name) - Oracle 19c+ 中该参数已被标记为 deprecated,某些 patch 后可能引发
ORA-00600内部错误,生产环境慎用
比改参数更靠谱的 RAC 导出方案
绕开 _CLUSTER 的本质,是让 Data Pump “物理上只能在一个节点干活”。这比调参稳定得多。
- 创建专用 service,绑定单一实例:
srvctl add service -d db -s dp_single -r "db1" -P BASIC,然后expdp ... SERVICE_NAME=dp_single - directory 必须指向所有节点都可写的共享存储,推荐 ACFS;若用 NFS,确保 mount 选项含
hard,intr,rsize=32768,wsize=32768 - 导出命令中显式指定实例:
expdp system/password@db1 DIRECTORY=DATA_PUMP_DIR DUMPFILE=full.dmp LOGFILE=exp.log CLUSTER=N—— 注意这里CLUSTER=N是 expdp 命令行参数(合法),不是隐含参数,它等价于禁用集群 job 创建 - 避免用
SYSTEM用户导出,改用具备EXP_FULL_DATABASE且被授予READonDATA_PUMP_DIR的专用账号,减少权限类报错干扰判断










