日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle中删除用户和表空间的常见问题(比如:ORA-01940无法删除当前已连接用户的解决方案)

發布時間:2024/9/27 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle中删除用户和表空间的常见问题(比如:ORA-01940无法删除当前已连接用户的解决方案) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這時候以管理員身份進入sqlplus命令窗口.

在刪除用戶的時候有時候會出現以下問題:

ORA-01940無法刪除當前已連接用戶

這時候的解決方案是: 1)查看用戶的連接狀況 select username,sid,serial# from v$session (2)找到要刪除用戶的sid,和serial,并刪除 例如:你要刪除用戶'WUZHQ',可以這樣做: alter system kill session'532,4562'; 這里的532表示的是sid,4562表示的是seria. 只有經過步驟(2)之后才可以刪除用戶
(3)刪除用戶 drop user username cascade (**)如果在drop 后還提示ORA-01940:無法刪除當前已鏈接的用戶,說明還有連接的session,可以通過查看session的狀態來確定該session是否被kill 了,用如下語句查看: select saddr,sid,serial#,paddr,username,status from v$session where username is not null 結果如下(以我的庫為例): saddr???????????????????? sid?????????? serial#??????????? paddr????????????? username????????????? status 564A1E28????????????? 513?????????? 22974??????????? 569638F4??????? NETBNEW???????????? ACTIVE 564A30DC????????????? 514????????? 18183??????????? 569688CC??????? NETBNEW??????????? INACTIVE 564A5644????????????? 516?????????? 21573??????????? 56963340??????? NETBNEW??????????? INACTIVE 564B6ED0????????????? 531?????????? 9?????????????????? 56962D8C??????? NETBNEW?????????? INACTIVE 564B8184????????????? 532????????? 4562?????????????? 56A1075C www.2cto.comWUZHQ??????????????? KILLED status 為要刪除用戶的session狀態,如果還為inactive,說明沒有被kill掉,如果狀態為killed,說明已kill。 由此可見,WUZHQ這個用戶的session已經被殺死。此時可以安全刪除用戶。 刪除表空間的步驟如下: drop tablespace TS_MISPS including contents and datafiles cascade constraints; 這里的TS_MISPS是一個表空間的名字。 此外: //including contents:表示刪除表空間的內容,如果刪除表空間之前表空間中有內容,而未加此參數,表空間刪除不掉,所以習慣性的加此參數。 //including datafiles:表示刪除表空間中的數據文件 //cascade constraints:同時刪除tablespace中表中的外鍵參照 詳細介紹請看:http://blog.csdn.net/tototuzuoquan/article/details/9878851 下面為您介紹的是Oracle用戶會話信息的查詢方法,該方法供您參考,如果您感興趣的話,不妨一看。

通過V$SESSION視圖,可以查詢Oracle所有Oracle用戶會話信息

select sid,logon_time,username,machine from v$session;

通過分組,統計每個不同的用戶或主機打開的Oracle用戶會話總數

select username,machine,count(*) from v$session group by username,machine;

根據SID和SERIAL#可以終止用戶會話

ALTER SYSTEM KILL SESSION 'v_sid,v_serial#' immediate; (要真正的把v_sid和v_serial替換成數字)

Oracle用戶會話的SID和SERIAL#可以通過V$SESSION視圖查到:

  • SQL> select sid,serial#,username, machine,status from v$session where username like 'PCNSH%';
  • SID SERIAL# USERNAME MACHINE STATUS
  • -------- ---------- --------------- ------------------------------- --------
  • 366 14303 PCNSH197 client197.yourdomain.com INACTIVE
  • 369 1745 PCNSH003 server009 INACTIVE
  • 370 10165 PCNSH049 client049.yourdomain.com INACTIVE
  • 371 18999 PCNSH056 client056 INACTIVE
  • 372 6207 PCNSH056 client056 INACTIVE
  • 373 7688 PCNSH197 client197.yourdomain.com INACTIVE
  • 374 19246 PCNSH003 server009 INACTIVE
  • 377 17649 PCNSH003 server009 INACTIVE
  • 在Oracle中終止掉的會話只有在這個進程再次嘗試連接Oracle時才會被pmon清除,在進程再次嘗試連接之前,查詢V$SESSION視圖時還是可以看到該會話。

    當用戶會話無法響應時,上面的方法可能無法終止用戶會話,只好直接殺死系統進程(謹慎)。

    用戶會話對應的系統進程可以通過V$SESSION和V$PROCESS兩個視圖來查詢,通過會話的SID和SERIAL#可以查詢到系統進程號。

  • SQL> select p.spid from v$session s, v$process p
  • where p.addr=s.paddr and s.sid=518 and s.serial#=41831;
  • SPID
  • ------------
  • 16782
  • 然后在操作系統中殺死進程:

    kill -9 16782
    某些軟件會在啟動時打開多個會話,當軟件異常退出時源碼天空,要批量的終止這些會話。存儲過程基于用戶名條件批量終止會話,創建存儲過程腳本kill_user.sql如下:

  • create or replace procedure kill_user(v_name in varchar2)
  • as
  • message varchar2(50);
  • cursor loguser is select sid,serial# from v$session where username=upper(v_name);
  • v_info loguser%rowtype;
  • sql_mgr varchar2(1000);
  • i number default 0;
  • begin
  • open loguser;
  • loop
  • fetch loguser into v_info;
  • exit when loguser%notfound;
  • i :=1;
  • sql_mgr :='alter system kill session '''||v_info.sid||','||v_info.serial#||''' immediate';
  • execute immediate sql_mgr;
  • dbms_output.put_line('All the sessions of '||v_name||' have been killed');
  • end loop;
  • close loguser;
  • if i=0 then
  • raise_application_error(-20004,'The user '||v_name||' is not login the database currently!');
  • end if;
  • exception
  • when no_data_found then
  • raise_application_error(-20004,'The user '||v_name||' is not login the database currently!');
  • end;
  • /
  • 調用上面存儲過程,終止用戶所有進程的方法如下:

  • SQL> execute kill_user('user_name');
  • 總結

    以上是生活随笔為你收集整理的Oracle中删除用户和表空间的常见问题(比如:ORA-01940无法删除当前已连接用户的解决方案)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。