1. 程式人生 > >ora-01031:insufficient privileges解決方法總結

ora-01031:insufficient privileges解決方法總結


主要是 sqlnet.ora 檔案和 remote_login_passwordfile 引數影響。


一直以來,我記住的一個知識點就是:SQLNET.AUTHENTICATION_SERVICES=(NTS)是使用OS認證的必須條件之一。
今天一個偶然的機會,才知道這個結論是不完全準確的。


在本文的測試中,remote_login_passwordfile的值都為EXCLUSIVE,相關使用者所屬組也設定正確。

先看windows下的測試:
--設定為NTS,OS驗證成功
E:oracleora92in>cat .. etworkadminSQLNET.ORA
SQLNET.AUTHENTICATION_SERVICES= (NTS)
E:oracleora92in>sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 8月 15 22:34:56 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


連線到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

[email protected]
>  

--下面把SQLNET.ORA的內容註釋掉,OS驗證成功
E:oracleora92in>cat .. etworkadminSQLNET.ORA
#SQLNET.AUTHENTICATION_SERVICES= (NTS)

再次登入:
E:oracleora92in>sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 8月 15 22:36:09 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

ERROR:
ORA-01031: insufficient privileges

--設定為 NONE,OS驗證失敗
E:oracleora92in>cat .. etworkadminSQLNET.ORA
SQLNET.AUTHENTICATION_SERVICES= (NONE)
E:oracleora92in>sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 8月 15 22:50:33 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

ERROR:
ORA-01031: insufficient privileges

--設定為ALL,OS驗證成功
E:oracleora92in>cat .. etworkadminSQLNET.ORA
SQLNET.AUTHENTICATION_SERVICES= (ALL)
E:oracleora92in>sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 8月 15 22:51:21 2007

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


連線到:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

[email protected]
>

登入失敗,說明當前設定不允許作業系統認證。
這個例子也說明了:在windows下,SQLNET.AUTHENTICATION_SERVICES必須設定為NTS或者ALL才能使用OS認證。

接著再看看在linux下的情況:

--設定為NTS,OS驗證失敗
[[email protected] admin]$ cat sqlnet.ora  
SQLNET.AUTHENTICATION_SERVICES= (NTS)
[[email protected] admin]$ sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on Wed Aug 15 23:08:53 2007

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

ERROR:
ORA-01031: insufficient privileges

--註釋掉,相當於什麼都不設定,OS驗證成功
[
[email protected]
admin]$ cat sqlnet.ora  
#SQLNET.AUTHENTICATION_SERVICES= (NTS)
[[email protected] admin]$ sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on Wed Aug 15 23:06:17 2007

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning and Data Mining options

SQL>  

--設定為NONE,OS驗證失敗
[[email protected] admin]$ cat sqlnet.ora  
SQLNET.AUTHENTICATION_SERVICES= (NONE)
[[email protected] admin]$ sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on Wed Aug 15 23:07:07 2007

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

ERROR:
ORA-01031: insufficient privileges

--隨便設定一個值,OS驗證失敗
[[email protected] admin]$ cat sqlnet.ora  
SQLNET.AUTHENTICATION_SERVICES= (aaa)
[[email protected] admin]$ sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on Wed Aug 15 23:14:45 2007

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

ERROR:
ORA-01031: insufficient privileges

--設定為ALL,OS驗證成功
[[email protected] admin]$ cat sqlnet.ora  
SQLNET.AUTHENTICATION_SERVICES= (ALL)
[[email protected] admin]$ sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on Wed Aug 15 23:07:54 2007

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning and Data Mining options

SQL>  

從以上測試知道:在linux下,在SQLNET.AUTHENTICATION_SERVICES的值設定為ALL,或者不設定的情況下,OS驗證才能成功。

從測試可以看出,windows和linux下要實現OS驗證,SQLNET.AUTHENTICATION_SERVICES的設定要求是不一樣的,甚至是相反的,為什麼呢?

我們看看ORACLE對這個設定是怎麼解釋的:
SQLNET.AUTHENTICATION_SERVICES
Purpose

Use the parameter SQLNET.AUTHENTICATION_SERVICES to enable one or more authentication services. If authentication has been installed, it is recommended that this parameter be set to either none or to one of the authentication methods.
Default
None

Values
Authentication Methods Available with Oracle Net Services:

* none for no authentication methods. A valid username and password can be used to access the database.
* all for all authentication methods
* nts for Windows NT native authentication

Windows NT native authentication

An authentication method that enables a client single login access to a Windows NT server and a database running on the server.

從oracle的解釋可以知道,SQLNET.AUTHENTICATION_SERVICES=(NTS)是WINDOWS系統專用的,對linux/UNIX是不適用的。

