dg-setup-scripts在Windows上无法运行,因其专为Linux设计,依赖tar、ssh及内核参数等Windows不支持的特性,且路径分隔符、服务名解析、密码文件位置等均不兼容。
windows下用脚本配置oracle 19c data guard,不可跳过手动校验环节;官方dg-setup-scripts不支持windows,强行移植会因路径分隔符、服务名解析、密码文件权限等问题失败。
为什么dg-setup-scripts在Windows上跑不起来
Oracle官方提供的 dg-setup-scripts 是为Linux设计的,依赖 tar、ssh、net.core.rmem_max 等内核参数和shell工具。Windows没有原生 tar(PowerShell的 Compress-Archive 不兼容Oracle要求的格式),也没有 /etc/oratab 或标准 systemd 服务管理机制。
常见报错包括:
-
ORA-12154: TNS:could not resolve the connect identifier specified—— 脚本生成的tnsnames.ora用了正斜杠/路径,Windows监听器无法识别 -
ORA-12560: TNS:protocol adapter error—— 脚本尝试用sqlplus / as sysdba连接,但Windows未配置ORACLE_HOME和ORACLE_SID环境变量,或服务未注册 - 密码文件复制失败 —— 脚本默认拷贝
$ORACLE_HOME/dbs/orapw$ORACLE_SID,但Windows下密码文件实际位于%ORACLE_HOME%\database\PWD%ORACLE_SID%.ora
Windows下可落地的替代方案:RMAN DUPLICATE + 手动参数补全
不用脚本,改用Oracle原生命令链,反而更可控。关键不是“自动化”,而是“每一步可验证”。
必须提前完成以下动作:
- 主库和备库都已安装19c,且
ORACLE_HOME、ORACLE_SID已设为系统环境变量(非用户变量) - 主库已启用
ARCHIVELOG和FORCE LOGGING:SELECT log_mode, force_logging FROM v$database;返回ARCHIVELOG和YES - 主库和备库的
tnsnames.ora中,服务名必须用小写,且路径中全部使用反斜杠\,例如:SERVICE=orcldg对应(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.135.245.107)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcldg))) - 主库上运行
orapwd file=%ORACLE_HOME%\database\PWD%ORACLE_SID%.ora password=xxx entries=10,然后手动复制该文件到备库相同路径
最关键的三个参数必须手敲,不能靠脚本生成
脚本容易把 LOG_ARCHIVE_DEST_2 写成单向或角色混淆,导致MRP进程启动失败。Windows下必须逐条确认:
- 主库执行:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=orcldg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcldg'; - 备库执行:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=orcl LGWR ASYNC VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=orcl'; - 两边都执行:
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl,orcldg)';—— 注意大小写、括号、逗号,缺一不可
执行后立刻查:SELECT dest_id, status, error FROM v$archive_dest WHERE dest_id IN (1,2);。若 status 不是 VALID,或 error 非空,说明网络或TNS没通,别急着跑RMAN。
RMAN DUPLICATE时最容易被忽略的Windows细节
在备库主机上以 cmd 运行RMAN,不是PowerShell,且必须用 sys@orcl AS SYSDBA 连接主库(不是 /):
SET ORACLE_SID=orcldg RMAN TARGET sys@orcl AUXILIARY /
其中 AUXILIARY / 表示连接本地空实例(备库),TARGET sys@orcl 必须能通过tnsnames解析并认证。如果报 ORA-12514,检查备库的 listener.ora 是否包含静态注册段:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcldg)
(ORACLE_HOME = C:\app\oracle\product\19.3.0\dbhome_1)
(SID_NAME = orcldg)
)
)
改完监听器后运行 lsnrctl reload,再试。
最麻烦的点不在命令本身,而在Windows服务注册和监听器静态注册的耦合性——哪怕参数全对,只要 ORACLE_SID 没在Windows服务里注册为 OracleServiceORCLDG,RMAN就找不到本地实例。这个步骤没有脚本能绕过,必须人工确认服务是否存在、是否启动、是否指向正确的 ORACLE_HOME 和参数文件。


















