当前位置:首页 > 问答 > 正文

ORA-12196错误怎么回事远程连不上数据库报错修复经验分享

这个ORA-12196错误,我碰到过好几次,都是别人火急火燎地跑过来说数据库连不上了,尤其是从别的电脑或者程序去连的时候,根据我在网上查的资料和自己实际处理的经验,比如在Oracle官方支持社区、一些技术博客像“ORAERROR”和“DBATechNews”上看到的,这个错误的核心问题其实很简单,就是数据库服务器“认不出”或者“不允许”你用来连接的那个网络服务名。

通俗点讲,你想去一个朋友家做客(连接数据库),你手里拿了个地址条(网络服务名),但这个地址条上写的信息,要么是错的,要么你朋友家根本就没登记这个地址,所以你找上门的时候,对方一看,不认识这个地址,就把你拦在门外了,还给你一张纸条写着“ORA-12196”。

这个“地址条”就是你的tnsnames.ora文件里的一个条目,这个文件就像一个本地通讯录,告诉你的电脑怎么找到数据库,ORA-12196错误,十有八九就是这个通讯录出了问题,根据“Oracle Base”博客里的排查思路,我一般会按下面几个步骤来检查:

第一步,也是最关键的一步:检查你的“通讯录”文件(tnsnames.ora)

这个文件在哪里呢?它通常在Oracle软件的安装目录下,比如[ORACLE_HOME]\network\admin这个文件夹里,如果你的电脑上装了多个Oracle客户端,你可能需要确认一下你用的那个程序(比如SQL*Plus、PL/SQL Developer)到底是在读取哪个目录下的tnsnames.ora文件,你可以设置一个叫TNS_ADMIN的环境变量来指定它的位置。

打开这个文件,找到你正在使用的那个网络服务名对应的配置块,它大概长这个样子:

你的服务名 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 你的数据库服务器IP或主机名)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = 数据库的实际服务名)
    )
  )

你需要像侦探一样,仔细核对这里面每一项:

  1. HOST对不对? 这里填的必须是数据库服务器那台电脑的IP地址,或者是在网络里能被正确解析的主机名,你可以在你的电脑上打开命令提示符,ping一下这个IP或主机名,看能不能通,如果ping不通,那可能就是网络问题或者地址写错了。
  2. PORT对不对? 默认是1521,但有些数据库可能会用别的端口,你得确认数据库监听器实际监听的端口号是多少,和这里写的是否一致。
  3. SERVICE_NAME对不对? 这是最常出问题的地方之一!这里必须填成数据库那边实际存在的服务名,绝对不能写错,你不能自己随便编一个名字,这个正确的服务名,需要去问数据库管理员(DBA),或者DBA可以在数据库服务器上通过查v$database视图等方式看到。

第二步:检查数据库服务器那边的“门卫”(监听器)

你的“地址条”就算写对了,万一朋友家今天的门卫(监听器)没上班,或者不认识你纸条上写的“主人名字”(服务名),也一样会把你拦下来,这就是ORA-12196的另一个常见原因,根据“ORAERROR”网站上的解释,这意味着监听器虽然运行着,但它没有为你尝试连接的那个服务名提供服务。

这时候,通常需要数据库服务器那边的管理员来帮忙检查监听器的状态,他们需要:

  1. lsnrctl status命令查看监听器的状态,在输出的信息里,会有一个“服务摘要”列表,里面列出了当前监听器所支持的所有服务名。
  2. 仔细看看这个列表里,有没有包含你正在连接的那个服务名,如果没有,那问题就找到了,可能的原因是数据库实例没有注册到监听器,或者监听器配置文件listener.ora配置有误。

第三步:检查网络连通性

这个虽然基础,但也很重要,就像你地址条写得再对,但如果通往朋友家的路封了,你也到不了,你需要确保从你的电脑能连接到数据库服务器的IP地址和端口。

可以用telnet命令来测试,比如在命令提示符下输入telnet 数据库服务器IP 1521,如果黑屏一闪就卡住或者出现一些乱码,通常说明网络和端口是通的,如果提示“无法打开到主机的连接”,那说明网络不通或者防火墙拦住了。

我遇到的一个实际例子

有一次,一个开发同事跑来跟我说他的程序连不上测试库了,报的就是ORA-12196,我先让他把连接字符串发给我看,我一看,他用的服务名是TESTDB,我立刻去检查他电脑上的tnsnames.ora文件,发现里面TESTDB条目的SERVICE_NAME写的是testdb(小写),然后我登录到数据库服务器,用lsnrctl status一看,监听器里注册的服务名明明是TESTDB(大写),问题就出在这里!Oracle在某些平台上是区分大小写的,我让他把tnsnames.ora里的SERVICE_NAME改成大写的TESTDB,问题马上就解决了。

总结一下

碰到ORA-12196,别慌,它不是什么高深莫测的错误,多半是配置上的小疏忽,你就把自己想象成一个快递员,按照“收件地址”(tnsnames.ora配置)-> “小区门卫”(监听器状态)-> “道路通畅”(网络连接)这个顺序一步步排查,大概率能找到问题所在,如果自己搞不定,一定要及时把详细的错误信息和你的连接配置截图发给DBA,他们能从服务器端帮你快速定位问题。

ORA-12196错误怎么回事远程连不上数据库报错修复经验分享