最後做一個簡單的總結:
1、在windows下,SQLNET.AUTHENTICATION_SERVICES必須設定為NTS或者ALL才能使用OS認證;不設定或者設定為其他任何值都不能使用OS認證。
2、在linux下,在SQLNET.AUTHENTICATION_SERVICES的值設定為ALL,或者不設定的情況下,OS驗證才能成功;設定為其他任何值都不能使用OS認證。


===============


1.OS認證
Oracle安裝之後預設情況下是啟用了OS認證的,這裡提到的os認證是指伺服器端os認證。OS認證的意思把登入資料庫的使用者和口令校驗放在了作業系統一級。如果以安裝Oracle時的使用者登入OS,那麼此時在登入Oracle資料庫時不需要任何驗證,如:
SQL> connect /as sysdba
已連線。
SQL> connect sys/[email protected] as sysdba
已連線。
SQL> connect sys/bbb as sysdba
已連線。
SQL> connect aaa/bbb as sysdba
已連線。
SQL> show user
SYS
SQL>
不論輸入什麼使用者(哪怕這個使用者如aaa在資料庫中根本不存在),只要以sysdba許可權連線資料庫,都可以連線上,並且連線使用者是sys,這樣很方便,有時候,如果忘記了資料庫的密碼,而又想登入資料庫,可以通過這種方式,前提是在資料庫伺服器上.

但是方便的同時也帶來了一些安全隱患,於是很多人想遮蔽os認證,

在win下只要把oracle_home/NETWORK/admin/sqlnet.ora中的SQLNET.AUTHENTICATION_SERVICES= (nts)nts改成none或者註釋掉這句話(在前面加上#),就可以遮蔽os功能,要想以sys使用者連上資料庫必須輸入正確的sys口令,或者可以把oracle的安裝使用者從組ora_dba中刪除掉,當然也可以直接把ora_dba這個組也刪除,都可以遮蔽os功能.如:
SQL> connect /as sysdba
ERROR:
ORA-01031: 許可權不足
SQL> connect sys/aaa as sysdba
ERROR:
ORA-01017: 使用者名稱/口令無效; 登入被拒絕
SQL> connect aaa/bbb as sysdba
ERROR:
ORA-01031: 許可權不足
SQL> connect sys/system as sysdba
已連線。
SQL>

在unix/linux下也可以在檔案sqlnet.ora中增加SQLNET.AUTHENTICATION_SERVICES=(none)以及刪除dba(groupdel dba)組或者把oracle使用者從dba組中刪除都可以遮蔽os認證。利用這兩種方法遮蔽os功能似乎總有些讓人不放心,或者說不能讓人完全信服,因為畢竟系統管理員還是可以建立ora_dba or dba組以及修改sqlnet.ora檔案......


2. 口令檔案
Oracle的口令檔案的作用是存放所有以sysdba或者sysoper許可權連線資料庫的使用者的口令,如果想以sysdba許可權遠端連線資料庫,必須使用口令檔案,否則不能連上,由於sys使用者在連線資料庫時必須以sysdba or sysoper方式,也就是說sys使用者要想連線資料庫必須使用口令檔案,因此我認為在資料庫中存放sys使用者的口令其實沒有任何意義!使用口令檔案的好處是即使資料庫不處於open狀態,依然可以通過口令檔案驗證來連線資料庫。開始安裝完oracle,沒有給普通使用者授予sysdba許可權,口令檔案中只存放了sys的口令,如果之後把sysdba許可權授予了普通使用者,那麼此時會把普通使用者的口令從資料庫中讀到口令檔案中儲存下來,當然這時必須要求資料庫處於open狀態。如:
SQL> grant sysdba to test;
授權成功。
SQL> connect test/[email protected] as sysdba
ERROR:
ORA-01017: 使用者名稱/口令無效; 登入被拒絕
警告: 您不再連線到 ORACLE。
SQL> connect test/[email protected] as sysdba
已連線。
SQL> alter database close;
資料庫已更改。
SQL> grant sysdba , sysoper to test;
grant sysdba , sysoper to test
*
第 1 行出現錯誤:
ORA-01109: 資料庫未開啟

到底有幾個使用者被授予了sysdba或者sysoper許可權,可以通過查詢如下v$pwfile_users獲得,v$pwfile_users的資訊就是源於口令檔案的.

SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
TEST TRUE FALSE


到底可以有幾個使用者被授予sysdba或者sysoper許可權,是由建立口令檔案時指定的entries數決定的,準確的說還不完全是,最終還和os block的大小有關,如果entries指定了5,一個os block可以存放8個使用者的口令,那麼可以由8個使用者被授予sysdba或者sysoper。

還有一個問題修改了口令,口令長度增加了,按說佔用的空間多了,事實是不論我們的口令多長,加密之後的長度幾乎都是相同的,也就是說口令檔案佔用的大小和口令指定的長度幾乎關係不大!

C:>orapwd file=databasepwd.ora password=system entries=5
OPW-00005: 存在相同名稱的檔案 - 請刪除或重新命名
C:>orapwd file=databasepwd.ora password=system entries=5 force=y

建立口令檔案需要注意的是=前後沒有空格!另外值得一提的是10g增加了一個新的引數force default值n,它的作用類似於建立表空間時的reuse功能,當同名檔案存在時是否覆蓋。

是否使用口令檔案,是通過oracle提供的一個引數remote_login_passwordfile來控制的,remote_login_passwordfile有none,shared,exclusive3個值,
none表示不使用口令檔案,停用口令檔案驗證,Oracle資料庫不允許遠端SYSDBA/SYSOPER身份登入
exclusive表示例項獨佔使用口令檔案,也就是各自例項使用單獨的口令檔案,
shared表示多個例項共享一個口令檔案,預設情況下,win下口令檔案的格式是pwdsid.ora,unix下的格式是orapwSID(大小寫敏感), Oracle資料庫在啟動時,首先查詢的是orapw<sid>的口令檔案,如果該檔案不存在,則開始查詢,orapw的口令檔案,如果口令檔案命名為orapw,多個數據庫就可以共享.

SQL> alter system set remote_login_passwordfile=exclusive scope=spfile;   

3. 修改使用者密碼

//檢視使用者
SQL> select username,password from dba_users;

SQL> alter user system identified by manager;

4. sys/system 密碼丟失的處理方法:

1).查詢檢視V$PWFILE_USERS,select * from V$PWFILE_USERS;
 記錄下擁有 SYSOPER/SYSDBA 系統許可權的使用者 資訊
