ORA-01940:無法刪除當前已連線的使用者

Hoegh發表於2015-04-17
        今天在現場作業時,需要先刪除使用者;在執行drop user時提示“ORA-01940: cannot drop a user that is currently connected”,當時的環境如下:
作業系統:Windows XP
資料庫:Oracle 10.2.0.1
       當時時間比較著急,直接採取了釜底抽薪的辦法——拔網線,這招很管用,再次執行drop user就成功了。考慮到以後不一定所有場合都允許你採取這種簡單粗暴的辦法,就在虛擬機器上重現了這個報錯,尋求一種較為溫和的解決辦法。
       首先我開啟兩個虛擬機器,在1號虛擬機器上啟動了兩個例項,開啟了3個連線到scott使用者的視窗;在2號虛擬機器上啟動了一個例項,開啟了一個連線到scott使用者的視窗。這時我登入sys使用者執行drop user操作,復現了上述報錯。

點選(此處)摺疊或開啟

  1. [oracle@enmoedu1 ~]$ sqlplus / as sysdba

  2. SQL*Plus: Release 11.2.0.3.0 Production on Fri Apr 17 21:25:40 2015

  3. Copyright (c) 1982, 2011, Oracle. All rights reserved.


  4. Connected to:
  5. Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
  6. With the Partitioning, OLAP, Data Mining and Real Application Testing options

  7. SQL> drop user scott cascade;
  8. drop user scott cascade
  9. *
  10. ERROR at line 1:
  11. ORA-01940: cannot drop a user that is currently connected


  12. SQL>
首先,我們檢視scott使用者的連線狀況;

點選(此處)摺疊或開啟

  1. SQL> select username,sid,serial# from v$session where username='SCOTT';

  2. USERNAME SID SERIAL#
  3. ------------------------------ ---------- ----------
  4. SCOTT 19 355
  5. SCOTT 20 13693
  6. SCOTT 26 15
  7. SCOTT 127 7

  8. SQL>
接下來,我們kill上述連線;

點選(此處)摺疊或開啟

  1. SQL> alter system kill session'19,355';

  2. System altered.

  3. SQL> alter system kill session'20,13693';

  4. System altered.

  5. SQL> alter system kill session'26,15';

  6. System altered.

  7. SQL> alter system kill session'127,7';

  8. System altered.

  9. SQL>
再次查詢scott使用者的連線狀況,確認所有連線被清除完畢;

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> select username,sid,serial# from v$session where username='SCOTT';

  3. USERNAME SID SERIAL#
  4. ------------------------------ ---------- ----------
  5. SCOTT 19 355
  6. SCOTT 20 13693
  7. SCOTT 26 15
  8. SCOTT 127 7

  9. SQL>
看到這兒,不要驚慌,不要以為這些連線還在;我們只要查詢一下上述連線的狀態就明白了。

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> select saddr,sid,serial#,paddr,username,status from v$session where username is not null;

  3. SADDR SID SERIAL# PADDR USERNAME STATUS
  4. -------- ---------- ---------- -------- ------------------------------ --------
  5. 578CC410 19 355 583AD258 SCOTT KILLED
  6. 578C9890 20 13693 583AD258 SCOTT KILLED
  7. 578B9390 26 15 583AD258 SCOTT KILLED
  8. 579DED90 120 95 5836FFB4 SYS ACTIVE
  9. 579CBD10 127 7 583AD258 SCOTT KILLED

  10. SQL>
由上述查詢結果得知,scott使用者的所有連線已經被kill了;現在我們執行drop user,看一下是否能夠成功;

點選(此處)摺疊或開啟

  1. SQL>
  2. SQL> drop user scott cascade;

  3. User dropped.

  4. SQL>
由此,ORA-01940報錯得到順利解決。大家如果以後碰到這個問題,可以按照實際環境來決定是採取“簡單粗暴”的解決辦法(拔網線),還是上述這種“溫和”的解決辦法。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30162081/viewspace-1584002/,如需轉載,請註明出處,否則將追究法律責任。

相關文章