分类: Oracle
2017-12-19 17:40:51
【摘要】
在使用sqlplus登录数据库时,有时会出现无法登录的现象,很大程度的原因是在登录方式的配置上被修改了。这里主要介绍Oracle在linux环境下通过操作系统认证和口令文件认证登录的区别及其配置方法。
Oracle登录认证有两种方式,一种是基于操作系统的登录认证,另外一种是基于口令文件的登录认证。我们经常使用的sqlplus / as sysdba登录,不需要输入用户密码,就是属于操作系统的认证。可以通过改变sqlnet.ora文件,可以修改登录认证方式。
sqlnet.ora是位于$ORACLE_HOME/network/admin目录下的一个配置文件,用于指定oracle对连接字符串的解析方式,一般只包含一个参数即SQLNET.AUTHENTICATION_SERVICES,不同于windows系统,赋值NTS对Linux是不适用的(在windows环境下,SQLNET.AUTHENTICATION_SERVICES=(NTS) 表示采用操作系统本地认证方式)。
在linux环境下,在SQLNET.AUTHENTICATION_SERVICES的值设置为ALL,或者不设置的情况下,OS验证才能成功;设置为其他任何值都不能使用OS认证。
具体实验如下:
1. SQLNET.AUTHENTICATION_SERVICES=NONE或其它任何值:
使用sqlplus / as sysdba报错:ORA-01031: insufficient privileges
此时不能使用操作系统认证方式,但可以使用口令文件的登录认证:
sqlplus user/password 或者 sqlplus user/password@service_names
2. SQLNET.AUTHENTICATION_SERVICES=ALL
关闭本机密码文件认证,使用操作系统认证,但远程<异机>可以使用密码文件认证,这里可以使用sqlplus user/password登录,但如果使用sqlplus user/password@service_names,则会报错:
ORA-12641: Authentication service failed to initialize
此时无法通过service_names的方式连接。
3. SQLNET.AUTHENTICATION_SERVICES= (等于空,不赋值)
作用相当于把sqlnet.ora整个文件删除,此时所有登陆方式均可以用。
该参数在Oracle数据库实例的初始化参数文件中,控制着密码文件的使用及其状态,即使用口令文件认证登录时,会受到该参数的影响。
Oracle的口令文件也叫密码文件,用于存放用户的密码,存放目录为$ORACLE_HOME/dbs/orapw
1. none:不使用密码文件认证。
2. exclusive:默认参数值,要密码文件认证,但只有一个数据库实例可以使用该文件。
3. shared:口令文件认证方式,可有多个数据库实例使用此文件,但是此设置下,只有INTERNAL/SYS帐号能被识别,即使文件中存有其他用户的信息,也不允许他们以SYSOPER/SYSDBA登录
实验:将REMOTE_LOGIN_PASSWORDFILE的值修改为none
SQL> alter system set remote_login_passwordfile=none scope=spfile;
注意:这个参数不是动态参数,修改以后需要重新启动数据库才能够生效。
修改完成后,可以正常OS认证登录,可以使用口令文件登录,但不可以远程以SYSDBA身份登陆,该现场与缺失口令文件的情况一致,报错如下:
[oracle@localhost dbs]$ sqlplus sys/oracle@orcl as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Mon Jan 5 21:11:02 2015
Copyright (c) 1982, 2009, Oracle. All rights reserved.
ERROR:
ORA-01031: insufficient privileges
1、在发现登录失败时,尝试多种登录方式以确定原因;
2、不轻易修改数据库的默认配置,任何参数修改的操作都要有操作记录;
3、windows环境与linux不同,相比之下linux的登陆配置很简单。
4、如果丢失了口令文件,可通过下述方法重建(linux环境下):
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password='' entries=n force=y
(其中entries参数表示这个密码文件最多可以支持多少个sysdba/sysoper用户,force=y表示允许覆盖)