sqlplus / as sysdba無法登入的奇怪報錯
最近看了一個問題,看問題的表現著實比較奇怪,困擾了我好一會兒。
問題的背景是協助開發的同學解決一個資料庫問題,最後問題解決之後,我想做一個作業系統級的檢查,幫他們看看還有什麼需要注意的地方。然後在命令列中國登陸到了這台資料庫伺服器,切換到Oracle使用者之後,查看到資料庫執行個體為cytj,然後準備做一番檢查。
#ps -ef|grep smon
root 3657 32596 0 17:37 pts/2 00:00:00 grep smon
oracle 5433 1 0 2015 ? 00:45:46 ora_smon_cytj
但是這個時候,奇怪的問題就發生了。
#su - oracle
-bash: ulimit: open files: cannot modify limit: Operation not permitted
$sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 7 17:37:56 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
碰到這種問題,看起來還是哪幾種常規的思路,其中之一就是看看ORACLE_HOME是否完全映射。根據smon的進程得到進程號為5433,在/proc/5433下面可以得到一個環境變數的列表。
$cat /proc/5433/environ|xargs -0 -n1 |grep ORACLE_HOME
ORACLE_HOME=/U01/app/oracle/product/11.2.0.4
解析得到ORACLE_HOME的路徑
然後查看系統內容變數的值$ORACLE_HOME,發現也確實是完全映射的。
$echo $ORACLE_BASE
/U01/app/oracle
$echo $ORACLE_HOME
/U01/app/oracle/product/11.2.0.4
那麼ORACLE_SID,ORACLE_HOME都沒有問題,怎麼就串連不到這個執行個體了呢?
一種分析問題的思路就是,查看網路的配置情況,是否為/etc/hosts的配置問題。然後查看資料庫
$cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
#GATEWAY=
HOSTNAME=BJ-BX-131-190
$cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.127.131.190 BJ-BX-131-190
$cat /U01/app/oracle/product/11.2.0.4/network/admin/sqlnet.ora
# sqlnet.ora Network Configuration File: D:\oracle\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.
# This file is actually generated by netca. But if customers choose to
# install "Software Only", this file wont exist and without the native
# authentication, they will not be able to connect to the database on NT.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
使用tnsping來檢測tns串連串的情況,也沒有發現任何問題。當然這個地方和sqlplus / as sysdba 應該沒有直接關係,但是通過這個可以說明網路服務配置都是合理的。
[admin]$tnsping cytj
TNS Ping Utility for Linux: Version 11.2.0.4.0 - Production on 07-MAR-2016 18:02:35
Copyright (c) 1997, 2013, Oracle. All rights reserved.
Used parameter files:
/U01/app/oracle/product/11.2.0.4/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.127.131.190)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cytj)))
OK (20 msec)
使用一個普通使用者來本地串連測試,發現scott使用者是鎖定的,通過這個也能夠說明串連是起了作用了。
[admin]$sqlplus scott/tiger
SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 7 18:03:40 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-28000: the account is locked
然後換做tns串連的方式,發現錯誤也是一樣,說明走網路連接的方式也起作用了。
[admin]$sqlplus scott/tiger@cytj
SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 7 18:03:40 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-28000: the account is locked
然後對於這個錯誤,在這個系統中摸索了一番,發現這個路徑著實夠亂,竟然存在兩個ORACLE_HOME,
當前的是:
/U01/app/oracle/product/11.2.0.4/dbs
發現的新ORACLE_HOME是
/home/U01/app/oracle/product/11.2.0.4/dbs
但是經過一番論證發現然並卵,這個路徑對這個問題實際上沒有造成什麼影響。
因為ORACLE_HOME這些配置完全和另外一個ORACLE_HOME沒有任何關聯。
還有一些可能就是和密碼檔案有關,於是我手工修改了sys密碼,再次登入。
[dbs]$sqlplus system/oracle
SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 7 22:12:11 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning and Real Application Testing options
SQL> alter user sys identified by oracle;
User altered.
然後再次登入,問題依舊。
這個時候還可以進一步排除密碼檔案的影響,比如我指定了一個不存在的執行個體test,這個時候sqlplus / as sysdba應該接入一個空執行個體。
$export ORACLE_SID=test
$sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 7 19:28:42 2016
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
然後進一步測試,發現dg broker登入也有問題。
[dbs]$dgmgrl /
DGMGRL for Linux: Version 11.2.0.4.0 - 64bit Production
Copyright (c) 2000, 2009, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
ORA-01017: invalid username/password; logon denied
使用rman來登入發現也是同樣的錯誤。
[dbs]$rman target /
Recovery Manager: Release 11.2.0.4.0 - Production on Mon Mar 7 19:29:36 2016
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: initialization of internal recovery manager package failed
RMAN-04005: error from target database:
ORA-01017: invalid username/password; logon denied
好了,事已至此,可以充分肯定問題出在這個本地作業系統認證上,oracle所在的使用者組都是沒有問題的。
作業系統認證在$ORACLE_HOME/network/admin/sqlnet.ora也有一些關係。
我們看看這個檔案是怎麼配置的。
[admin]$vi sqlnet.ora
# sqlnet.ora Network Configuration File: D:\oracle\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.
# This file is actually generated by netca. But if customers choose to
# install "Software Only", this file wont exist and without the native
# authentication, they will not be able to connect to the database on NT.
SQLNET.AUTHENTICATION_SERVICES= (NTS)
xxxx
看到這個問題,一下子明白了原委,就是下面的配置導致的問題。
SQLNET.AUTHENTICATION_SERVICES= (NTS)
這個應該是在windows中的配置,怎麼在linux裡面設定這個,可見最開始就是從windows中拷貝的這個檔案,怎麼進一步印證呢,可以看看sqlnet.ora的注釋部分,裡面的路徑就是D盤的路徑,也有注釋說了是在NT環境下,在linux環境中,這個參數其實是不需要的。
注釋掉之後。
再次登入就沒有任何問題了。