TNS-12555是监听器启动失败的结果而非根因,主因常为listener.ora语法错误、日志目录权限不足或ORACLE_HOME环境变量污染。
tns-12555 本质是监听器拒绝启动的“结果”,不是根因;真正卡住的,通常是权限不足或配置错位。
检查 listener.ora 配置是否触发隐式拒绝
Oracle 监听器对配置语法极其敏感,一处括号不匹配、一个空格多写,就可能静默失败并报 TNS-12555。它不会告诉你哪行错了,只会说“operation not permitted”——这其实是解析失败后的权限误报。
- 用
lsnrctl start启动时立即报TNS-12555,且lsnrctl status显示not running,大概率是配置文件语法问题 - 重点检查:
HOST值是否为真实可解析的主机名(不是localhost或127.0.0.1,除非明确配置为本地监听);PORT是否为整数,无引号包裹;所有括号是否成对闭合 - 临时验证法:把
listener.ora重命名为listener.ora.bak,运行lsnrctl start——若此时能启动(使用默认配置),说明原文件确实有硬伤
确认 Oracle 用户对日志目录有写权限
TNS-12555 经常被误读为“系统级权限缺失”,但更常见的是 Oracle 进程无法写入 $ORACLE_HOME/network/log/ 目录,导致监听器初始化阶段崩溃,最终返回这个错误。
- 执行:
ls -ld $ORACLE_HOME/network/log,确认属主是当前 Oracle 用户(如oracle:oinstall),且权限至少为drwxr-xr-x - 如果目录属主是
root或权限为750且组不可写,监听器会因无法创建或追加listener.log而退出 - 修复命令:
chown oracle:oinstall $ORACLE_HOME/network/log&&chmod 755 $ORACLE_HOME/network/log - 注意:不要直接
chmod 777,某些 Oracle 版本会因安全策略拒绝启动
验证 ORACLE_HOME 和环境变量是否污染
多个 Oracle 安装共存、或通过脚本临时设置过 ORACLE_HOME,极易让 lsnrctl 加载错误的库或配置路径,从而在启动时找不到依赖或误读配置,表现为 TNS-12555。
- 运行:
echo $ORACLE_HOME,确认输出是你期望的安装路径(如/u01/app/oracle/product/19c/dbhome_1) - 检查:
which lsnrctl输出是否在$ORACLE_HOME/bin/下;如果不是,说明 PATH 混入了其他 Oracle 的 bin 目录 - 最干净的测试方式:
$ORACLE_HOME/bin/lsnrctl start(显式调用,绕过 PATH 查找) - 若显式调用成功,说明环境变量混乱——应清理
.bash_profile或.bashrc中重复或冲突的ORACLE_HOME/PATH设置
真正棘手的不是 TNS-12555 这个错误码本身,而是它像一层雾:背后可能是配置里少了个右括号,也可能是日志目录被 chown root 锁死,还可能是你正用 12c 的 lsnrctl 去启动 19c 的监听器。先看日志——tail -f $ORACLE_HOME/network/log/listener.log,第一行没写进去,就别急着改端口。










