使用'/ 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
相关产品推荐
相关产品推荐

