在服务器配置好Python开发环境,进行数据库连接测试时发现,程序运行报错:
cx_Oracle.DatabaseError:ORA-12154:TNS:无法解析指定的连接标识符
分析:在我本机电脑测试数据库连接正常,服务器有问题,服务器的数据库使用正常,任务计划也正常运行
进行tnsping
Oracle Net 工具(命令)tnsping,是一个OSI会话层的工具,它用来:
1)验证名字解析(nameresolution,当然是oracle自己的网络服务名)
2)远程的listener是否启动
1.tnsping需要使用TCP,所以需要3次握手建立连接,而ping只使用IP,所以不需要3次握手,这也就解释了为什么有的机器不能ping通,但是用tnsping确能测试通。
2.tnsping通,并不能说明客户端能与数据库建立连接。因为ping通只能说明客户端能解析listener的机器名,而且listener也已经启动,但是并不能说明数据库已经打开,而且tsnping的过程与真正客户端连接的过程也不一致。
但是如果不能用tnsping通,则肯定连接不到数据库。
命令格式:
tnsping IP地址:端口号/数据库服务名 [count]
tnsping 网络服务名 [count]
比如:tnsping localhost:1521/study
发现TNS连接异常,可以看到对应TNS连接的配置文件目录
找到对应目录sqlnet.ora,发现为空并没有对应的TNS配置,有另一个TNS配置文件tnsnames.ora,有对应的TNS配置
文件内容形如:
STUDYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =(PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME= study)
)
)
将tnsnames.ora TNS配置复制到sqlnet.ora,tnsping OK,Python测试OK,问题解决。
注:一般的TNS无法解析首先查看对应.ora文件配置是否正常。
彻底解决ora-12545错误,需要:
1) 配置一个域名服务器,并正确的设置客户端机器的域名服务器
2) 将服务器的机器名与ip配置在客户端的hosts文件中.
3) 将客户端tnsnames.ora和listener.ora中的地址部分都改为ip地址,而不是用机器名
4) 将客户端的连接改为专用连接,这样会避免redirect现象。(适用与客户端tnsnames.ora中为服务器的ip地址的情况下)