2).關閉資料庫 shutdown immediate
3).刪除密碼檔案,檔案路徑一般為:ORACLE_HOME\DATABASE,檔名為 PWD<SID>.ORA
4).建立密碼檔案  
  ORAPWD FILE=< FILENAME > PASSWORD =< PASSWORD >
5).向密碼檔案中增加使用者
  CONNECT SYS/internal_user_passsword AS SYSDBA;
  啟動資料庫例項並開啟資料庫; 建立相應使用者帳號,對其授權  
  授予 許可權:GRANT SYSDBA TO user_name(如果先前資料庫 只有sys具有sysdba許可權,可不做這步)
6).修改密碼檔案狀態,預設密碼檔案的狀態shared,要將初始化引數裡的  
  REMOTE_LOGIN_PASSWORDFILE 設定成EXCLUSIVE   

SQL> alter system set remote_login_passwordfile=exclusive scope=spfile;

相關推薦

在Linux環境下設定 ora-01031:insufficient privileges解決方法總結

今天需要使用sys使用者處理問題,但是報錯上面ora-01031:insufficient privileges。 在網上有很多方法,這個是自己經過測試的方法步驟。 1:首先檢查檔案sqlnet.ora檔案是否設定正確(檔案地址就是你oracle安裝的目錄)# sqlnet

ora-01031:insufficient privileges解決方法總結

主要是 sqlnet.ora 檔案和 remote_login_passwordfile 引數影響。 一直以來,我記住的一個知識點就是:SQLNET.AUTHENTICATION_SERVICES=(NTS)是使用OS認證的必須條件之一。 今天一個偶然的機會,才知道這個結論是不完全準確的。 在本文的測試中,

ora-01031:insufficient privileges解決方法總結 .

