
简介本资源是一份面向数据库运维工程师与Windows系统管理员的Oracle双版本实战部署指南聚焦Windows Server 2019平台下Oracle 11g与19c服务端及客户端的全流程安装、配置与连接排错。内容覆盖操作系统初始化、磁盘分区规划、Oracle 11.2.0.4服务端静默/图形化安装、19c Client数据源配置要点并特别详解NIC网络聚合设置及客户端无法连接数据库的典型故障应对方案含PL/SQL连接实操验证。资源为单文件PDF文档5.13MB结构清晰、图文并茂含修订记录、分步截图与关键参数说明便于按章节快速查阅与复现。目前已有1855人学习下载适合中初级DBA在生产环境迁移、教学实验或认证备考中作为可落地的参考手册使用。1. Windows Server 2019 上同时跑 Oracle 11g 和 19c不是“能装就行”而是“装完就稳、连得上、扛得住”你有没有遇到过这种场景某医疗影像系统PACS要求 Oracle 11g而新上的数据分析模块又强制依赖 19c 的 JSON 表达式和自治事务特性服务器只有一台OS 升级到 Windows Server 2019 是硬性安全基线但官方文档里 Oracle 11g 明确写着“不支持 Windows Server 2019”——可现实是它真能装、真能启、真能用只是默认配置下十次有八次监听起不来、客户端连不上、服务一重启就掉库。这不是玄学是 Windows 服务账户权限、Oracle 网络栈与现代 Windows 内核调度策略的隐性冲突。这份实战笔记就是把某高校实验室在真实 PACSBI 混合负载环境下踩出的 37 处坑、5 类注册表级修复、4 种监听器保活方案全拆开给你看。适合正在做 legacy 系统迁移、信创适配预研、或被“老库新环境”卡住交付节点的 DBA 和系统集成工程师。它不讲理论兼容性白皮书只告诉你哪一步必须改注册表、哪个服务账户不能用 LocalSystem、为什么lsnrctl start返回成功但tnsping却超时——以及怎么让两个大版本共存时不互相 hijack 监听端口。2. 环境筑基Windows Server 2019 的“非默认”初始化配置Oracle 在 Windows 上不是“装完就走”的绿色软件它的稳定性极度依赖 OS 层的底层配置。很多翻车其实发生在安装 Oracle 之前——比如磁盘分区方式、服务账户策略、甚至 PowerShell 执行策略。下面这些步骤是我每次部署前必做的“三板斧”跳过任意一条后面 90% 的连接问题都源于此。2.1 磁盘规划为什么 C 盘必须 ≥80GB且 D/E/F 盘要提前格式化为 NTFS 并禁用 8.3 文件名Oracle 安装程序尤其是 11g在解压和静默安装阶段会大量调用cmd.exeforfilesrobocopy组合命令。若目标盘未预先格式化为 NTFS或启用了 8.3 短文件名默认开启会导致oraInventory目录创建失败报错OUI-25031: Some of the configuration assistants failed但日志里根本找不到具体失败项。提示不要等安装中途报错再回头格式化。在 Server 2019 安装完成、首次登录后立即执行# 检查所有卷是否为 NTFS且 8.3 名称已禁用 Get-Volume | Where-Object {$_.FileSystemType -eq NTFS} | ForEach-Object { $drive $_.DriveLetter : $result fsutil behavior query disablelastaccess $drive 2$null if ($result -match is disabled) { Write-Host ✅ $drive: NTFS OK, 8.3 disabled } else { # 强制禁用 8.3需管理员权限 fsutil behavior set disable8dot3 $drive 1 fsutil behavior set disablelastaccess $drive 1 Write-Host $drive: 8.3 lastaccess disabled } }disable8dot3 1彻底禁用短文件名生成Oracle 11g 安装器会因ORA-01019错误卡在 inventory 创建disablelastaccess 1避免 NTFS 频繁更新访问时间戳降低 I/O 延迟对 RAC 或高并发 OLTP 尤其关键2.2 服务账户LocalSystem 是“最省事也最危险”的选择Oracle 服务OracleServiceORCL,OracleOraDB19Home1TNSListener默认使用LocalSystem账户。这在 Server 2012 还行但在 Server 2019 中LocalSystem被赋予了更严格的令牌完整性级别Medium Integrity导致其无法写入HKEY_LOCAL_MACHINE\SOFTWARE\Oracle下的部分键值尤其当安装路径含空格或中文时进而引发TNS-12560: TNS:protocol adapter error。正确做法新建专用域/本地账户如oraadmin并赋予以下最小权限登录为服务Log on as a service替换进程级令牌Replace a process level token调整内存配额Adjust memory quotas for a process作为批处理作业登录Log on as a batch job# 以管理员身份运行 CMD net user oraadmin Pssw0rd123! /add /domain net localgroup Administrators oraadmin /add # 关键授予“登录为服务”权限需 secpol.msc 图形界面或 via ntrights.exe # 若无 ntrights用 PowerShell 替代需重启生效 $acct New-Object System.Security.Principal.NTAccount(oraadmin) $rule New-Object System.Security.AccessControl.RegistryAccessRule($acct, FullControl, ContainerInherit,ObjectInherit, None, Allow) $regKey [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey(SOFTWARE, $true) $regKey.SetAccessControl((New-Object System.Security.AccessControl.RegistrySecurity)) $regKey.Close()2.3 网络与防火墙NIC 聚合 ≠ 网络稳定必须关闭“快速启动”和启用“TCP Chimney Offload”摘要里提到的“NIC 网络聚合配置说明”其核心不是教你怎么绑网卡而是告诉你Server 2019 默认开启的TCP Chimney Offload和快速启动Fast Startup会与 Oracle 的sqlnet.ora中SQLNET.EXPIRE_TIME机制冲突导致连接池中的空闲连接被 Windows 内核悄无声息地回收而 Oracle 监听器毫不知情最终应用报ORA-03113: end-of-file on communication channel。必须执行的三步关闭快速启动控制面板 → 电源选项 → 选择电源按钮的功能 → 更改当前不可用的设置 → 取消勾选“启用快速启动”禁用 TCP Chimney# 查看当前状态 Get-NetAdapterAdvancedProperty -Name * -DisplayName Chimney Offload # 全局禁用所有网卡 Set-NetAdapterAdvancedProperty -Name * -DisplayName Chimney Offload -DisplayValue Disabled在sqlnet.ora中显式设置保活# %ORACLE_HOME%\network\admin\sqlnet.ora SQLNET.EXPIRE_TIME10 # 每10分钟发一次探测包 TCP.VALIDNODE_CHECKINGYES # 启用节点验证防未授权连接 TCP.INVITED_NODES(127.0.0.1,192.168.10.0/24) # 白名单网段3. Oracle 11g 与 19c 双版本共存路径、端口、服务名的“三重隔离”实操一个物理服务器上同时安装 11g 和 19c不是简单地“换个目录再点一次 setup.exe”。Oracle 的 Windows 服务注册、监听器端口绑定、环境变量加载顺序全由ORACLE_HOME和ORACLE_BASE的路径结构决定。稍有不慎19c 的PATH会覆盖 11g 的oci.dll导致 PL/SQL Developer 连接 11g 库时报ORA-12154: TNS:could not resolve the connect identifier specified——而 tnsping 却显示正常。3.1 目录结构设计用“版本号用途”命名法杜绝路径污染绝对禁止C:\oracle\product\11.2.0\dbhome_1C:\oracle\product\19.0.0\dbhome_1推荐结构全部使用英文、无空格、无下划线D:\ora11g\product\11.2.0\server ← 11g 服务端PACS 生产库 E:\ora19c\product\19.3.0\client_1 ← 19c 客户端BI 工具连接用 F:\ora19c\product\19.3.0\db_1 ← 19c 服务端分析库独立实例为什么这样分盘11g 的ORACLE_HOME必须在 NTFS 格式盘且不能与 Windows 系统盘C:\同盘——否则oraInventory会被写入C:\Program Files\Oracle\Inventory触发 UAC 权限拦截。19c 客户端单独放 E 盘是为了让 BI 工具如 Tableau、Power BI的 ODBC 数据源只加载E:\ora19c\product\19.3.0\client_1\bin完全隔离 11g 的oci.dll。3.2 监听器端口分配用静态端口 hostfile 绑定规避动态端口争抢Oracle 默认监听器使用1521但双版本共存时必须为每个实例分配静态、非重叠端口并在listener.ora中强制绑定到指定 IP# D:\ora11g\product\11.2.0\server\network\admin\listener.ora LISTENER_ORCL (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.10.100)(PORT 1521)(IP FIRST)) (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1521)) ) ) # F:\ora19c\product\19.3.0\db_1\network\admin\listener.ora LISTENER_ORCL19C (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.10.100)(PORT 1522)(IP FIRST)) (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1522)) ) )注意HOST必须写成 IP 地址而非主机名否则 Windows Server 2019 的 DNS Client 服务可能因 IPv6 优先级导致解析延迟lsnrctl start显示成功但tnsping ORCL却超时。同时在C:\Windows\System32\drivers\etc\hosts中添加192.168.10.100 db-pacs.local 192.168.10.100 db-bi.local确保tnsnames.ora中的HOST值与 hosts 一致绕过 DNS 查询。3.3 实例服务名与全局数据库名大小写敏感与域名后缀的隐形陷阱Windows 对服务名不区分大小写但 Oracle 实例名ORACLE_SID和全局数据库名DB_NAME在 11g/19c 中均区分大小写且DB_DOMAIN必须显式设置否则tnsnames.ora中的连接描述符connect descriptor会因域名解析失败而报ORA-12154。11g 实例创建时dbca关键设置Database Name:orcl全小写与ORACLE_SID一致Global Database Name:orcl.pacs.local必须带域名后缀SID:orcl19c 实例创建时dbca关键设置Database Name:orcl19c小写避免与 11g 冲突Global Database Name:orcl19c.bi.localSID:orcl19c对应tnsnames.ora片段ORCL_PACS (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST db-pacs.local)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl.pacs.local) # 必须与 DB_DOMAIN 严格匹配 ) ) ORCL19C_BI (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST db-bi.local)(PORT 1522)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl19c.bi.local) ) )4. Oracle 19c Client 连接疑难排查解决“能 ping 通、能 tnsping、就是连不上”的黑匣子摘要里强调的“Oracle 19c Client 数据源连接详解”其核心痛点在于19c Client 默认启用TLS 1.2 强制加密而很多旧版应用如 Delphi 开发的 PACS 前端仍使用明文 SQL*Net 连接。此时tnsping成功只测网络层sqlplus /ORCL_PACS却卡死或报ORA-28759: failure to open file——这是 TLS 握手失败的典型表现但错误码极其误导。4.1 验证 TLS 是否为根因用openssl s_client直连监听端口# 在客户端机器装有 19c Client上执行 openssl s_client -connect 192.168.10.100:1521 -tls1_2 -showcerts若返回CONNECTED(00000003) 证书链则 TLS 正常若返回socket: Connection refused或ssl handshake failure则监听器未启用 TLS或sqlnet.ora中SSL_VERSION不匹配。4.2 强制降级为非加密连接修改 sqlnet.ora 的三处关键参数在E:\ora19c\product\19.3.0\client_1\network\admin\sqlnet.ora中添加/修改# 禁用 TLS针对旧应用 SQLNET.ENCRYPTION_SERVERrejected SQLNET.CRYPTO_CHECKSUM_SERVERrejected SSL_VERSION0 # 0 any, 1.0 TLS 1.0, 1.2 TLS 1.2 # 但保留基本安全只允许特定 IP 连接 TCP.VALIDNODE_CHECKINGYES TCP.INVITED_NODES(127.0.0.1,192.168.10.0/24,10.0.0.0/8)逻辑说明SQLNET.ENCRYPTION_SERVERrejected并非关闭加密而是告诉监听器“如果客户端要求加密直接拒绝”从而迫使客户端回退到明文协议。这是比SSL_VERSION0更精准的控制方式。4.3 ODBC 数据源配置32/64 位桥接器的“静默切换”陷阱Windows Server 2019 默认安装 64 位 ODBC 管理器odbcad32.exe在C:\Windows\SysWOW64\下是 32 位C:\Windows\System32\下是 64 位。而很多旧 BI 工具如 Crystal Reports是 32 位进程却去读取 64 位 ODBC 数据源导致Data source name not found and no default driver specified。解决方案为 32 位应用单独配置 32 位 DSN# 以管理员身份运行 CMD调用 32 位管理器 C:\Windows\SysWOW64\odbcad32.exe在 DSN 配置中Driver必须选择Oracle in OraClient19c_home1而非Oracle ODBC Driver且TNS Service Name必须与tnsnames.ora中定义的别名如ORCL_PACS完全一致包括大小写。5. 避坑指南Windows Server 2019 Oracle 双版本共存的 5 类高频翻车现场这些不是“可能遇到”而是我在 7 个不同客户现场重复踩过的坑。每一条都附带现象、根因和血泪修复命令照着抄就能救活。5.1 现象lsnrctl start返回The command completed successfully但lsnrctl status显示Connecting to (DESCRIPTION(ADDRESS(PROTOCOLIPC)(KEYEXTPROC1521)))后卡住无响应原因EXTPROC外部过程代理在 Server 2019 上默认被禁用但监听器配置中仍引用了它导致 IPC 连接无限等待。解决编辑listener.ora注释或删除EXTPROC相关 ADDRESS 行并重启监听器# 删除 IPC 行后执行 lsnrctl stop lsnrctl start5.2 现象PL/SQL Developer 连接 11g 库报ORA-12638: Credential retrieval failed但 sqlplus 正常原因PL/SQL Developer 默认启用 Windows 集成认证OS Authentication而 11g 在 Server 2019 上无法正确解析os_authent_prefix参数。解决在 PL/SQL Developer 登录窗口取消勾选OS Authentication手动输入用户名/密码或在sqlnet.ora中添加SQLNET.AUTHENTICATION_SERVICES(NTS) # 并确保 Windows 服务账户oraadmin已加入本地 Administrators 组5.3 现象19c 数据库创建后SELECT * FROM V$VERSION显示BANNER为Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production但SELECT INSTANCE_NAME FROM V$INSTANCE返回空原因V$INSTANCE视图依赖SGA共享内存段而 Server 2019 的内存管理策略导致oradim创建服务时未正确分配LOCK_SGA权限。解决以管理员身份运行 CMD重新注册服务并启用锁定oradim -delete -sid orcl19c oradim -new -sid orcl19c -intpwd oracle -startmode auto -pfile F:\ora19c\product\19.3.0\db_1\dbs\initorcl19c.ora -usrpwd oracle # 然后在服务管理器中找到 OracleServiceORCL19C右键→属性→登录→勾选“允许服务与桌面交互”仅调试用生产环境勿开5.4 现象expdp导出 11g 库时报ORA-39002: invalid operationORA-39070: Unable to open the log file日志路径存在且权限正常原因11g Data Pump 在 Server 2019 上无法解析长路径260 字符即使\\?\前缀也无效。解决将DIRECTORY对象指向根目录下的短路径-- 在 11g 库中执行 CREATE OR REPLACE DIRECTORY dp_dir AS D:\dmp; GRANT READ,WRITE ON DIRECTORY dp_dir TO system; -- 导出时指定 expdp system/oracle DIRECTORYdp_dir DUMPFILEfull.dmp FULLY5.5 现象两个监听器1521 和 1522能各自status但客户端用tnsping ORCL19C_BI时实际连到了 11g 实例SELECT * FROM V$VERSION显示 11g原因tnsnames.ora中SERVICE_NAME与数据库实际SERVICE_NAMES不一致而 Oracle 监听器在多实例时会按字典序返回第一个匹配的服务。解决登录 19c 库确认SERVICE_NAMESSHOW PARAMETER service_names; -- 若返回 orcl.pacs.local则说明创建时 DB_DOMAIN 设错了 ALTER SYSTEM SET service_namesorcl19c.bi.local SCOPEBOTH; -- 然后在监听器中 reload lsnrctl reload6. 生产环境自检清单从安装完成到交付上线的 12 项必验动作部署结束不等于交付完成。我给自己定的铁律是任何 Oracle 环境上线前必须手工跑完这 12 项检查。少一项我都不会签字验收。它们不是“锦上添花”而是过去三年里帮我们避开 5 次 P1 级故障的后悔药。6.1 网络层连通性四层穿透验证不只是 ping 和 tnsping验证项命令预期结果不通过意味着ICMP 层ping -n 3 192.168.10.1003 个回复无丢包物理链路或防火墙拦截TCP 层telnet 192.168.10.100 1521黑屏连接成功监听器进程未监听该端口或 Windows 防火墙阻止TNS 层tnsping ORCL_PACSOK (10 msec)tnsnames.ora配置正确DNS/hosts 解析正常SQL 层sqlplus /ORCL_PACS进入 SQL 提示符Oracle 网络栈、认证、实例状态全部 OK注意telnet在 Server 2019 默认未安装需先启用Enable-WindowsOptionalFeature -Online -FeatureName TelnetClient -NoRestart6.2 服务账户与权限用 Process Monitor 抓取真实访问拒绝光看“服务属性”里的登录账户没用。真正的权限问题藏在CreateFile、RegOpenKey等系统调用里。我习惯用 Sysinternals 的Process MonitorProcMon抓取oracle.exe启动时的失败事件启动 ProcMon过滤Process Name包含oracleResult包含ACCESS DENIED重启OracleServiceORCL服务查看Path列定位被拒绝访问的注册表路径如HKLM\SOFTWARE\Oracle\KEY_OraDb11g_home1或文件路径如D:\ora11g\product\11.2.0\server\NETWORK\ADMIN\sqlnet.ora右键该事件 →Properties→Stack看是哪个 DLL 在尝试访问 → 反向推导需赋权的账户6.3 双实例资源隔离验证内存与 CPU 不越界Server 2019 的内存压缩Memory Compression和 CPU 调度器可能让两个 Oracle 实例互相抢占。必须验证orcl实例的sga_target是否真的被锁定-- 在 11g 库中 SELECT component, current_size/1024/1024 AS mb FROM v$memory_dynamic_components WHERE component shared pool; -- 结果应 ≈ sga_target 设置值如 2048MB而非动态浮动orcl19c实例的 CPU 使用率是否受orcl影响-- 在 19c 库中 SELECT inst_id, username, program, cpu_time/1000000 AS sec, sql_id FROM gv$session WHERE status ACTIVE AND username IS NOT NULL ORDER BY cpu_time DESC; -- 若 top 3 session 的 cpu_time 在 1 分钟内增长 5 秒说明未被抢占6.4 故障转移模拟强制杀监听器验证客户端自动重连这才是检验“真高可用”的唯一标准。在客户端如 PL/SQL Developer保持连接状态下执行# 杀掉 11g 监听器不影响 19c lsnrctl stop LISTENER_ORCL # 等待 30 秒观察客户端是否自动断开并重连需应用层配置重试 # 然后手动启动 lsnrctl start LISTENER_ORCL # 再次验证客户端能否立即执行 SELECT SYSDATE FROM DUAL如果客户端需要手动 reconnect说明应用未配置FAILOVERON或RETRY_COUNT。此时必须修改tnsnames.oraORCL_PACS (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST db-pacs.local)(PORT 1521)) (FAILOVER ON) (LOAD_BALANCE OFF) ) (CONNECT_DATA (SERVICE_NAME orcl.pacs.local) (FAILOVER_MODE (TYPE SELECT) (METHOD BASIC) (RETRIES 3) (DELAY 5) ) ) )从那以后我每次交付 Oracle 环境都强制走一遍这 12 项检查——不是为了显得专业而是因为某次跳过第 7 项v$parameter中remote_login_passwordfile检查导致客户第二天凌晨 3 点数据库被暴力破解备份全毁。希望帮到你。本文还有配套的精品资源点击获取