Borderline ServerFault问题,但我想先在这里尝试一下,因为我过去对Oracle的问题很满意。
我正在尝试从PHP连接到oracle数据库,我收到以下错误。
ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
这是PHP报告的错误,以及Oracle的listener.log中显示的错误。
我当前的问题是解决此错误。我想回答的一个更大的问题是Oracle连接模型是如何工作的?
这是在我的本地Windows机器上运行的开发环境中,并且一直在运行。不幸的是,环境交给了我(我没有设置它),做设置它的人无法帮我调试它。
如果我在MySQL或PostgreSQL(我更熟悉的两个系统)中遇到类似的错误,我会检查以确保数据库进程正在运行,然后尝试使用用户名手动连接到数据库/ password /连接字符串。不幸的是,我不熟悉Windows上的Oracle工具(除了SQL Developer),我不知道什么是TNS:监听器或SID在Oracle的上下文中(我有一些模糊的想法,但模糊的想法很少有帮助你正在调试这样的东西)
任何一般性建议都将受到赞赏。
每条评论更新:
我的tnsnames.ora文件中有很多内容,相关条目是
OBS2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = steel-ae39650)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = OBS2)
)
)
当我运行
时,这不会反映在实例列表中 LSNRCTL> services
所以我认为我的下一个问题是,如何尝试手动启动OBS2实例?
答案 0 :(得分:7)
TNS名称就像是服务实例的别名。在这方面,TNS监听器服务为您提供一种查找服务。如果您尝试通过TNS名称连接的实际服务无效,则该错误消息将失败。
然后,您可以测试以查看TNS监听器是否使用命令行工具正确查看服务:
%>lsnrctl services
哪个应该输出如下内容:
Service "myservice" has 1 instance(s).
Instance "myinstance", status READY, has 1 handler(s) for this service...
Handler(s):
"D000" established:0 refused:0 current:0 max:1002 state:ready
DISPATCHER <machine: LOCALHOST, pid: 12345>
(ADDRESS=(PROTOCOL=tcp)(HOST=LOCALHOST)(PORT=6789))
您能否发布相关的TNS条目(在tnsnames.ora
文件中)?它位于ORAHOME \ client或db \ ADMIN \ NETWORK中。如果您同时拥有客户端和服务器,请确保tnsnames.ora
文件的两个副本都具有正确的值,以确保安全。
以下是tnsnames.ora
中名为'mydb'的正确TNS名称定义的示例:
myDbAlias =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 12345)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = myservice)
)
)
答案 1 :(得分:2)
只是想补充一点,因为我最近有一个类似的连接问题让我疯狂,直到我弄清楚发生了什么。
首先,关键字SID和SERVICE_NAME并不完全相同。这是我第一个错误的假设。在许多环境中,您可以互换SID和SERVICE_NAME,但并非总是如此。
也就是说,您的错误消除了问题:您在连接字符串中指定 SID ,而不是tnsnames成功使用的 SERVICE_NAME 。
因此,如果您在代码中指定连接字符串,请尝试在连接字符串中使用SERVICE_NAME关键字(*或者,如果您已使用SERVICE_NAME且无法连接,请尝试使用SID关键字*)。
我知道过于简单的回答,但很容易尝试,可能会让某些人感到头疼。
希望有所帮助。
答案 2 :(得分:1)
Mike Atlas的答案相当全面,但请注意,您可以使用[//] host_name [:port] [/ service_name]
连接到没有已发布的tnsname的10g(或更高版本)数据库HTH
下进行。