1. 程式人生 > >以sysdba身份登入oracle報ORA-1031許可權不足錯誤之完美分析

以sysdba身份登入oracle報ORA-1031許可權不足錯誤之完美分析

在資料庫所在伺服器上登入的操作,使用的是作業系統認證方式登入資料庫例項。在出現“ORA-01031 “ 的錯誤錯誤時,首先去檢查sqlnet.ora 檔案中SQLNET.AUTHENTICATION_SERVICES 項的配置資訊。這種分析是被很多人推薦,在網際網路上也有很多帖子都提及到。

大致得到的結論是:

1 、在windows 下,SQLNET.AUTHENTICATION_SERVICES 必須設定為NTS 或者ALL 才能使用OS 認證;不設定或者設定為其他任何值都不能使用OS 認證。

sqlnet.oraWINDOWS下位於%ORACLE_HOME%NETWORKADMIN目錄

2 、在linux 下,在SQLNET.AUTHENTICATION_SERVICES 的值設定為ALL ,或者不設定的情況下,OS 驗證才能成功;設定為其他任何值都不能使用OS 認證。

首先肯定一點,這種分析方法是沒有錯的。我在碰到這種問題時,首先去分析的也是這個檔案的配置。

但在本案例中,sqlnet.ora 檔案的內容如下:

  [[email protected] ~]$ more /u01/app/oracle/product/10.0.2/db_1/network/admin/sqlnet.ora

# sqlnet.ora Network Configuration File: /u01/app/oracle/product/10.0.2/db_1/network/admin/sqlnet.ora

# Generated by Oracle configuration tools.

NAMES.DIRECTORY_PATH= (TNSNAMES)

你會不會認為,還要堅持例項的初始化引數remote_login_passwordfile ,還有密碼檔案。而這兩點是在異地伺服器上使用sysdba 身份登入資料庫例項時才會用到,現在情況是在本地資料庫伺服器上登入資料庫例項。

再分析一下作業系統使用者登入作業系統後訪問資料庫例項的行為。

作業系統使用者使用sysdba 身份連線資料庫例項(任何使用者使用sysdba 身份連線資料庫例項後,在show user時都是為SYS使用者,如sqlplus system/123 as sysdba),使用的認證方式是作業系統認證,而這一認證操作過程是作業系統根據它管理的資訊去校驗該使用者是否可以連線資料庫的過程。

因此,需要進一步分析的是,作業系統如果判斷oracle 使用者符合認證條件。很顯然,我們這裡的oracle 使用者的許可權被作業系統或者oracle 系統拒絕了(應該說是,oracle 系統根據該作業系統使用者是否屬於作業系統的“本地使用者和組”(win7下)這一模組裡的OSDBA 組的使用者來判斷該使用者是否可以連線資料庫)。

Oracle 認為,需要滿足下列條件的使用者才能使用系統認證方式連線資料庫例項。

1 、系統使用者oracle 必須屬於一個特定的組

(如,檢查登陸windows的使用者是不是在包含在ORA_DBA組中,域使用者沒有連上域伺服器時就可能出現這種現象。)

該使用者必須屬於OSDBA 組才能以sysdba 身份登入。這裡的OSDBA 組在不同型別的作業系統上,名稱會不一樣。在unix 系統上名稱為“dba ” ,而在windows 系統上名稱則為“ORA_DBA ” 。

解決方法:

1、在unix 系統上

在unix 系統上,該引數值必須設定為ALL ,或者不設定;在windows 上,它必須設定為NTS 。  

我們回到環境中去檢查系統使用者oracle 的所屬組的情況。

[[email protected] ~]$ id oracle

uid=501(oracle) gid=501(oinstall) groups=501(oinstall)

發現該使用者只屬於oinstall ,而沒有dba 。

因此,我們在root 環境下使用usermod 對該使用者進行調整。如下所示:

[[email protected] ~]# usermod -G oinstall,dba -g oinstall oracle

[[email protected] ~]# id oracle

uid=501(oracle) gid=501(oinstall) groups=501(oinstall),503(dba)

  再次驗證sysdba 身份登入操作,如下所示:

[[email protected] ~]# su - oracle

