linux下用systemd配置lsnrctl开机自启最稳妥,关键在于环境变量就位、监听器配置有效:必须用绝对路径指定lsnrctl,user和group设为oracle,type设为simple,execstart显式写lsnrctl start,并确保oratab中sid_name与listener.ora一致且oracle_home路径正确。

Linux下用systemd配置lsnrctl开机自启
直接用systemd管理lsnrctl最稳妥,避免依赖dbstart的副作用。关键不是“能不能启动”,而是“启动时环境变量是否就位、监听器配置是否有效”。
-
lsnrctl路径必须写绝对路径,常见为/u01/app/oracle/product/19c/dbhome_1/bin/lsnrctl,用which lsnrctl或su - oracle -c "which lsnrctl"确认 -
User和Group必须设为oracle(不能是root),否则读不到$ORACLE_HOME/network/admin/listener.ora -
Type=simple更安全;Type=forking容易因后台进程识别不准导致systemctl status显示“inactive”但实际在跑 - 务必在
ExecStart里显式写start,别省略:ExecStart=/u01/app/oracle/product/19c/dbhome_1/bin/lsnrctl start
oratab里写错会导致lsnrctl启动静默失败
oratab不控制监听器,但它被dbstart调用时会间接影响——如果oratab里ORACLE_HOME路径错,dbstart连带执行的lsnrctl也会找不到二进制文件。
- 检查
/etc/oratab中对应实例行:第一段ORACLE_SID必须和listener.ora里SID_LIST_LISTENER下的SID_NAME一致(大小写敏感) - 第二段
ORACLE_HOME路径末尾不能有/,且必须存在bin/lsnrctl和network/admin/listener.ora - 第三段只能是
Y或N,y、yes、空格都会让dbstart跳过该行,进而可能漏启监听
Windows上监听器服务名容易看错
Windows下监听器不是独立服务,它绑定在OracleOraDB19Home1TNSListener这个服务上——名字里的19Home1取决于你安装时选的Oracle Home序号,不是固定值。
- 打开
services.msc后,不要只搜listener,得找全名:以OracleOraDB开头、含TNSListener结尾的服务 - 用命令行验证更准:
sc qc "OracleOraDB19Home1TNSListener"(把引号里的名字换成你实际看到的) - 必须确保该服务的
START_TYPE是AUTO_START,且DEPENDENCIES里没漏掉Tcpip或NetBIOS等底层网络服务
监听器启动成功但远程连不上?查listener.ora和防火墙
lsnrctl start返回STATUS=READY不代表能对外服务,常见断点在配置和系统层。
-
listener.ora里ADDRESS段的HOST不能写localhost或127.0.0.1,得填服务器真实IP或主机名(且/etc/hosts要能解析) -
firewalld或ufw默认拦1521端口,CentOS7需跑:sudo firewall-cmd --permanent --add-port=1521/tcp+sudo firewall-cmd --reload - Ubuntu上若用
ufw,执行:sudo ufw allow 1521
真正卡住人的地方,往往不是脚本写错,而是listener.ora里一个HOST填了localhost,或者systemd服务里User设成root导致权限拒绝读配置。











