注意這個不是常規做法,建議還是停應用然後再刪除用戶。
一、 需求背景
業務方讓導數據到測試環境,需要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,可以讓聯繫業務方檢查系統情況了~