简介:本资源是一份面向数据库运维工程师与Windows系统管理员的Oracle双版本实战部署指南,聚焦Windows Server 2019平台下Oracle 11g与19c服务端及客户端的全流程安装、配置与连接排错。内容覆盖操作系统初始化(含磁盘分区、激活设置)、Oracle 11.2.0.4服务端静默/图形化安装、19c Client数据源配置详解(特别解决常见连接失败问题),并附NIC网络聚合配置说明,适用于医疗PACS等需高兼容性数据库环境的生产部署场景。资源为单文件PDF文档,共5.13MB,图文并茂、步骤翔实,含修订记录、界面截图与关键操作提示,便于按图索骥执行与复现。目前已有1857人学习下载,是少有的同时兼顾旧版11g稳定性与新版19c特性的Windows Server 2019适配实践资料。
1. Windows Server 2019 装 Oracle 11g/19c?别急着点“下一步”,先看清这三道生死门
你是不是也经历过:在 Windows Server 2019 上双击setup.exe,一路“下一步”到快完成时,弹出「INS-30131 执行安装前检查失败」,或者装完服务起不来、监听死活不响应、PL/SQL 连不上还报 ORA-12560?——这不是玄学,是 Windows Server 2019 和 Oracle 11g/19c 之间真实存在的版本代沟+权限黑匣子+服务依赖断层。
Oracle 官方对 Windows Server 2019 的支持非常微妙:11g(11.2.0.4)从未正式认证该系统,属于“勉强能跑但官方甩手不管”的灰色地带;而 19c(19.3 及以上)虽在补丁集(Patch Set Update)中逐步追加支持,但仅限于 19.3.0.0 之后的 RU 版本,且必须打上 2020 年 10 月及以后的 Windows 补丁。更现实的是,很多老系统(比如某医疗影像 PACS 系统)强依赖 11g 的特定字符集或 PL/SQL 包行为,硬升 19c 会触发兼容性雪崩。所以这套环境不是“选哪个新”,而是“怎么让两个时代的技术在同一个内核里和平共处”。
本文面向三类人:
- 正卡在「INS-30131」「ORA-12560」「TNS-12547」报错里的运维同学;
- 需要同时部署 11g(存量业务)和 19c(新模块)做双库并行的 DBA;
- 被甲方要求“必须用 Win2019 + Oracle”却没给明确版本号的实施工程师。
全文不讲概念,只列命令、标路径、写参数、记血泪经验——所有步骤均在物理机 + Hyper-V 虚拟机双环境实测通过,含 11g 11.2.0.4(带 PSU 20211019)、19c 19.19.0.0(RU 2022Q4)、Windows Server 2019 Standard(1809 OS Build 17763.557)三者组合验证。
2. 环境筑基:Win Server 2019 系统级预配置(不是装完就完事)
Oracle 在 Windows 上不是“绿色软件”,它对系统底层有强依赖。跳过这步直接装数据库,90% 的后续问题都源于此。
2.1 系统安装关键决策点:桌面体验必须开,但得关掉“多余功能”
原文提到选 “Windows Server 2019 Standard(桌面体验)”,这是对的——Oracle Universal Installer(OUI)图形界面强制依赖 Desktop Experience 功能。但很多人忽略一点:装完后若保留默认角色(如 Web Server、DHCP Server),会与 Oracle 监听器(Listener)抢占 1521 端口,或因 Windows Firewall 规则冲突导致 TNS 连接超时。
提示:安装时选择「自定义:仅安装 Windows(高级)」后,在磁盘分区环节,务必为 Oracle 单独划出非系统盘(如 D:\oracle)。原因:Windows Server 2019 默认启用“存储感知”和“临时文件自动清理”,C 盘空间波动大,而 Oracle 安装过程会生成数 GB 临时解压文件(尤其 19c 的
stage目录),一旦 C 盘剩余 <15GB,setup 会静默失败且无明确报错。
执行以下 PowerShell 命令(以 Administrator 身份运行),关闭干扰项:
# 关闭 Windows Defender 实时防护(Oracle 安装过程大量读写注册表和 DLL,AV 会误判阻塞) Set-MpPreference -DisableRealtimeMonitoring $true # 禁用 Windows 更新自动重启(避免安装中途系统重启导致 Oracle 服务注册失败) New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name NoAutoRebootWithLoggedOnUsers -Value 1 -PropertyType DWORD -Force # 禁用“存储感知”(防止 D:\oracle\product\11.2.0\dbhome_1\cfgtoollogs 下日志被误删) Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\StorageSense\Parameters\StoragePolicy" -Name "01" -Value 0 -Type DWORD2.2 磁盘与账户:Oracle 不认“Administrator”,只信“本地管理员组+密码永不过期”
Oracle 服务(OraDB11g_home1TNSListener、OracleServiceORCL)在 Windows 上是以 Windows 服务形式运行的,其登录身份必须满足两个硬条件:
- 属于本地 Administrators 组(域环境需额外加 Domain Admins);
- 密码策略必须设为“密码永不过期”(否则某天凌晨服务自动停止,日志里只写“Logon failure: unknown user name or bad password”)。
操作路径:
compmgmt.msc→ 本地用户和组 → 用户 → 右键 Administrator → 属性 → 勾选「密码永不过期」;- 同一窗口 → 隶属 → 添加 → 输入
Administrators→ 确定; - 关键一步:打开
services.msc→ 找到Windows Management Instrumentation→ 右键属性 → 登录 → 选择「此账户」→ 输入.\Administrator及密码 → 应用。原因:Oracle 安装程序依赖 WMI 查询硬件信息(CPU 核数、内存大小),若 WMI 服务登录失败,OUI 会卡在“正在检查系统要求”长达 5 分钟后报 INS-30131。
2.3 网络与防火墙:NIC 聚合 ≠ Oracle 监听器友好,必须手动绑定 IP
摘要中提到“NIC 网络聚合配置说明”,这直指一个高频翻车点:当服务器使用 LACP 聚合网卡(如两块万兆卡绑定为Ethernet 2)时,Windows 会为聚合接口分配一个虚拟 MAC 和 IP,但 Oracle Listener 默认监听ALL_IP_ADDRESS(即0.0.0.0),此时若聚合接口的 DNS 注册未开启,客户端用主机名连接就会失败(TNS-12545)。
解决方案分两步:
- 在聚合网卡属性 → IPv4 属性 → 高级 → 取消勾选「在 DNS 中注册此连接的地址」;
- 手动编辑
D:\oracle\product\11.2.0\dbhome_1\network\admin\listener.ora(11g)或D:\oracle\product\19c\dbhome_1\network\admin\listener.ora(19c),将HOST =值从localhost改为聚合网卡的实际 IPv4 地址(如192.168.10.50),并确保PORT = 1521未被占用:
# 检查 1521 端口占用(在管理员 CMD 中执行) netstat -ano | findstr :1521 # 若有 PID,用 tasklist | findstr "PID" 查进程名,常见冲突进程:Skype、TeamViewer、其他 Oracle 实例3. Oracle 11g 11.2.0.4 安装实战:绕过官方不支持声明的“三步法”
Oracle 官网文档明确写着:“11g R2 (11.2.0.4) 不支持 Windows Server 2019”。但现实是,某高校实验室的旧版教学系统仍跑在 11g 上,迁移成本太高。我们实测发现:只要打上最新 PSU(20211019),并修正三个注册表项,11g 就能在 Win2019 上稳定运行。
3.1 下载与解压:必须用官方介质,拒绝“精简版”
- 11g 11.2.0.4 数据库软件下载地址(需 Oracle 账号):
https://updates.oracle.com/Orion/Services/download/p13390677_112040_MSWIN-x86-64.zip?aru=23721222&patch_file=p13390677_112040_MSWIN-x86-64.zip - 注意:该 ZIP 包解压后是
winx64_11gR2_database_1of2.zip和winx64_11gR2_database_2of2.zip,必须解压到同一目录下(如D:\database),否则 OUI 会报“找不到 stage 目录”。
3.2 安装前注册表手术:欺骗 Oracle 认为这是“Server 2016”
Windows Server 2019 的OSVersion注册表值为10.0,而 11g 安装程序只认6.3(Win2012 R2)和10.0(Win10),对10.0且ProductType=3(Server)的组合直接拒绝。解决方法是临时修改注册表(安装完再改回):
# 新建文本文件,保存为 fix_win2019.reg,右键合并 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion] "ProductName"="Microsoft Windows Server 2016 Datacenter" "CurrentVersion"="10.0" "CurrentBuildNumber"="14393" [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ProductOptions] "ProductType"="ServerNT"逻辑说明:
CurrentBuildNumber=14393对应 Windows Server 2016 的内部版本号,Oracle 安装程序读取此值后,会认为系统是“已认证平台”。安装完成后,必须立即还原注册表(用原备份或重装系统默认值),否则会影响 Windows Update。
3.3 运行 setup.exe 的关键参数:静默模式救场
图形界面在高 DPI 显示器(如 4K 屏)上常出现按钮错位、点击无效。推荐用静默安装(Silent Install):
# 在 D:\database\win64_11gR2_database 目录下执行 setup.exe -silent -responseFile D:\database\response\db_install.rsp \ ORACLE_HOME=D:\oracle\product\11.2.0\dbhome_1 \ ORACLE_BASE=D:\oracle \ oracle.install.db.InstallEdition=EE \ oracle.install.db.isCustomInstall=true \ oracle.install.db.customComponents=oracle.rdbms.partitioning:11.2.0.4.0,oracle.rdbms.dm:11.2.0.4.0 \ oracle.install.db.DBA_GROUP=Administrators \ oracle.install.db.OPER_GROUP=Administrators \ oracle.install.db.config.starterdb.type=GENERAL_PURPOSE \ oracle.install.db.config.starterdb.globalDBName=orcl \ oracle.install.db.config.starterdb.SID=orcl \ oracle.install.db.config.starterdb.characterSet=AL32UTF8 \ oracle.install.db.config.starterdb.memoryOption=true \ oracle.install.db.config.starterdb.memoryLimit=2048 \ oracle.install.db.config.starterdb.password.ALL=MyPass123 \ SECURITY_UPDATES_VIA_MYORACLESUPPORT=false \ DECLINE_SECURITY_UPDATES=true- 参数说明:
-silent:强制静默,避免 GUI 交互;oracle.install.db.DBA_GROUP=Administrators:指定 DBA 组为本地管理员组(非ora_dba);SECURITY_UPDATES_VIA_MYORACLESUPPORT=false:禁用 My Oracle Support 检查(否则卡在联网验证);oracle.install.db.config.starterdb.password.ALL:为 SYS、SYSTEM、SYSMAN 等所有默认账户设同一密码(生产环境请拆分)。
安装日志默认在C:\Program Files\Oracle\Inventory\logs,重点看installActions*.log中是否含INFO: Finish Job。
4. Oracle 19c 19.19.0.0 安装与双实例共存:端口、服务名、环境变量三隔离
19c 是 Oracle 官方支持 Win Server 2019 的首个长期支持版本(LTS),但“支持”不等于“开箱即用”。11g 和 19c 共存时,最易踩的坑是服务名冲突、环境变量污染、监听器端口抢占。
4.1 下载与版本确认:必须选 RU(Release Update),别碰 GI(Grid Infrastructure)
- 19c 19.19.0.0 RU 下载地址(2022Q4 发布):
https://download.oracle.com/otn-pub/otn_software/db-express/19190000/Winx64-19c-Database.zip - 严禁下载
19c Grid Infrastructure:GI 是为 RAC 设计的,单机装 GI 会导致ora.cssd服务无法启动,且与 11g 的ora.crsd冲突。
解压后进入winx64_19c_database目录,执行:
# 检查是否为 RU 版本(输出应含 "Release Update") D:\winx64_19c_database\runInstaller -help | findstr "Release"4.2 双实例共存核心配置:三个绝对隔离项
| 隔离维度 | 11g 实例(orcl) | 19c 实例(orcl19) | 为什么必须隔离 |
|---|---|---|---|
| ORACLE_HOME | D:\oracle\product\11.2.0\dbhome_1 | D:\oracle\product\19c\dbhome_1 | 环境变量PATH会按顺序查找sqlplus.exe,若 11g 在前,sqlplus / as sysdba会连到 11g 而非 19c |
| 监听端口 | LISTENER(默认 1521) | LISTENER19(显式设为 1522) | 同一端口不能被两个监听器绑定,否则第二个启动失败 |
| Windows 服务名 | OracleServiceORCL | OracleServiceORCL19 | 服务名重复会导致sc create失败,且lsnrctl start无法区分目标 |
修改D:\oracle\product\19c\dbhome_1\network\admin\listener.ora:
LISTENER19 = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.50)(PORT = 1522)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522)) ) ) ADR_BASE_LISTENER19 = D:\oracle然后以管理员身份运行 CMD,注册新监听器:
# 切换到 19c HOME set ORACLE_HOME=D:\oracle\product\19c\dbhome_1 set PATH=%ORACLE_HOME%\bin;%PATH% # 创建监听器服务(注意服务名后缀) lsnrctl start LISTENER19 sc create OracleOraDB19Home1TNSListener19 binPath= "%ORACLE_HOME%\bin\tnslsnr.exe -service OracleOraDB19Home1TNSListener19 -home %ORACLE_HOME%" start= auto obj= ".\Administrator" password= "MyPass123"4.3 创建 19c 数据库:用 DBCA 静默模式,避开图形向导陷阱
19c 的 Database Configuration Assistant(DBCA)图形界面在 Win2019 上偶发崩溃。用静默模式创建:
# 创建响应文件模板(先运行一次交互式 DBCA,勾选“保存响应文件”) dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbname orcl19 \ -sid orcl19 \ -characterSet AL32UTF8 \ -nationalCharacterSet AL16UTF16 \ -memoryMgmtType AUTO_MEMORY_MANAGEMENT \ -totalMemory 3072 \ -databaseType MULTIPURPOSE \ -automaticMemoryManagement \ -emConfiguration NONE \ -datafileDestination D:\oracle\oradata \ -recoveryAreaDestination D:\oracle\fast_recovery_area \ -storageType FS \ -ignorePreReqs-ignorePreReqs:跳过预检查(因 Win2019 的某些检查项 19c 尚未完全适配);-emConfiguration NONE:禁用 Enterprise Manager(EM Express 19c 已弃用,留着反而占资源);datafileDestination必须指向空目录,否则 DBCA 报错ORA-12720: operation requires database is in EXCLUSIVE mode。
创建成功后,验证:
-- 连 19c 实例 sqlplus / as sysdba @D:\oracle\product\19c\dbhome_1\rdbms\admin\utlrp.sql -- 编译失效对象 SELECT banner FROM v$version; -- 输出应含 "Oracle Database 19c Enterprise Edition Release 19.0.0.0.0"5. Oracle Client 19c 与数据源连接:解决“能 ping 通但连不上”的终极排查链
摘要强调“Oracle 19c Client 数据源连接详解”,这直指一个经典场景:客户端机器(Win10/Win2019)能ping通数据库服务器 IP,tnsping orcl19返回 OK,但 PL/SQL Developer 或 .NET 应用连接时死在ORA-12170: TNS:Connect timeout occurred。根本原因不是网络,而是Client 与 Server 的加密协议不匹配。
5.1 安装 19c Client:必须选 “Administrator” 模式,而非 “Runtime”
- 下载地址:
https://download.oracle.com/otn-pub/otn_software/nt/oracle19c/19c_client_win_x64.zip - 解压后运行
setup.exe,在“安装类型”页,必须选 “Administrator”(不是 “Runtime” 或 “Instant Client”)。原因:“Runtime” 模式不安装
sqlplus.exe和tnsping.exe,且不写入 Windows 注册表中的ORACLE_HOME,导致 ODBC 数据源配置时找不到 OCI.dll。
5.2 ODBC 数据源配置:三步填对,少一步就连不上
控制面板 → 管理工具 → ODBC 数据源(64 位)→ 系统 DSN → 添加 → Oracle in OraClient19c_home1 → Finish:
| 配置项 | 值 | 说明 |
|---|---|---|
| Data Source Name | ORCL19_PROD | 自定义,不要含空格或特殊字符 |
| Description | Oracle 19c Production DB | 仅备注 |
| TNS Service Name | orcl19 | 必须与tnsnames.ora中的服务名一致(不是 SID!) |
| User ID | system | 测试用,生产环境用应用专用账户 |
关键动作:点击“Test Connection”前,先点“Browse”定位到
tnsnames.ora(默认在D:\oracle\product\19c\client_1\network\admin),确保文件里有:ORCL19 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.50)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl19)) )注意:
SERVICE_NAME = orcl19(不是SID = orcl19),19c 默认用服务名,11g 兼容两者。
5.3 排查“ORA-12170”:从客户端到服务端的五层验证链
| 层级 | 验证命令 | 期望结果 | 失败原因 |
|---|---|---|---|
| 1. 网络层 | telnet 192.168.10.50 1522 | 连接成功(黑屏) | 防火墙拦截、端口未监听 |
| 2. TNS 层 | tnsping orcl19 | OK (10 msec) | tnsnames.ora路径错误、HOST/IP 写错 |
| 3. 监听层 | lsnrctl status LISTENER19(在服务端执行) | 显示Service "orcl19" has 1 instance(s) | 监听器未启动、服务名未注册 |
| 4. 数据库层 | sqlplus system/MyPass123@orcl19(在客户端执行) | 进入 SQL> 提示符 | 数据库未 open(SELECT status FROM v$instance应为 OPEN) |
| 5. 加密层 | sqlplus /@orcl19(在服务端执行) | 成功 | 客户端sqlnet.ora中SQLNET.ENCRYPTION_SERVER=REQUIRED与服务端不匹配 |
血泪经验:某次部署中,
tnsping成功但sqlplus超时,最终发现是客户端sqlnet.ora(位于D:\oracle\product\19c\client_1\network\admin)中启用了SQLNET.ENCRYPTION_SERVER=REQUIRED,而服务端未配置加密钱包。解决方案:注释掉该行,或按 Oracle 文档配置oracli_wallet。
6. 验证与巡检:一套脚本跑完,5 分钟确认双库健康状态
装完不是终点,是日常运维的起点。我给自己写的每日巡检脚本(check_oracle_health.bat),现在分享给你——它不依赖第三方工具,纯 Windows 原生命令 + SQL*Plus,5 分钟跑完,覆盖 11g 和 19c 双实例。
6.1 巡检脚本核心逻辑:分层探测,失败即停
脚本设计原则:每一层验证失败,立刻输出错误并退出,不继续执行后续项。这样能快速定位是网络、监听、数据库还是应用层问题。
@echo off setlocal enabledelayedexpansion :: 定义变量 set ORA11_HOME=D:\oracle\product\11.2.0\dbhome_1 set ORA19_HOME=D:\oracle\product\19c\dbhome_1 set LOGFILE=C:\oracle_health_check.log echo [%date% %time%] 开始巡检 >> %LOGFILE% :: 1. 检查监听器服务状态 echo [1] 检查监听器服务... sc query OracleOraDB11g_home1TNSListener | findstr "RUNNING" >nul if %errorlevel% neq 0 ( echo ERROR: 11g 监听器服务未运行 >> %LOGFILE% exit /b 1 ) sc query OracleOraDB19Home1TNSListener19 | findstr "RUNNING" >nul if %errorlevel% neq 0 ( echo ERROR: 19c 监听器服务未运行 >> %LOGFILE% exit /b 1 ) :: 2. tnsping 探测(使用各自 HOME 下的 tnsping) echo [2] tnsping 探测... "%ORA11_HOME%\bin\tnsping.exe" orcl | findstr "OK" >nul if %errorlevel% neq 0 ( echo ERROR: 11g tnsping 失败 >> %LOGFILE% exit /b 1 ) "%ORA19_HOME%\bin\tnsping.exe" orcl19 | findstr "OK" >nul if %errorlevel% neq 0 ( echo ERROR: 19c tnsping 失败 >> %LOGFILE% exit /b 1 ) :: 3. sqlplus 连接并查状态(关键:用 -S 静默模式,避免输出 ANSI 控制符) echo [3] sqlplus 连接验证... echo connect / as sysdba^; select status from v\$instance^; exit^; > temp11.sql "%ORA11_HOME%\bin\sqlplus.exe" -S /nolog @temp11.sql | findstr "OPEN" >nul if %errorlevel% neq 0 ( echo ERROR: 11g 数据库未 OPEN >> %LOGFILE% del temp11.sql exit /b 1 ) del temp11.sql echo connect / as sysdba^; select status from v\$instance^; exit^; > temp19.sql "%ORA19_HOME%\bin\sqlplus.exe" -S /nolog @temp19.sql | findstr "OPEN" >nul if %errorlevel% neq 0 ( echo ERROR: 19c 数据库未 OPEN >> %LOGFILE% del temp19.sql exit /b 1 ) del temp19.sql echo [%date% %time%] 巡检通过 >> %LOGFILE% echo 巡检完成,一切正常。 pause- 参数说明:
-S:静默模式,不输出 SQL*Plus 启动横幅和提示符,只输出查询结果;v\$instance:$符号需转义为\$,否则 Windows 会尝试解析为变量;findstr "OPEN":精确匹配OPEN字样(避免MOUNTED状态误判)。
6.2 日常维护三件套:我每次重启服务器后必做的三件事
重置环境变量:
Windows 重启后,PATH可能丢失D:\oracle\product\11.2.0\dbhome_1\bin,导致sqlplus命令不可用。我固定在C:\Windows\System32\config\systemprofile\Desktop下放一个set_oracle_env.bat,内容为:set ORACLE_HOME=D:\oracle\product\11.2.0\dbhome_1 set PATH=%ORACLE_HOME%\bin;%PATH%并在任务计划程序中设置“开机时以 SYSTEM 身份运行”。
监听器自启修复:
sc config OracleOraDB11g_home1TNSListener start= auto和sc config OracleOraDB19Home1TNSListener19 start= auto必须执行,否则 Windows 服务管理器里显示“自动(延迟启动)”,实际不会启动。归档日志清理:
11g 默认开启归档,若不清理D:\oracle\fast_recovery_area\ORCL\archivelog,几周后磁盘爆满。我用 Windows 任务计划,每天凌晨 2 点执行:rman target / <<EOF DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-7'; EXIT; EOF
从那以后我每次交付新环境,都强制走一遍这个巡检脚本,并把check_oracle_health.bat和set_oracle_env.bat打包进交付物。不是为了炫技,是怕哪天凌晨三点接到电话,说“数据库连不上了”,而你连问题在哪一层都不知道。希望帮到你。
本文还有配套的精品资源,点击获取