不编辑tnsnames.ora时如何在bash脚本中正确连接sqlplus
ORA-12514报错根因
你此前尝试的两种sqlplus连接写法,本质都是把SID作为连接标识传给了数据库监听。监听接收到连接请求时,会匹配自己动态注册的服务列表,如果请求的标识不在列表中,就会返回ORA-12514: TNS:listener does not currently know of service requested in connect descriptor错误。全程不需要修改tnsnames.ora配置文件,使用Oracle原生的EZConnect连接能力即可完成bash脚本中的调用。
无tns配置的标准连接写法
EZConnect是Oracle内置的免本地网络配置的连接方式,符合要求的语法规则如下:
- 基础结构为:
用户名/密码@数据库主机地址:端口/服务名 - 斜杠后必须填写*数据库注册在监听上的服务名(Service Name),而非SID,这是绝大多数连接报12514的核心原因
- 两者的区别:
- SID是数据库实例的唯一短标识,仅在实例运行的本地环境生效
- 服务名是数据库对外提供连接的全局标识,通常格式为
实例名.域名,可通过数据库内部查询语句show parameter service_names获取准确值
不同场景的可直接复用的命令格式
以下写法均不需要编辑本地tnsnames.ora文件,可直接写入bash脚本执行:
- 已知准确服务名的常规连接:
sqlplus -s username/password@数据库主机IP:端口号/查询到的准确服务名 - 数据库使用默认1521端口时的简化写法:
sqlplus -s username/password@数据库主机IP/查询到的准确服务名 - 必须使用SID连接时的扩展语法(同样不需要tns配置):
sqlplus -s username/password@数据库主机IP:端口号/?SID=你的实例SID值
避坑提示
- 不要将SID放在冒号分隔的主机、端口段之后拼接,如
@主机:端口:SID、@主机:端口/SID这类写法,会被Oracle客户端错误解析为请求不存在的同名服务,直接触发12514报错 - 连接前可先用同格式的
tnsping 主机:端口/服务名命令做连通性测试,返回正常后再写入脚本,减少重复调试成本 - 如需指定连接的服务器模式(如专有连接),可直接在连接串末尾追加参数,如
username/password@主机:端口/服务名?SERVER=DEDICATED,无需修改任何本地配置文件
内容的提问来源于stack exchange,提问作者Tim Scott
相关产品推荐
相关产品推荐