[[email protected] ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Wed Jul 11 09:47:50 2012

Copyrigmiki (c) 1982, 2007, Oracle.   All Rigmikis Reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

結果顯示已經是登入成功,問題就在oracle 使用者沒有在dba 組中。

另一種方法(在linux下):

OS:2.4.21-20.19AXsmp #1 SMP Wed Jan 5 05:02:09 EST 2005 i686 i686 i386 GNU/Linux

Oracle:Oracle 10.2.0.1

安裝完資料庫 並且dbca建完庫後,資料庫起來了

sqlplus / as sysdba總是報許可權不足,ORA-01031: insufficient privileges

[[email protected]_oracle2 dbs]$ sqlplus / as sysdba    SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 21 16:41:01 2010 Copyright (c) 1982, 2005, Oracle.  All rights reserved. ERROR: ORA-01031: insufficient privileges Enter user-name:[[email protected]_oracle2 dbs]$ sqlplus sys/oracle SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 21 16:41:05 2010 Copyright (c) 1982, 2005, Oracle.  All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production With the Partitioning, OLAP and Data Mining options SQL> 就可以登入 並且都可以startup 和 shutdown, 一直以為是OS認證不成功,查找了大量資料 最終看到一個可以解決問題的 檢查當前所連線的作業系統使用者是否是"osdba" 並且已經定義在:
"$ORACLE_HOME/rdbms/lib/config.s"  
or 
"$ORACLE_HOME/rdbms/lib/config.c". 
通常應為dba
 (在window下同個目錄下沒有config.c檔案) 但我的資料庫如下: [[email protected] oracle]$ cat $ORACLE_HOME/rdbms/lib/config.c

/* SS_DBA_GRP defines the UNIX group ID for sqldba adminstrative access. */ 
/* Refer to the Installation and User's Guide for further information. */ 

#define SS_DBA_GRP "dba"            【Oracle預設推薦用dba組,但安裝的時候建了dbagroup組】
#define SS_OPER_GRP "dba"
           【Oracle預設推薦用dba組,但安裝的時候建了dbagroup組】 char *ss_dba_grp[] = {SS_DBA_GRP, SS_OPER_GRP}; 如下為建Oracle使用者組和使用者時的東西:

1)、建立使用者組

[[email protected] /]# groupadd dbagroup

[[email protected] /]# groupadd oinstall

2)、新增oracle使用者

[[email protected] /]#  useradd -g oinstall -G dbagroup oracle

[[email protected] /]# passwd oracle

當時用的是 dbagroup組,但應該是Oracle標準是用dba組的,將$ORACLE_HOME/rdbms/lib/config.c檔案裡面的dba修改成我資料庫的dbagroup組,最後再relink all一下。

[關於relink命令

relink一般是oracle的可執行檔案出現問題後,重新生成一下sqlplus等程式;或作業系統打完影響Oracle執行相關的補丁重新生成部分oracle的lib;還有比如說如果你做備份專案用legato結合rman去備份oracle,也需要重新link libobk.a這個庫檔案。

這個問題,應該首先從 c 程式 從 文字程式到可執行檔案來闡述

一段文字程式碼,首先第一部做的是 編譯,將文字檔案編譯成  obj 檔案(*.o),為了特定的需求有的還打包


然後是link ,link的時候生成可執行檔案。

對於編譯生成目標檔案這一部,是需要編譯器的。對於oracle開說,釋出的安裝程式一般都是已經編譯好的  目標檔案或者歸檔檔案,在安裝的時候拷貝這些檔案到相應目錄下之後,通過make 程式進行 link 再生成可執行程式。 在生成可執行程式的時候,除了oracle自身的目標檔案外,還要倚賴一些os 的檔案  以及自身的環境變數(有些可執行程式中直接引用環境變數,有些是hardcode了)。

所以當os 或者資料庫打補動使得一些相關檔案發生變化,則需要重新link相關檔案,環境變數的變化也可能導致可執行檔案執行發生問題(我認為這是oracle做的不好)。


cd  $ORACLE_HOME/bin
more  relink 

看看這個shell指令碼,一步一步理下去就知道了

]

重新試試登入:

[[email protected] oracle]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Fri Dec 23 15:35:59 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

SQL> select status from v$instance;

STATUS

------------

OPEN

