You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用'/ as sysdba'连接Oracle 12.2 NON-CDB时遇ORA-12154错误

解决sqlplus '/ as sysdba'报ORA-12154的问题

先理清楚你的现状:你用的是Oracle 12.2 NON-CDB,oracle用户归属dba和oinstall组,密码文件已经用ORAPWD工具创建完成,ORACLE_HOME和ORACLE_SID也都设置为了DBALIAS。远程连接、带密码的本地连接都能正常使用,但用操作系统认证的/ as sysdba方式就报错ORA-12154,咱们一步步来排查解决:

1. 检查tnsnames.ora的本地解析配置

别看/ as sysdba是操作系统认证,Oracle依然会尝试解析本地的SID对应信息,这是很多人容易忽略的点:

  • 前往$ORACLE_HOME/network/admin目录找到tnsnames.ora,确认其中存在DBALIAS的配置条目,格式参考如下:
    DBALIAS =
      (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SID = DBALIAS)  # NON-CDB环境用SID更稳妥,若用服务名可改为SERVICE_NAME=DBALIAS
        )
      )
    
  • 另外别忘了检查TNS_ADMIN环境变量,如果该变量已设置,Oracle会优先去$TNS_ADMIN目录下读取tnsnames.ora,而非默认路径,若此处文件配置错误也会导致解析失败。

2. 确认sqlnet.ora的操作系统认证开关

操作系统认证能否生效,sqlnet.ora里的参数是核心:

  • 打开$ORACLE_HOME/network/admin/sqlnet.ora,查找SQLNET.AUTHENTICATION_SERVICES参数,它的值必须包含BEQ(Linux/Unix环境下本地认证依赖该值,Windows环境对应为NTS),示例配置:
    SQLNET.AUTHENTICATION_SERVICES = (BEQ)
    
    若没有该参数或值中缺少BEQ,添加/修改后重启监听服务(执行lsnrctl stop再lsnrctl start)。

3. 再次核对环境变量的正确性

你说已经设置了ORACLE_HOME和ORACLE_SID,但还是要做个确认:

  • 执行echo $ORACLE_HOME和echo $ORACLE_SID,确保输出的路径和SID名称完全正确
  • 检查PATH环境变量是否包含$ORACLE_HOME/bin,否则sqlplus可能无法找到正确的执行文件
  • 提醒一句:如果是从root用户切换到oracle用户,一定要用su - oracle而非su oracle,前者会加载oracle用户的profile配置,确保环境变量完全生效。

4. 验证密码文件与目录权限

  • 密码文件默认路径为$ORACLE_HOME/dbs/orapw$ORACLE_SID,也就是orapwDBALIAS,你已经创建完成,确认文件名无误即可
  • 检查oracle用户对$ORACLE_HOME/dbs目录及密码文件是否拥有读权限,权限不足会影响认证流程
  • 你已经通过id oracle确认用户在dba组,这一步基本没问题,也可以再执行groups oracle二次验证。

5. 用简化方式测试本地连接

如果以上步骤都没问题,试试绕开tnsnames的直接连接:

sqlplus /nolog
SQL> connect / as sysdba

若仍报错,尝试用BEQ协议直接连接(完全跳过tnsnames解析):

sqlplus sys/pw@(DESCRIPTION=(ADDRESS=(PROTOCOL=BEQ)(PROGRAM=oracle)(ARGV0=oracleDBALIAS)(ARGS='(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=BEQ)))'))(CONNECT_DATA=(SID=DBALIAS))) as sysdba

如果这个命令能成功连接,那问题肯定出在tnsnames.ora的解析配置上。

6. 检查监听的服务注册状态

最后确认监听是否正确注册了你的实例:
执行lsnrctl status,输出内容中应该包含类似以下的信息:

Services Summary...
Service "DBALIAS" has 1 instance(s).
  Instance "DBALIAS", status READY, has 1 handler(s) for this service...

若未找到该服务,重启数据库和监听:

sqlplus SYS/PW@DBALIAS as sysdba
SQL> shutdown immediate;
SQL> startup;
SQL> exit;
lsnrctl stop
lsnrctl start

一般来说,按这个流程排查下来,/ as sysdba的连接问题就能解决了,大多是tnsnames解析或sqlnet配置的小疏漏。

内容的提问来源于stack exchange,提问作者oradbanj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:48:11