Oracle 如何不停應用強行刪除正在連接的用戶

注意這個不是常規做法,建議還是停應用然後再刪除用戶。

一、 需求背景

業務方讓導數據到測試環境,需要drop掉原用戶,重新新建,然後導入。drop用戶的時候如果有當前正在連接的會遇到經典報錯 ORA-01940: cannot drop a user that is currently connected.,聯繫業務方停應用,但業務方說目前是微服務要停的話得停幾十個應用,太麻煩,讓直接kill會話。

我們知道如果直接kill肯定不行的,因爲程序重試肯定比手動kill要快。另外這個測試環境還有別的業務在用其他用戶連接,所以也不能停監聽再kill。

後來嘗試把密碼改了,kill當前連接會話。連接的會話是kill完了(並且也沒有會話在回滾),但是刪除用戶時還是報錯ORA-01940,猜想可能與應用還在不斷嘗試連接有關。

 

二、 解決方法

後來嘗試鎖掉這個用戶,再drop user,發現能成功。另外由於應用沒有停,注意新建用戶密碼先不要跟原來一樣,等把數據導入完了再改回原密碼,否則應用會在導入的同時就過來寫數據,很可能造成數據不一致。

整理操作步驟如下:

1. 鎖定用戶

alter user myuser account lock;

2. kill掉該用戶所有當前會話

select 'alter system kill session '''||s.sid||','||s.SERIAL#||''' immediate;' from v$session s where s.status='INACTIVE' and s.USERNAME= upper('myuser');
-- 執行生成的kill語句
-- 驗證當前已無該用戶連接的會話
select sid,SERIAL#,status from v$session where USERNAME= upper('myuser');

3. 刪除用戶

drop user myuser cascade;

4. 修改數據庫配置

這個應該是新建時就改好的,如果沒改,在遇到大量使用錯誤密碼登錄時可能會有問題。

-- 設置default的profile的嘗試登陸次數爲無限
alter profile default limit failed_login_attempts unlimited;
-- 防止當應用使用錯誤密碼高併發登錄的時候,導致數據庫大量library cache lock
-- 如果沒設,新建用戶後會出現大量library cache lock等待,不過業務本來就沒在用,對導入影響不大
ALTER SYSTEM SET EVENT = '28401 TRACE NAME CONTEXT FOREVER, LEVEL 1' scope=spfile;

5. 用新密碼創建用戶並授權

create user myuser identified by "xxxx";
ALTER USER myuser QUOTA UNLIMITED ON myuser_data;
grant role_myuser,connect,resource to myuser;
alter user myuser default tablespace myuser_data;

6. 開始導入

impdp system@xxx DIRECTORY=DATA_PUMP schemas=myuser dumpfile=myuser.dmp logfile=myuser.log

7. 改回原密碼

這個很重要,不然你導完了應用全連不上了。。。

alter user myuser identified by "原密碼";

ok,可以讓聯繫業務方檢查系統情況了~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章