Windows Server 2012中SSIS的ORA-12541:TNS无监听问题求助
针对你遇到的迁移后Oracle连接失败问题,我整理了几个针对性的排查和解决步骤,都是处理这类Oracle迁移连接问题的常用思路:
确认Oracle客户端与SSIS运行位数匹配
SSIS在Windows Server 2012上运行时,默认可能以32位模式启动(尤其是用SQL Server Data Tools调试时),如果你安装的是64位Oracle客户端,就会出现位数不匹配导致的TNS解析失败。你可以:- 查看SQL Server数据工具(SSDT)的位数:打开SSDT后,在任务管理器里看进程是
devenv.exe还是devenv.exe *32 - 安装对应位数的Oracle客户端(32位或64位),或者同时安装两个版本并分别配置环境变量(优先匹配SSIS运行的位数更稳妥)
- 查看SQL Server数据工具(SSDT)的位数:打开SSDT后,在任务管理器里看进程是
用
tnsping验证TNS解析是否正常
直接在命令行里测试TNS别名的解析情况,注意要打开对应位数的CMD:- 32位CMD路径:
C:\Windows\SysWOW64\cmd.exe - 64位CMD就是普通的命令提示符
运行命令:tnsping <你的TNS别名>
如果返回“TNS-12541: 无监听程序”,说明: - 要么
tnsnames.ora的路径不对(确认是不是放在了%Oracle_Home%\Network\admin下,注意%Oracle_Home%是不是你当前使用的客户端的路径) - 要么当前用户没有读取
admin文件夹的权限,给该文件夹添加读取权限试试
- 32位CMD路径:
检查
sqlnet.ora的名称解析配置
打开sqlnet.ora,确认NAMES.DIRECTORY_PATH参数包含TNSNAMES,比如:NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)如果之前是用LDAP解析的,还要检查
ldap.ora里的LDAP服务器地址是否能在Server 2012上访问,比如用ping <LDAP服务器IP>测试连通性调整环境变量Path的优先级
有时候系统Path里其他软件的路径会覆盖Oracle的DLL,导致加载错误。把%Oracle_Home%和%Oracle_Home%\bin移到Path环境变量的最顶端,然后重启服务器或者重启SSIS相关服务(比如SQL Server代理)让配置生效检查SQL Server代理账户的环境变量
如果是通过SQL Server代理运行SSIS包,代理账户的环境变量可能和系统环境变量不一致。你需要:- 打开SQL Server代理的属性,查看代理使用的账户
- 登录该账户,检查它的用户环境变量Path是否包含Oracle的路径
- 或者直接重启SQL Server代理服务,让它加载最新的系统环境变量
测试Oracle监听端口的连通性
虽然两台服务器能ping通,但Oracle监听的默认端口1521可能被防火墙拦截:- 在Server 2012上运行:
telnet <数据库服务器IP> 1521,如果无法连接,说明端口不通 - 检查Server 2012本地防火墙是否允许出站访问1521端口
- 检查数据库服务器的防火墙是否允许Server 2012的IP访问1521端口
- 在Server 2012上运行:
重新注册OraOLEDB驱动
有时候驱动注册会出问题,手动重新注册:- 32位驱动:打开32位CMD,运行
regsvr32 "C:\你的Oracle客户端路径\bin\OraOLEDB.dll" - 64位驱动:打开普通CMD,运行对应路径的
regsvr32命令
注册成功会弹出提示框,确认即可
- 32位驱动:打开32位CMD,运行
内容的提问来源于stack exchange,提问作者Ankit Mahajan