SQL> exit

可以通過OS認證了,檔案解決!!

2、在window下

當前登入使用者有沒有加入到ORA_DBA,

壞了,我當前以administrator使用者登陸,但是沒有將其加入到ORA_DBA組裡,原因找到

    將administrator使用者加入到ORA_DBA組裡("我的電腦->管理->本地使用者組->組->ora_dba")

    再登陸資料庫:sqlplus   / as sysdba

        ok,問題解決!

附加:在win7下的將使用者帳戶新增到組操作。

將使用者帳戶新增到組

適用於 Windows 7

通過將使用者帳戶新增到組中,可以避免必須向多個不同的使用者逐個授予相同的訪問許可權和許可權。 組成員可以對設定進行相同型別的更改,並且對資料夾、印表機及其他網路服務具有相同的訪問許可權。

注意

  • Windows 7 簡易版、Windows 7 家庭普通版和 Windows 7 家庭高階版中,無法完成以上步驟。

  1. 通過單擊「開始」按鈕 「開始」按鈕的圖片,在搜尋框中鍵入 mmc,然後按 Enter,開啟“Microsoft 管理控制檯”。‌ 需要管理員許可權 如果系統提示您輸入管理員密碼或進行確認,請鍵入該密碼或提供確認。

  2. 在“Microsoft 管理控制檯”的左窗格中,單擊“本地使用者和組”

    如果沒有看到“本地使用者和組”,則可能是因為管理單元沒有新增到“Microsoft 管理控制檯”中。 請按照以下步驟安裝它:

    1. 在“Microsoft 管理控制檯”中,單擊“檔案”選單,然後單擊“新增/刪除管理單元”

    2. 單擊“本地使用者和組”,然後單擊“新增”

    3. 單擊“本地計算機”,再單擊“完成”,然後單擊“確定”

  3. 雙擊“組”資料夾。

  4. 右鍵單擊要將使用者帳戶新增到的組,然後單擊“新增到組”

  5. 單擊“新增”,然後鍵入使用者帳戶的名稱。

  6. 依次單擊“檢查名稱”“確定”,然後再次單擊“確定”



      總而言之,在本地以sysdba 身份登入資料庫例項時,碰到ORA-01031 許可權不足的錯誤,需要系統使用者所在的組是否有dba 和sqlnet.ora 檔案中sqlnet.authentication_services 是否配置正確。

如果還有問題,還有一種方法可以繼續分析。使用作業系統分析工具對sqlplus 應用進行分析。

Linux: 
strace -o /tmp/strace_sysdba.output -cfT sqlplus / as sysdba

AIX, Solaris: 
truss -fea -o /tmp/truss_sysdba.output sqlplus / as sysdba

HP-UX: 
tusc -afpo /tmp/tusc_sysdba.output -aef sqlplus / as sysdba

根據分析內容,可以進一步判斷問題所在。

本文主要參考資料為Oracle 的“Troubleshooting ORA-1031: Insufficient Privileges While Connecting As SYSDBA [ID 730067.1] ” 一文。

二、遠端以sysdba 身份登入資料庫例項時,碰到ORA-01031 許可權不足的錯誤

檢查原因,有兩點如下:

1. 要保證 remote_login_passwordfile 引數 = EXCLUSIVE .

2. 看看是否需要使用orapassw生成口令檔案 .


一種解決方法案例:

1、檢查系統引數:
SQL> show parameter password

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile            string      EXCLUSIVE
2、
select * from v$pwfile_users;
SQL>
為空

3、
SQL> grant sysdba to sys;
grant sysdba to sys
*
ERROR at line 1:
ORA-01994: GRANT failed: password file missing or disabled
4、建立password檔案
D:/>orapwd file="D:/oracle/product/10g/db_1/database/PWDoratest.ora" password=gp
oswong entries=10
5、
SQL> select * from v$pwfile_users;

USERNAME                       SYSDB SYSOP
------------------------------ ----- -----
SYS                            TRUE  TRUE
SYS正常顯示出來。
6、重新在遠端以SYSDBA登入,可正常使用。


如果口令檔案建立的有問題,也是會報如下的錯誤:

ora-01031:insufficient privileges