sqlplus "/ as sysdba" 連不上,報ora-01031:insufficient privileges解決方法 注意多個數據庫例項時候,set ORACLE_SID='', 1、檢查sqlnet.ora(WINDOWS下位於%ORACLE_HOME%N

conn / as sysdba 出現ORA-01031: insufficient privileges 解決辦法

sysdba不能遠端登入這個也是一個很常見的問題了。  碰到這樣的問題我們該如何解決呢? 我們用sysdba登入的時候,用來管理我們的資料庫例項,特別是有時候,伺服器不再本臺機器,這個就更是有必要了。  當我們用sqlplus "/ as sysdba"  是可以登入

oracle: 淺談orapwd命令,及解決遠端登入ORA-01031: insufficient privileges問題

1、先看下命令說明:orapwd Usage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n>

conn / as sysdba 出現ORA-01031: insufficient privileges解決方案

一、檢查sqlnet.ora(WINDOWS下位於%ORACLE_HOME%NETWORKADMIN目錄)是否包含這句:SQLNET.AUTHENTICATION_SERVICES=(NTS),沒有的話加上  sqlnet.ora所在目錄(以Oracle 11g為例):

使用SYS使用者遠端登陸報許可權不足的解決ORA-01031: insufficient privileges

1.監聽及tnsnames.ora正常,普通使用者使用服務名可以登陸資料庫。 [[email protected] admin]$ cat tnsnames.ora mypl =   (DESCRIPTION =     (ADDRESS = (PROTOCOL

ORA-01031: insufficient privileges

ora-01031: insufficient privileges一、問題描述通過sqlplus / as sysdba 無法登陸數據庫,提示權限不足。二、模擬測試1.現象sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Tue No

ora-01031:insufficient privileges/ v$pwfile_users

  ora-01031:insufficient privileges/ v$pwfile_users 2012年05月09日 14:40:31 aaaaaaaa2000 閱讀數:2436 今天在做dg的時候在主庫上使用sys連線主庫總是報ora-01031

Oracle 11g連線sysdba出現ERROR: ORA-01031: insufficient privileges

      今天剛安裝好Oracle 11g,連線資料庫時出現了ERROR: ORA-01031: insufficient privileges       找到自己Oracle的安裝路徑,Oracle\product\11.2.0\dbhome_1\NETWORK\

ORA-01031: insufficient privileges(使用sqlplus / as sysdba登入時報錯)

環境: 系統:Ubuntu 16.04 LTS docker.io docker 映象:wnameless/oracle-xe-11g 簡單記錄: 使用 docker 映象執行為容器之後沒有進行任何配置,接著進入 oracle 容器,當使用 sys 登入 Ora

Oracle安裝後命令行中執行sqlplus / as sysdba出現錯誤ora-01031:insufficient privileges

Win10安裝Oracle後命令行中執行sqlplus / as sysdba出現錯誤ora-01031:insufficient privileges的解決方法 情景描述 剛剛在Win10

[Oracle] sqlplus / as sysdba ora-01031 insufficient privileges

一. 問題描述 今天在新機子(WINDOWS)上搭建Oracle環境,完了之後通過SQL*PLUS本地登入時報錯: ora-01031 insufficient privileges   ——-許可權不足 二. 解決過程 錯誤排除 1. 當時首先想到的是oracl

sqlplus / as sysdba 報錯:ora-01031 insufficient privileges

今天在使用sqlplus / as sysdba登陸時,竟然報錯:ora-01031 insufficient privileges。當時我直接就納悶掉了,平時等的時候都好好的啊,怎麼現在就不行了。 這時我想,我這樣是屬於作業系統認證的登陸方法啊,而且使用者也是oracle

standby主從不同步,主庫報錯:ORA-01031: insufficient privileges

今天發現物理standby的從庫不能同步主庫的資料了,主庫報錯:ORA-01031: insufficient privileges ORA-01031: insufficient privileges PING[ARC2]: Heartbeat failed to co

在Oracle資料庫啟動時提示沒有許可權 ora-01031:insufficient privileges

情況說明 環境:Linux 操作語句: [Oracle@ora11r2 ~]$ sqlplus /nolog SQL*Plus: Release 11.1.0.6.0 - Production on Thu Jun 10 18:22:16 2010 Copyri

oracle:sys、system 無法登入問題:ORA-01031: insufficient privileges

請輸入使用者名稱:  sys/sys as sysdbaERROR:ORA-01031: insufficient privileges 請輸入使用者名稱:  system/system as sysoperERROR:ORA-01031: insufficient pri

sqlplus / as sysdba報錯ORA-01031: insufficient privileges的原因分析

-------------------------轉載-------------- 今天碰到一個奇怪的小問題,看起來是一個非常簡單的問題。我先說一下問題背景。有一臺DB伺服器,因為需要搭建備庫,現在找了一臺已有的機器臨時用一下,這臺臨時的伺服器上已經安裝了Oracle軟體是

zabbix   監控平臺搭建過程中的報錯與解決方法總結

監控 zabbix 運維自動化1.php option post_max_size 2.php option max_execution_time 3.php option max_input_time 4.php time zone 5.php bcm

遠程桌面連接MySQL遇到的問題及解決方法總結

許可授權 fire ble 連接 配置 image iptable 問題 分享 背景提要:想用Delphi做一個可以連接Mysql數據庫的桌面應用程序。其中遇到了一些讓自己很苦惱的問題。因為自己是新手,Delphi用的不熟,FireDAC這個連接數據庫裏控件更是沒有接觸