clone.pl 不能直接复制已运行的 Oracle Home,因 Oracle 官方禁止且脚本在校验阶段报错退出,必须先停止所有相关进程并确保环境一致性。
为什么 clone.pl 不能直接复制已运行的 Oracle Home
oracle 官方明确不支持对正在运行(尤其是数据库实例或监听器已启动)的 oracle home 执行 clone.pl。脚本会在校验阶段报错退出,典型错误是:error: oracle_home is in use 或 ora-27101: shared memory realm does not exist(因后台进程锁住了关键文件)。这不是权限问题,而是 oracle 自身保护机制——它依赖 inventory 和 orainst.loc 的一致性,而运行中目录的共享内存段、日志文件、监听套接字等状态会让克隆过程误判环境完整性。
实操建议:
- 必须先停掉该 Oracle Home 下所有进程:
lsnrctl stop、sqlplus / as sysdba中执行shutdown immediate、确认ps -ef | grep ora_无残留 - 检查
$ORACLE_HOME/network/admin/listener.ora和tnsnames.ora是否被其他 Home 共享——若软链指向外部路径,clone.pl可能跳过或报路径冲突 - 确保目标路径(
-targetOracleHome)为空目录,且属主与源 Home 一致(如oracle:oinstall),否则 clone 后权限异常会导致oraenv失效或sqlplus报libclntsh.so: cannot open shared object file
clone.pl 必须指定的三个核心参数
脚本本身不读取环境变量,所有路径和标识都靠命令行传入。漏掉任意一个,会卡在交互式提示或直接失败。
实操建议:
-
-sourceOracleHome:必须是**绝对路径**,且结尾不能带斜杠(/u01/app/oracle/product/19c/dbhome_1/❌ →/u01/app/oracle/product/19c/dbhome_1✅) -
-targetOracleHome:目标路径需提前mkdir -p并chown,但不能预先cp -r源目录——clone 会自己处理文件硬链接和权限继承 -
-javahome:即使源 Home 自带 JDK,也必须显式指定(如/u01/app/oracle/product/19c/dbhome_1/jdk),否则脚本可能 fallback 到系统默认 Java,导致后续runInstaller启动失败,报Unable to locate java
克隆后 root.sh 执行失败的常见原因
克隆完成只是静态文件复制,root.sh 负责写入系统级配置(如 /etc/oratab、内核参数检查、OCR 权限修复)。这里出错最常被忽略。
实操建议:
- 务必用
root用户执行:/u01/app/oracle/product/19c/dbhome_2/root.sh(注意是 target 路径下的脚本) - 如果提示
WARNING: directory '/u01/app/oracle/product/19c/dbhome_2' is not owned by root,不是警告,是致命错误——说明前面chown没做对,得重来 - 若目标主机已存在其他 Oracle Home,
root.sh可能修改/etc/oratab里旧条目,导致原实例无法自动启动;建议执行前备份该文件 - 集群环境(RAC)下,
clone.pl不处理 OCR 或 Voting Disk,必须手动用crsctl add resource注册新 Home 的数据库资源
为什么克隆完的数据库实例起不来
克隆脚本不重建控制文件、不复制数据文件,也不改 init.ora 或 spfile。它只保证软件层可用——所以你看到 sqlplus / as sysdba 能连上,但 startup 就报 ORA-01078: failure in processing system parameters 或找不到控制文件。
实操建议:
- 确认
$ORACLE_SID已设为目标实例名(不是源 SID),且$ORACLE_HOME指向新路径 - 检查
$ORACLE_HOME/dbs下是否有对应spfile<sid>.ora</sid>或init<sid>.ora</sid>;没有就从源实例create pfile from spfile导出,再手工拷贝并修改路径参数(如control_files、db_recovery_file_dest) - 如果用了 ASM,
clone.pl不处理磁盘组映射,必须确保新实例的asm_diskstring指向正确设备,且grid用户有访问权限
真正麻烦的是那些没写进文档的隐式依赖:比如源 Home 里打了个别补丁(opatch lsinventory 查到的),克隆后不会自动应用到 target;又比如 listener.ora 里写了硬编码 IP,克隆过去直接监听错端口。这些细节不逐项验证,部署就卡在“看起来成功了,其实根本用不了”。

