口令檔案的命名格式應為orapwsid,並且sid是區分大小寫的。由於Target Database連線Auxiliary Database時需要驗證口令,
如果違反了以上規則,將會提示ORA-01031: insufficient privileges。


我在用linux建立duplicate資料庫的時候 就是因為口令檔案建立的路徑和名稱不對才遇到這個錯誤

附加:

sqlnet.ora屬於客戶端的檔案,即它作用於客戶端的,如在客戶端裡的sqlnet.ora檔案裡的NAMES.DIRECTORY_PATH=(tnsnames, onames,ezconnect)中的EZconnect去掉,則客戶端以sqlplus 使用者/密碼@IP地址:1521/服務名 形式登陸服務端就不行的(IP地址:1521/服務名 就是所謂的EZconnect方法)。而在服務端裡的sqlnet.ora檔案裡的EZconnect去掉,則客戶端以sqlplus 使用者/密碼@IP地址:1521/服務名 形式登陸服務端不受影響。

更正附加所說的“sqlnet.ora屬於客戶端的檔案”,應該說sqlnet.ora裡的某些引數是作用於客戶端的,如NAMES.DIRECTORY_PATH,某些引數是作用於服務端的,如SQLNET.EXPIRE_TIME,SQLNET.AUTHENTICATION_SERVICES= (NTS)。

相關推薦

sysdba身份登入oracleORA-1031許可權不足錯誤完美分析

在資料庫所在伺服器上登入的操作,使用的是作業系統認證方式登入資料庫例項。在出現“ORA-01031 “ 的錯誤錯誤時,首先去檢查sqlnet.ora 檔案中SQLNET.AUTHENTICATION_SERVICES 項的配置資訊。這種分析是被很多人推薦,在網際網路上也有很多帖子都提及到。 大致得到的結論是

plsql developer 使用sys使用者登入ORA-01031許可權不足

客戶一資料庫,使用plsql developer,用sys使用者登入時候報ora-01031許可權不足的錯誤,但使用sqlplus可以正常登入,分析原因是密碼檔案損壞導致, 重建了密碼檔案,但依然如此, 仔細檢視,發現密碼檔名上的例項名使用了大寫,改成小寫後,可以正常登入。

解決oracle ORA-20000(ORU-10027)錯誤的方法

今天在執行Oracle指令碼時報 ORA-20000: ORU-10027: buffer overflow, limit of 1000 bytes後來經過分析主要原因是:DBMS_OUTPUT.PUT_LINE除錯資訊輸出太多,導致超過BUFFER,處理方法如下:方法1:set servero

oracle儲存過程中使用execute immediate執行sqlora-01031許可權不足的問題

--問題描述: 使用者在儲存過程中呼叫execute immediate 執行 create table語句報錯 ORA-01031, 並且反映直接執行該語句無報錯。--原因根據問題可以發現使用者確實有create table的許可權,查詢dba_role_privs 和 d

關於navicat連線oracle ORA-12737 set CHS16GBK錯誤的解決方案

Google,解釋如下: ORA-12737: Instant Client Light: unsupported server character set string Cause:     The character set specified is not allowed for this opera

oracle-儲存過程提示ORA-01031: 許可權不足錯誤解決

方法1:就這個儲存過程來說,CREATE TABLE想使用CREATE ANY TABLE許可權,而CREATE ANY TABLE許可權來自DBA角色,預設情況下,雖然在會話環境中可見,但在儲存過程中不可見(無效)。所以根據上面的第一條規則,可以顯示地將CREATE ANY TABLE許可權授予cog就可以

PL/SQL Developer登入時候ORA-12638: 身份證明檢索失敗的解決辦法

net ces 默認 安裝目錄 多個 sem con 操作系統 p s 本地oracle客戶端用PLSQL Developer連接遠程數據庫,登入時候報ORA-12638: 身份證明檢索失敗的解決辦法 找到安裝目錄:C:\oracle\BIToolsHome_1\netwo

oracle SYSDBA身份登陸

