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"
而在備庫機器上,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)
# 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
看起來一個很簡單的問題,沒有很快解決,看起來還是有些尷尬啊,不過知道了原委,發現這些東西還是需要好好理解。