使用AWS DMS迁移本地Oracle至Redshift遇ORA-12541连接错误求助
我之前在做类似的Oracle到Redshift的DMS迁移POC时,也碰到过这个ORA-12541: TNS:no listener错误,折腾了好一阵才搞定,给你整理几个最关键的排查步骤:
先确认本地Oracle监听器是否正常运行
这是最基础的一步,打开本地终端(Windows用命令提示符,Mac/Linux用终端),执行:lsnrctl status
如果输出显示监听器未启动,就执行lsnrctl start来启动。另外还要检查listener.ora配置文件(通常在Oracle安装目录的network/admin下),确保监听器监听的是你的公网IP或者0.0.0.0(允许所有IP访问),而不是仅localhost——毕竟DMS是在AWS云端,没法访问你本地的localhost。测试本地Oracle的远程连接可用性
不要直接依赖DMS的测试,先自己在本地模拟远程连接场景,比如用sqlplus执行:sqlplus your_username/your_password@//<你的公网IP>:1521/<Oracle服务名>
如果这个连接能成功,说明Oracle本身已经允许远程访问;如果失败,你需要先给用户开通远程连接权限,或者调整TNS配置。打通AWS DMS到本地的网络(重中之重)
DMS的复制实例运行在AWS VPC里,要能访问到你的本地笔记本,必须满足:- 你的笔记本有公网IP,并且家里/公司的路由器、防火墙已经开放了1521端口(Oracle默认端口),允许来自DMS所在VPC的IP段访问。
- 可以临时在DMS的VPC里启动一个EC2实例,用
telnet <你的公网IP> 1521测试端口连通性——如果telnet不通,100%是网络防火墙的问题,先搞定这个再往下走。 - 要是你不想暴露公网IP,也可以搭VPN或者Direct Connect,但POC阶段用公网IP是最快的方式。
核对DMS源端点的配置细节
很多人在这里踩坑,一定要注意:- 服务器名称不能填
localhost!要填你的笔记本公网IP,因为DMS在云端,它的localhost指的是自己的复制实例,不是你的电脑。 - 端口要和Oracle监听器的端口一致(默认1521)。
- 数据库名称填Oracle的服务名(不是SID,除非你明确用SID格式连接)。
- 还要检查复制实例的安全组,确保它有出站访问1521端口到你公网IP的权限。
- 服务器名称不能填
如果用TNS连接字符串,检查格式是否正确
要是你在DMS端点里用了TNS连接字符串,确保里面的主机是公网IP,比如:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<你的公网IP>)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=<你的Oracle服务名>)))
别用内网IP或者localhost,DMS根本解析不到。
内容的提问来源于stack exchange,提问作者Yuva

