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

教你一步步弄好数据库监听服务,别怕其实没那么复杂

先搞清楚“监听服务”到底是个啥?

想象一下,你的数据库是一座大房子,里面放着所有重要的数据(比如用户信息、订单记录),而你的应用程序(比如一个网站或者一个手机APP)就是一个想进房子拿东西或者放东西的客人。

现在问题来了,客人到了门口,怎么让房子里的人知道呢?他需要按门铃,对吧?这个“门铃系统”,就是数据库的监听服务,它的工作就是一直竖着耳朵听,看看有没有应用程序从网络上来敲门,一旦听到敲门声,它就负责开门,把应用程序的请求引导到数据库这个大房子里去。

如果监听服务没开,或者坏了,那就等于门铃坏了,客人(应用程序)在门口按了半天门铃,里面没反应,他就会报错,比如常见的“ORA-12541: TNS no listener”(Oracle数据库常见错误)或者“无法连接到服务器”之类的,这下你明白了吧?监听服务就是个负责网络通信的“中间人”。

第二步:最常见的监听问题出在哪儿?

绝大多数时候,问题不出在数据库本身,而是出在这个“门铃系统”的配置上,你可以想象成以下几种情况:

  1. 门铃根本没电(服务没启动): 这是最最简单的原因,可能因为电脑重启了,监听服务没有跟着自动启动,它还在那儿睡大觉呢。
  2. 门铃坏了,或者装错了(配置错误): 告诉别人门铃是装在A地址,结果你实际装在了B地址,客人当然找不到,在数据库里,这就是配置文件写错了。
  3. 客人记错了门牌号(连接信息错误): 应用程序用来连接数据库的地址、端口号写错了,它跑去敲别人家的门了,那肯定连不上。

我们排查问题,也基本是顺着这个思路来。

第三步:动手检查,一步步来(以常见的Oracle数据库为例)

别怕,我们一步步来操作,你打开电脑的命令行窗口(Windows叫CMD或PowerShell,Linux/Mac叫终端)。

先看看“门铃”在不在工作(检查监听状态)

敲入命令: lsnrctl status (这个lsnrctl就是Oracle专门用来管理监听服务的工具)

教你一步步弄好数据库监听服务,别怕其实没那么复杂

如果一切正常,你会看到一屏幕信息,里面会明确写着“监听程序支持的服务...”以及“服务摘要”,下面会列出你的数据库名字,状态显示为“READY”或“UNKNOWN”(有时候显示UNKNOWN也没关系,只要能连上就行)。

如果提示“找不到命令”或者没反应,那说明:

  • 要么你的数据库软件根本没装好。
  • 要么你这个命令行环境没配置好数据库的路径,这个稍微复杂点,你可能需要问问安装数据库的人,或者找到Oracle的安装目录,进去再执行这个命令。

如果发现“门铃”没开,那就把它启动起来

敲入命令: lsnrctl start

你会看到提示“监听程序启动成功”之类的信息,然后再用lsnrctl status检查一下,应该就正常了。

如果服务启动了还连不上,那可能是“门牌号”搞错了(检查配置)

教你一步步弄好数据库监听服务,别怕其实没那么复杂

监听服务的配置,通常写在一个叫listener.ora的文件里,这个文件在哪里呢?它一般在数据库软件的安装目录下,比如$ORACLE_HOME/network/admin/listener.ora$ORACLE_HOME是个环境变量,代表你的Oracle安装根目录)。

你不用怕这个文件,用记事本之类的文本编辑器打开它看看,关键是要看这几行:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = your_hostname)(PORT = 1521))
    )
  )

这里面的HOSTPORT门铃”安装的地址和端口。HOST通常是你的电脑名或者IP地址,PORT默认是1521。

应用程序那边用来连接数据库的信息,写在另一个叫tnsnames.ora的文件里(它通常和listener.ora在同一个文件夹)。 你也打开它看看,里面会有一段配置,长得差不多:

YOUR_DB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = your_hostname)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = your_service_name)
    )
  )

你要确保的是: tnsnames.ora文件里写的HOSTPORT,必须和listener.ora文件里写的完全一样!就像一个客人说他要去“幸福路123号”按门铃,那你家的门铃就必须装在“幸福路123号”,差一点都不行。

第四步:一些简单的排查技巧

  • ping一下地址: 在命令行里ping一下listener.ora里配置的那个HOST名字或者IP地址,看网络通不通,命令是ping your_hostname
  • 检查防火墙: 这是个大坑!很多时候数据库本身没问题,是电脑的防火墙把1521端口(或者你自定义的端口)给拦住了,你需要去防火墙设置里,添加一个入站规则,允许这个端口的TCP通信,具体怎么操作,你可以搜索“Windows如何开放端口”或“Linux开放端口”。
  • 重启大法: 如果搞不清楚,有时候最简单有效的办法就是按顺序重启一下相关服务,先关掉监听 lsnrctl stop,然后再启动 lsnrctl start,如果还不行,可以尝试重启一下数据库实例本身(这个操作稍微重一点,确保没人用的时候再做)。

就像修门铃:

  1. 先按一下门铃(lsnrctl status,听响不响。
  2. 不响就看看是不是没电(lsnrctl start,给它通上电。
  3. 通电了还不响,就检查一下线路(listener.oratnsnames.ora,看有没有接错线。
  4. 最后看看是不是有人把门铃用纸盒子盖住了(防火墙),把盒子拿开。

整个过程就是这样,没什么神秘的,你只要心细,一步步对照着检查,绝大多数监听问题都能自己解决,希望这个比喻能帮到你,以后遇到这个问题就不用慌啦!