1. 程式人生 > 其它 >sysdba登入報錯insufficient privileges的原因分析(r7筆記第64天)

sysdba登入報錯insufficient privileges的原因分析(r7筆記第64天)

今天碰到一個奇怪的小問題,看起來是一個非常簡單的問題。 我先說一下問題背景。有一臺DB伺服器,因為需要搭建備庫,現在找了一臺已有的機器臨時用一下,這臺臨時的伺服器上已經安裝了Oracle軟體是 11.2.0.4.0,而我們需要安裝的備庫版本是11.2.0.3.0所以為了相容,所以需要在臨時的伺服器上再安裝一套Oracle軟體,把 11.2.0.4的ORACLE_HOME切換過來,直接從主庫拷貝了安裝目錄,開始克隆安裝。 克隆安裝的步驟其實內部就是在做relink,當然這個也沒什麼問題,很快就操作完成了。 在$ORACLE_HOME/clone/bin下執行下面的命令即可,$ORACLE_HOME,$ORACLE_BASE根據需要配置 perl clone.pl ORACLE_BASE=/DATA/app/oracle ORACLE_HOME=/DATA/app/oracle/product/11.2.3/db_1 ORACLE_HOME_NAME=OraDb11g_home2 簡單驗證sqlplus -v沒有任何問題。 $ sqlplus -v SQL*Plus: Release 11.2.0.3.0 Production 但是嘗試sqlplus / as sysdba的時候卻丟擲了一個錯誤。這個問題看起來比較奇怪,記得之前碰到過,但是全然不記得是怎麼處理的了。然後重新來過。 $ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Thu Dec 31 23:09:19 2015 Copyright (c) 1982, 2011, Oracle. All rights reserved. ERROR: ORA-01031: insufficient privileges 這個步驟才開始驗證引數檔案,密碼檔案還沒有開始做校驗,為什麼會丟擲這個問題呢。但是使用sysoper就看起來沒有問題了。 $ sqlplus / as sysoper SQL*Plus: Release 11.2.0.3.0 Production on Thu Dec 31 23:21:07 2015 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to an idle instance. 對於這個問題,還得從幾個小的細節說起,一個就是作業系統認證,對於作業系統認證對於Windows和Linux,Unix都會有一些不同的設定,但是思路都是相通。 在Linux下對應有作業系統的使用者組,使得sysdba和作業系統使用者組繫結起來。至於哪個是dba組,哪個是oper組,為什麼sysoper就可以登入,而sysdba卻不可以。這個可以參考一個檔案。 為了突顯出對比的效果來,我找出了正常執行的主庫,config.c的內容如下: $ORACLE_HOME/rdbms/lib/config.c $ cat 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. */ /* IMPORTANT: this file needs to be in sync with rdbms/src/server/osds/config.c, specifically regarding the number of elements in the ss_dba_grp array. */ #define SS_DBA_GRP "oinstall"

#define SS_OPER_GRP "oinstall" #define SS_ASM_GRP "" char *ss_dba_grp[] = {SS_DBA_GRP, SS_OPER_GRP, SS_ASM_GRP}; 而在備庫機器上,config.c的內容如下: $ cat 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. */ /* IMPORTANT: this file needs to be in sync with rdbms/src/server/osds/config.c, specifically regarding the number of elements in the ss_dba_grp array. */
#define SS_DBA_GRP "dba" #define SS_OPER_GRP "oinstall" #define SS_ASM_GRP "" char *ss_dba_grp[] = {SS_DBA_GRP, SS_OPER_GRP, SS_ASM_GRP}; 由此一來,可以看出為什麼sysoper的可以正常登入了。 來簡單對比一下主庫的使用者組情況,發現確實存在一個使用者組為dba [oracle@rolequery product]$ id oracle uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba),502(oper),503(asmadmin),504(asmdba) 而在備庫中只有oinstall的使用者組 [oracle@BX_133_45 lib]$ id oracle uid=501(oracle) gid=501(oinstall) groups=501(oinstall)
那麼這個問題怎麼修復呢,可以在備庫中建立一個對應的使用者組,然後把oracle使用者加入dba組中, # groupadd dba # usermod -a -G dba oracle # id oracle uid=501(oracle) gid=501(oinstall) groups=501(oinstall),505(dba) 這個時候最好還是再relink一下,還是使用克隆安裝的部分,不過需要在OraInventory中需要手工刪除一下原本的安裝資訊,刪除inventory.xml中的Oracle_HOME即可。 但是這個時候還是存在ORA-01031: insufficient privileges的問題,是修改的使用者的問題沒有解決徹底嗎。 其實還有一個就是sqlnet.authentication的服務認證,MOS(730067.1)是這麼描述的。 sqlnet.authentication_services must be set to (ALL) or to (BEQ, ) for this to work. On Windows this parameter must be set to (NTS). 這個時候再來看一看配置$ cat sqlnet.ora # sqlnet.ora Network Configuration File: /home/U01/app/oracle/product/11.2.3/db_1/network/admin/sqlnet.ora # Generated by Oracle configuration tools. SQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) ADR_BASE = /DATA/app/oracle 所以SQLNET.AUTHENTICATION_SERVICES= (NTS)的設定存在問題的。註釋掉之後,再次登入就沒有問題了。 [oracle@BX_133_45 admin]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Thu Dec 31 23:36:31 2015 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to an idle instance. 那麼是不是就是因為SQLNET.AUTHENTICATION_SERVICES直接導致的,使用者組不同行不行呢,都已經試到這個份上了,我就繼續玩玩。 刪除原有的dba組,再次嘗試就會看到原有的問題。 # groupdel dba # id oracle uid=501(oracle) gid=501(oinstall) groups=501(oinstall) # su - oracle $ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Thu Dec 31 23:09:19 2015 Copyright (c) 1982, 2011, Oracle. All rights reserved. ERROR: ORA-01031: insufficient privileges 我繼續想,是不是直接修改config.c就可以了,不需要再建立一個dba組了,行不行? $ vi config.c #define SS_DBA_GRP "oinstall" #define SS_OPER_GRP "oinstall" #define SS_ASM_GRP "" 然後再次登入,發現還是有問題。所以這兩者在我的這個問題裡都是缺一不可。 $ sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Thu Dec 31 23:11:14 2015 Copyright (c) 1982, 2011, Oracle. All rights reserved. ERROR: ORA-01031: insufficient privileges 看起來一個很簡單的問題,沒有很快解決,看起來還是有些尷尬啊,不過知道了原委,發現這些東西還是需要好好理解。