1,首先通過用管理身份開啟cmd命令視窗 2,使用指令登陸     sqlplus / as sysdba 3, 修改TNSLSNR.EXE啟動預設埠(8080) Oracle 10g: call dbms_xdb.cfg_update(updateX

oracle中不用密碼dba身份登入

在oracle中,sqlplus下,我們可以不用密碼就以dba身份登入,具體語句如下sqlplus / as sysdba這是因為window會建立一個oracle使用者組,所以有許可權直接登入oracle中顯示服務名:

[Oracle]Oracle資料庫任何使用者密碼都能sysdba角色登入

* 本文相關環境:Windows 10,64位作業系統;Oracle 11gR2;toad for Oracle12.1       最近在學習Oracle資料庫,使用Toad for Oracle來檢視資料庫的資訊,發現在以sysdba角色登入資料庫時,無論輸入什麼

Oracle ORA-00054 資源正忙, 但指定 NOWAIT 方式獲取資源, 或者超時失效” 問題的解決方法

1 原因 一般在使用者修改記錄之前,悲觀鎖就會發生作用,比如更新語句: select ..for update 執行這條命令之後,oracle 將會對返回集中的資料建立行級封鎖,以防止其他使用者修改這些記錄。 這時如果對這張表進行 ddl 操作將就會報

oracleSYSDBA身份登入能檢視同一個賬戶下用Normal身份登陸建立的表等,而用normal身份卻不行?

今天我先用normal,身份登陸建立了一些表和資料等 然後再tables下重新整理並沒有顯示錶, 又用sysdba身份登陸,卻能檢視到這些建立的內容。 什麼問題? 由於沒有找到合適的答案,我就通過cmd 的sqlplus的方式來匯入; 然後依次執行命令,每次執行完之後,

jdbcsys使用者用sysdba身份oracle

oracle的sys使用者怎麼通過jdbc連線 經過GOOGLE 總算知道了如何在JDBC中使用SYSDBA角色連線ORACLE資料庫 在DriverManager.getConnection通過Properties 設定連線的defaultRowPrefetch,ntern

使用PLSQL客戶端登入ORACLE時報ORA-12502和ORA-12545錯誤的解決方案

當使用plsqldev客戶端登入oracle資料庫時,如果對應的tnsnames.ora中是直接使用IP地址來連線,並且未在系統的hosts檔案中繫結主機名時,極易出現ORA-12502及ORA-12545報錯,這兩種錯誤內容分別是: ORA-12502: TNS:listener received no

oracleORA-00911:invalid character

轉自;http://www.cnblogs.com/chuang-sharing/p/9493316.html   今天查問題的時候,發現一個在分號後邊加註釋,解析錯誤的問題;   select decode(td.invoice_type,'1','增值稅

plsql登入oracle使用者ORA-12154: TNS: 無法解析指定的連線識別符號解決方案

其實TNS無法解析是Oracle操作裡經常遇到的問題,原因有二: (1)Oracle伺服器沒有裝好(一般不建議重灌,因為Oracle解除安裝不完全是沒法重灌的) (2)TNS沒有配置對(2)的解決方案:現在先測試一下tns是否可以ping,成功的介面大致如下 步驟:(1)在o

解決iSQL*Plus無法dba身份登入問題(2)

iSQL*Plus以DBA身份登入時,採用Oracle http server驗證和資料庫兩個使用者雙層驗證。本文重點講解Oracle HTTP server使用者驗證 第一步: 從oracle安裝目錄 $oracle/db_1/install/readme.txt檔案可以檢視到isql*plus和isql

Ubuntu16.04 提升許可權後 只能guest身份登入

(注意 Ubuntu的vi 和 centos的vi 初始化時可能不太一樣 然後你vi 進去找不到greeter-session-unity-greeter, 這時就屬於Ubuntu下vi輸入i不進入insert插入模式的問題 ,此時修改/etc/vim/vimrc.tiny 檔案,將set compatib

oracleORA-12519錯誤,處理髮現是資料庫連線不夠了

一。檢視並修改process cmd sqlplus /nolog conn kmtest/[email protected] show parameter processes看到 process預設是150 processes                

Oracle 使用sys使用者登入insufficient privileges許可權不足

OS:2.4.21-20.19AXsmp #1 SMP Wed Jan 5 05:02:09 EST 2005 i686 i686 i386 GNU/Linux Oracle:Oracle 10.2.0.1 安裝完資料庫 並且dbca建完庫後,資料庫起來了 sqlplus