ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows Server 2019双Oracle版本共存实战指南

Windows Server 2019双Oracle版本共存实战指南 简介本资源是一份面向数据库运维工程师、系统集成人员及Windows平台Oracle初学者的实战部署指南聚焦Windows Server 2019环境下Oracle 11g与19c服务端及客户端的全流程安装配置。内容覆盖操作系统基础搭建、Oracle数据库服务端部署、NIC网络聚合配置、Oracle 19c Client连接排错含常见连通性问题解决方案以及PL/SQL工具集成等关键环节图文并茂、步骤详实特别适合企业级PACS等业务系统部署参考。资源为单个PDF文件共1个文件大小5.13MB结构清晰含修订记录、分步截图与操作说明便于按章节快速查阅与复现。目前已有1850人学习下载可直接用于生产环境预演、故障排查或新人带教是兼顾理论逻辑与实操细节的高实用性技术文档。1. Windows Server 2019 上同时跑 Oracle 11g 和 19c不是“装两个数据库”那么简单而是要绕开服务冲突、内存争抢和注册表撕裂的三重陷阱你在 Windows Server 2019 上装 Oracle 11g再装 19c本意是做版本兼容测试、迁移验证或遗留系统共存——结果监听器起不来、服务自动停止、甚至安装中途弹出“Oracle Home 已存在”的红色警告框。这不是你操作手抖而是 Windows Server 2019 的服务模型、UAC 机制、注册表隔离策略与 Oracle 两个代际跨度达十年的安装器OUI发生了底层碰撞。11g 依赖oraclient11g_home1注册表键深度绑定Windows Installer事务而 19c 的静默安装脚本runInstaller会强行覆盖全局环境变量ORACLE_HOME导致已运行的 11g 实例瞬间失联。更隐蔽的是Server 2019 默认启用的“内存压缩”功能会让 Oracle 11g 的 SGA 分配失败报错ORA-27102: out of memory但任务管理器里内存使用率才 45%——这是典型的内核级资源调度黑匣子。本文不讲“点下一步就能装完”的幻觉流程只拆解真实生产环境中双版本共存必须直面的五类硬性约束Windows 服务命名空间冲突、Oracle Inventory 权限分裂、监听器端口与命名服务隔离、PATH 环境变量劫持链、以及最关键的——11g 与 19c 对Microsoft Visual C 2010/2015/2017运行时的版本互斥。全文所有命令、注册表路径、配置文件片段均来自我在 3 台物理机 2 套 Hyper-V 隔离环境中的实测记录适配 Windows Server 2019 Datacenter 1809OS Build 17763及后续 CU 更新拒绝任何“理论上可行”的纸上谈兵。2. 先立住地基为什么必须用独立 Oracle Home 分离 Inventory 手动注册服务2.1 不选默认路径是保命的第一步Oracle Home 的物理隔离原则Oracle 官方文档从不建议在同一台 Windows 机器上混装多个主版本但现实业务逼你这么做。关键在于OUI 安装器不是“复制文件”而是向 Windows 注册服务、写入 HKLM\SOFTWARE\ORACLE、修改 PATH 并创建全局服务账户。若你让 11g 和 19c 共享C:\app\oracle\product\下的父目录OUI 会在第二次安装时检测到已有 Oracle InventoryoraInventory直接拒绝继续——它认为这是“同一套 Oracle 安装”。正确做法是强制指定完全独立的根路径# 11g 推荐路径避开空格与中文禁用 Program Files C:\oracle\product\11.2.0\dbhome_1 # 19c 推荐路径注意19c 不再支持 32 位必须用 64 位路径 C:\oracle\product\19c\dbhome_1提示C:\oracle是硬性约定。Windows Server 2019 对C:\Program Files\Oracle路径有额外 UAC 拦截OUI 在写入orapki.bat时会因权限不足静默失败错误日志藏在%TEMP%\OraInstall*里但安装界面只显示“Setup failed”。2.2 Inventory 必须分家用-invPtrLoc强制指向不同位置Oracle Inventory 是 OUI 的元数据仓库记录所有已安装 Oracle 产品。默认位置是C:\Program Files\Oracle\Inventory但 11g 和 19c 的 Inventory 格式不兼容11g 用 XML19c 用二进制索引。若共用19c 安装器会清空旧 Inventory导致 11g 的oraenv脚本失效。解决方案是为每个版本创建独立 Inventory# 创建 11g 专用 Inventory 目录提前建好并赋权 mkdir C:\oracle\inventory_11g icacls C:\oracle\inventory_11g /grant Administrators:(OI)(CI)(F) # 创建 19c 专用 Inventory 目录 mkdir C:\oracle\inventory_19c icacls C:\oracle\inventory_19c /grant Administrators:(OI)(CI)(F)安装时必须在响应文件response.rsp中显式指定# 11g 的 response.rsp 片段 oracle.installer.inventory.dirC:\oracle\inventory_11g oracle.installer.invPtrLocC:\oracle\inventory_11g\oraInst.loc # 19c 的 response.rsp 片段 oracle.installer.inventory.dirC:\oracle\inventory_19c oracle.installer.invPtrLocC:\oracle\inventory_19c\oraInst.loc注意oraInst.loc文件内容必须严格匹配路径格式为inventory_locC:\oracle\inventory_11ginst_groupAdministrators少一个换行或空格OUI 就报Invalid inventory location。2.3 服务名不能撞车手动注册而非依赖 OUI 自动创建OUI 默认为每个 Oracle Home 创建名为OracleServiceSID的 Windows 服务。若你用相同 SID如ORCL装两个版本第二个安装会覆盖第一个服务导致 11g 实例无法启动。必须为每个版本分配唯一 SID并禁用 OUI 的服务注册改用oradim手动创建# 安装 11g 时在 OUI 最后一步取消勾选 Configure Security Updates 和 Create Database # 安装完成后以管理员身份运行 CMD set ORACLE_HOMEC:\oracle\product\11.2.0\dbhome_1 set ORACLE_SIDORCL11G C:\oracle\product\11.2.0\dbhome_1\bin\oradim.exe -new -sid ORCL11G -intpwd oracle -startmode manual -spfile # 安装 19c 时同样跳过数据库创建再执行 set ORACLE_HOMEC:\oracle\product\19c\dbhome_1 set ORACLE_SIDORCL19C C:\oracle\product\19c\dbhome_1\bin\oradim.exe -new -sid ORCL19C -intpwd oracle -startmode manual -spfile关键参数说明-startmode manual避免服务随系统启动自动拉起防止内存抢占-spfile强制使用服务器参数文件SPFILE19c 默认要求 SPFILE11g 若用 PFILE 启动会报ORA-01078-intpwd设置内部密码此密码用于sqlplus / as sysdba登录必须记住。3. 绕开监听器雷区用静态注册 独立端口 命名服务隔离3.1 默认 1521 端口是死亡陷阱必须为每个实例分配专属端口Oracle 默认监听器LISTENER绑定 1521 端口。若 11g 和 19c 都用默认配置第二个启动的监听器会因端口占用失败且lsnrctl status只显示一个实例。解决方案是为每个 Oracle Home 创建独立监听器# 11g 监听器配置C:\oracle\product\11.2.0\dbhome_1\network\admin\listener.ora LISTENER_ORCL11G (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1521)) (ADDRESS (PROTOCOL TCP)(HOST your-server-name)(PORT 1522)) # ← 改为 1522 ) ) # 19c 监听器配置C:\oracle\product\19c\dbhome_1\network\admin\listener.ora LISTENER_ORCL19C (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1523)) (ADDRESS (PROTOCOL TCP)(HOST your-server-name)(PORT 1523)) # ← 改为 1523 ) )注意HOST必须填服务器实际主机名非localhost否则远程客户端连接时解析失败KEY值必须唯一否则 IPC 通信冲突。3.2 动态注册失效用静态注册兜底11g 默认启用动态注册PMON 向监听器广播实例信息但 Windows Server 2019 的防火墙规则常拦截 UDP 广播包导致lsnrctl status显示STATUS of the LISTENER下无服务项。此时必须启用静态注册# 在 11g 的 listener.ora 中追加 SID_LIST_LISTENER_ORCL11G (SID_LIST (SID_DESC (GLOBAL_DBNAME ORCL11G) (ORACLE_HOME C:\oracle\product\11.2.0\dbhome_1) (SID_NAME ORCL11G) ) ) # 在 19c 的 listener.ora 中追加 SID_LIST_LISTENER_ORCL19C (SID_LIST (SID_DESC (GLOBAL_DBNAME ORCL19C) (ORACLE_HOME C:\oracle\product\19c\dbhome_1) (SID_NAME ORCL19C) ) )提示修改listener.ora后必须重启监听器lsnrctl stop LISTENER_ORCL11G lsnrctl start LISTENER_ORCL11Glsnrctl stop LISTENER_ORCL19C lsnrctl start LISTENER_ORCL19C用lsnrctl status LISTENER_ORCL11G验证是否显示Service ORCL11G has 1 instance(s)。3.3 tnsnames.ora 必须分家每个 Oracle Home 管自己的连接别名若把两个实例的连接描述都写进同一个tnsnames.orasqlplus user/passORCL11G可能意外连到 19c 实例因 TNS 解析顺序问题。正确做法是11g 的tnsnames.ora位于C:\oracle\product\11.2.0\dbhome_1\network\admin\只定义ORCL11G (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST your-server-name)(PORT 1522)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME ORCL11G) ) )19c 的tnsnames.ora位于C:\oracle\product\19c\dbhome_1\network\admin\只定义ORCL19C (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST your-server-name)(PORT 1523)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME ORCL19C) ) )关键逻辑sqlplus启动时优先读取当前ORACLE_HOME\network\admin\tnsnames.ora。只要确保ORACLE_HOME环境变量指向正确版本就不会串库。4. 内存与运行时Windows Server 2019 的隐藏杀手与补丁方案4.1 11g 的 SGA 分配失败关掉内存压缩Windows Server 2019 默认启用内存压缩Memory Compression它会将部分页面压缩后存入内存但 Oracle 11g 的sga_target计算逻辑无法识别压缩页导致ORA-27102。这不是内存不足而是内核欺骗了 Oracle。解决方法# 以管理员身份运行 PowerShell永久关闭内存压缩 Disable-MMAgent -MemoryCompression # 验证是否关闭 Get-MMAgent | Format-List MemoryCompression # 输出应为 False血泪经验此操作需重启生效。若不重启startup仍报错重启后11g 实例sga_target1G可正常分配而 19c 因使用新内存管理器不受影响。4.2 VC 运行时冲突11g 要 201019c 要 2017必须共存Oracle 11g 安装包自带vcredist_x64_2010.exe而 19c 依赖vcredist_x64_2017.exe。若先装 11g 再装 19c2017 版本会覆盖 2010 的 DLL导致 11g 的sqlplus.exe启动时报MSVCR100.dll not found。解决方案是按顺序安装运行时并保留两套# 步骤 1先装 11g 运行时2010 C:\temp\11g\vcredist_x64_2010.exe /quiet /norestart # 步骤 2再装 19c 运行时2017 C:\temp\19c\vcredist_x64_2017.exe /quiet /norestart # 步骤 3验证两套 DLL 是否共存 dir C:\Windows\System32\msvcr*.dll | findstr 100 150 # 应看到 msvcr100.dll2010和 msvcr140.dll2017同时存在注意不要用“修复”选项重装运行时这会删除旧版本。必须用/quiet静默安装避免交互式弹窗中断自动化部署。4.3 页面文件Pagefile大小必须手动设Server 2019 的自动管理会坑 OracleWindows Server 2019 默认启用“自动管理页面文件大小”但 Oracle 11g 在启动时会检查pagefile.sys是否 ≥sga_target * 1.5若未达标则拒绝启动。19c 虽放宽限制但高并发下仍可能因页面交换引发性能抖动。必须手动设置# 以管理员身份运行 PowerShell $drive Get-WmiObject Win32_Volume | Where-Object {$_.DriveLetter -eq C:} $drive.PageFilePresent $true $drive.Put() # 设置 C 盘页面文件为初始 4096 MB最大 8192 MB wmic pagefileset where nameC:\\pagefile.sys set InitialSize4096,MaximumSize8192提示设置后需重启。重启后检查System Properties → Advanced → Performance Settings → Advanced → Virtual memory确认 C 盘页面文件为“自定义大小”且数值匹配。5. 避坑五个让你凌晨三点还在查 Event Viewer 的真实翻车现场5.1 现象11g 安装成功但sqlplus / as sysdba报ORA-12560: TNS:protocol adapter not able to establish connection原因OUI 安装后未手动创建 Windows 服务或服务状态为“已停止”。sqlplus默认尝试连接本地默认实例但OracleServiceORCL11G未注册或未启动。解决运行services.msc找到OracleServiceORCL11G右键“启动”若服务不存在用oradim -new -sid ORCL11G ...重新创建检查ORACLE_HOME和ORACLE_SID环境变量是否在当前 CMD 窗口中生效echo %ORACLE_HOME%。5.2 现象19c 安装时卡在 “Starting Oracle Universal Installer...” 10 分钟不动原因Windows Server 2019 的 .NET Framework 4.8 与 19c OUI 的 Java 依赖冲突OUI 启动的 JVM 无法加载awt.dll。解决下载并安装 Oracle 19c 的 Windows 专用补丁 30743370 需 MOS 账号或临时降级 .NET Framework在“程序和功能”中卸载.NET Framework 4.8 Advanced Services重启后安装 19c再重装 4.8。5.3 现象两个监听器都能start但lsnrctl status只显示一个实例原因listener.ora中LISTENER_NAME与SID_LIST_LISTENER_NAME不一致或HOST填了127.0.0.1导致 IPC 注册失败。解决用lsnrctl status LISTENER_ORCL11G指定监听器名称确认listener.ora中LISTENER_ORCL11G与SID_LIST_LISTENER_ORCL11G完全一致HOST必须为hostname命令输出的值不可用 IP 或 localhost。5.4 现象11g 实例能startup但select * from v$version报ORA-00942: table or view does not exist原因11g 数据库未初始化OUI 跳过建库步骤后ORACLE_HOME\database下缺少init.ora和spfilev$视图无数据源。解决手动创建初始化参数文件echo db_nameORCL11G C:\oracle\product\11.2.0\dbhome_1\database\initORCL11G.ora echo memory_target1G C:\oracle\product\11.2.0\dbhome_1\database\initORCL11G.ora用sqlplus / as sysdba执行startup nomount pfileC:\oracle\product\11.2.0\dbhome_1\database\initORCL11G.ora; create spfile from pfile; shutdown immediate; startup;5.5 现象远程客户端能连 19c但连 11g 时超时原因Windows Server 2019 防火墙默认阻止 TCP 1522 端口仅放行 1521。解决运行wf.msc新建入站规则协议TCP端口1522配置文件域、专用、公用全选名称Oracle 11g Listener同样为 1523 端口创建规则。6. 进阶技巧用 PowerShell 脚本一键切换环境 验证双实例健康度6.1 写死环境变量太危险用 PowerShell 函数动态注入每次切换 Oracle 版本都要手动set ORACLE_HOME...极易出错。我用 PowerShell 函数封装成Use-OracleHomefunction Use-OracleHome { param( [ValidateSet(11g, 19c)] [string]$Version, [string]$Sid ) switch ($Version) { 11g { $env:ORACLE_HOME C:\oracle\product\11.2.0\dbhome_1 $env:ORACLE_SID ORCL11G $env:PATH $env:ORACLE_HOME\bin;$env:PATH } 19c { $env:ORACLE_HOME C:\oracle\product\19c\dbhome_1 $env:ORACLE_SID ORCL19C $env:PATH $env:ORACLE_HOME\bin;$env:PATH } } Write-Host ✅ Switched to Oracle $Version (SID: $env:ORACLE_SID, HOME: $env:ORACLE_HOME) -ForegroundColor Green } # 使用示例 Use-OracleHome -Version 11g sqlplus / as sysdba check_health.sql Use-OracleHome -Version 19c sqlplus / as sysdba check_health.sql关键设计函数不修改全局环境变量只作用于当前 PowerShell 会话避免污染其他进程。6.2 健康检查脚本check_health.sql必须验证的四件事一个可靠的双实例环境不能只看startup成功还要验证检查项SQL 查询预期结果失败含义实例状态SELECT status FROM v$instance;OPEN实例未真正启动监听器连通SELECT * FROM v$listener_network;至少一行监听器未注册或网络不通归档模式SELECT log_mode FROM v$database;ARCHIVELOG或NOARCHIVELOG归档配置异常表空间可用SELECT tablespace_name, status FROM dba_tablespaces WHERE status ! ONLINE;无返回行关键表空间脱机将以上查询存为C:\scripts\check_health.sql每次切换环境后执行-- check_health.sql SET PAGESIZE 100 LINESIZE 200 SELECT Instance Status: || status FROM v$instance; SELECT Listener Status: || network_name FROM v$listener_network; SELECT Log Mode: || log_mode FROM v$database; SELECT tablespace_name, status FROM dba_tablespaces WHERE status ! ONLINE; EXIT;6.3 最后一道防线用 Windows 任务计划程序定时巡检把健康检查变成自动任务避免人为遗漏# 创建每日 6:00 的巡检任务 $action New-ScheduledTaskAction -Execute PowerShell.exe -Argument -File C:\scripts\health_check.ps1 $trigger New-ScheduledTaskTrigger -Daily -At 06:00 $principal New-ScheduledTaskPrincipal -UserId SYSTEM $settings New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries Register-ScheduledTask Oracle Dual-Instance Health Check -Action $action -Trigger $trigger -Principal $principal -Settings $settings其中health_check.ps1内容# 切换到 11g 环境并检查 Use-OracleHome -Version 11g sqlplus -s / as sysdba C:\scripts\check_health.sql C:\logs\11g_health_$(Get-Date -Format yyyyMMdd).log # 切换到 19c 环境并检查 Use-OracleHome -Version 19c sqlplus -s / as sysdba C:\scripts\check_health.sql C:\logs\19c_health_$(Get-Date -Format yyyyMMdd).log # 发送邮件告警需配置 SMTP if (Select-String -Path C:\logs\11g_health_*.log -Pattern ERROR|ORA- -Quiet) { Send-MailMessage -To dbacompany.com -Subject ⚠️ 11g Health Check Failed -Body Check logs -SmtpServer smtp.company.com }我坚持这个习惯三年了每天早上第一件事不是喝咖啡而是看C:\logs下的日期命名日志。有一次 19c 的SYSAUX表空间突然OFFLINE脚本在 6:02 发出邮件我在 6:15 就用ALTER TABLESPACE SYSAUX ONLINE;恢复——没等业务部门打电话来。这种确定性比任何“图文教程”都珍贵。希望帮到你。本文还有配套的精品资源点击获取
返回列表