1. 程式人生 > >ora-01031解決方法

ora-01031解決方法

今天遇到此錯誤,解決後不太清楚其中原理,上網查詢後明白一些,轉載網上的文章作為記錄,也供大家參考。

主要是 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;

相關推薦

ora-01031解決方法

今天遇到此錯誤,解決後不太清楚其中原理,上網查詢後明白一些,轉載網上的文章作為記錄,也供大家參考。 主要是 sqlnet.ora 檔案和 remote_login_passwordfile 引數影響。 一直以來,我記住的一個知識點就是:SQLNET.AUTHENTICATION_SERVICES=(NTS)是

Oracle使用sys登錄時報錯ORA-28009解決方法

操作 ont pan PE 成功 nec con mil spa 情況一:使用sqlplus登錄: 正常輸入用戶名的口令,就會報錯,因為SYS是在數據庫之外的超級管理員,所以我們在登錄的時候 要在輸入口令:口令+as sysdba(比如:123456 as sy

Navicat連接Oracle數據庫報錯ORA-28547解決方法

style ica 點擊 解決 註意 data 數據 img 必須 先說明下我機器的環境: 1、Win10 - 64bit 2、Navicat Premium_11.2.7 - 64bit 3、未安裝Oracle數據庫(包括Client也未安裝) 解決方法:

ORA-03113----解決方法之一

啟動資料庫 [email protected]> startup ORACLE instance started. Total System Global Area 521936896 bytes Fixed Size 2254824 bytes Variable

ORA-12514 解決方法

場景:修改oracle系統引數之後,資料庫重啟,客戶端報 ORA-12514 錯誤,其實這只是表象,實際並非Listener的問題。 SELECT * FROM V$RESOURCE_LIMIT 根據伺服器記憶體的實際情況,設定對應的引數 alter system set sga_max_size=8G

ORA-55617解決方法

昨天一測試環境出現異常ORA-55617: Flashback Archive "XXXXX" runs out of space and tracking on "XXXX",其解釋如下: Description: Flashback Archive "string" runs out

ora-01033 解決方法

今天研究Oracle遇到了這個問題 ora-01033 : oracle initialization or shutdown in progress,經過分析研究終於解決了,寫下來紀念一下。我的庫是oracle 9i,具體就是90的。 一、首先:問題的產生原因,出現這個錯誤

在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

執行DBMS_METADATA.get_ddl報ORA-39212的解決方法

ddl api div lec connect ext rom 查看 local 環境: 數據庫:oracle 10.2.0.4 --64位 操作系統:紅旗dc 5.0 --64位以sys登陸,執行DBMS_METADATA.get_ddl得到某個表空間的元數

ORA-12638: 身份證明檢索失敗 解決方法

nav ref fig tle mage 連接 man 技術分享 rac 用PL/SQL或Navicat連接本地或遠程Oracle數據庫的時候報錯:ORA-12638: 身份證明檢索失敗 解決方法: 開始 -> 所有程序 -> Oracle - Oracle_

windows下 sqlplus / as sysdba 報ora-12560的終極解決方法

原創 cmd home sysdba nbsp track software msd oca windows下 sqlplus / as sysdba 報ora-12560的終極解決方法 本文是原創文章。轉載請註明出處:http://blog.csdn.net

oracle數據庫升級dbua操作阻塞解決方法(解決ORA-32004報錯)

ram values a10 side 問題分析 tail script 說明 imm 操作環境 1、SuSE11sp3操作系統 2、oracle 11.2.0.3版本升級到11.2.0.4版本 問題現象 oracle 11.2.0.3版本升級到11.2.0.4版本時執

ORA-28547:connection to server failed, probable Oracle Net admin error錯誤,解決方法

pro div oracle 資料 安裝 err ora-28547 解決 方法 當用navicat連接oralce數據庫時報ORA-28547錯誤時,直接懵逼了,上網查了資料說是navicat自帶的oci.dll文件的版本和服務器端的oralce數據庫的版本不一致造成的。

在oracle11g中刪除sde用戶報ora - 21700錯誤的解決方法

11.2.0.1 pos all with username user 刪除 sel cat PS C:\Users\Administrator> sqlplus sys/xxxx@orcl as sysdba;SQL*Plus: Release 11.2.0.1.0

ORA-12505: TNS: 監聽程序當前無法識別連接描述符中所給出的SID等錯誤解決方法

RR script 監聽 修改 查詢 listen 註冊 其他 esc 程序連接orarle報ORA-12505錯誤 一、異常{ ORA-12505, TNS:listener does not currently know of SID given in connect

ORA-12638: 身份證明檢索失敗的解決方法

lease 如果 Go password pin 客戶端 spin dba .com C:\app\ArcerZhang\product\11.2.0\client_1_32Bit\BIN>sqlplus QHJYTDB/QHJYTDB@QHJYT SQL*

除錯經驗——ORA-06502: PL/SQL: numeric or value error: character string buffer too small的解決方法

問題描述: 生產環境中,有一個在報表自動刷新系統中排期的報表(scheduled report)生成失敗。 報以下錯誤: ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-

ORA-00942: 表或檢視不存在解決方法

ORA-00942: 表或檢視不存在是比較常見的問題,原因也多種多樣。今天碰到了這個問題,從網上搜到了很多解決方案,在此做一個整理。僅做為記錄方便以後查閱。 1、表或檢視確實不存在或名稱寫錯 2、表名大小寫 Oracle對大小寫敏感,通常在建立和查詢時對名稱資料庫會自動轉為大寫,但語句中