Oracle数据库删除用户时提示用户存在连接

在开发或测试的Oracle数据库中,为了模拟真实环境的首次安装,我们常常会不断的创建和删除数据库用户,有时候在删除数据库用户的时候会遇到提示用户存在连接,如何处理?

删除错误提示

在版本交付周期中,无论是自测还是 SDV 测试过程中需要把数据库的用户和表清理干净重新创建,以保证与客户现场环境首次安装完全一致。

但实际删除 Orcale 用户时提示:

cannot drop a user that is currently connected
-- 提示存在用户通过此账号连接
SQL> drop user MEBUGSDB cascade;
drop user MEBUGSDB cascade 
*ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected 
​

实际自己检查外部连接的都是断开的,比如 PLSQL、SQLPlus、WebAPP 等。

那只能用一些非常规手段了...emmm

查询连接

出现无法删除用户并提示已有连接时,先查询这个用户当前还在连接的 sessionID。

-- SELECT SID,SERIAL# FROM V$SESSION WHERE USERNAME="MEBUGSDB"; 
SQL> SELECT SID,SERIAL# FROM V$SESSION WHERE USERNAME="MEBUGSDB"; 
SID		SERIAL#
---------- ----------
136		1807
​

如上所示,我们发现有一个连接通过此用户与数据库保持连接状态。

干掉连接

通过命令 Kill 掉这个 session(连接线程)可能会有多个线程,注意全部 Kill 掉即可。

-- ALTER SYSTEM KILL SESSION "136,1807";
SQL> ALTER SYSTEM KILL SESSION "136,1807";
System altered.
​

重新删除用户

SQL> drop user MEBUGSDB cascade; 
User dropped. 
​

删除成功,处理完毕。

结尾小结

删除用户处理方式并不复杂。

执行强制删除连接前需要确认是否已经与所有使用该数据库用户的小伙伴们均沟通完毕,避免产生数据丢失。

那么在实际过程为什么我们已经确认各个应用业务已经关闭或暂停还是会存在连接呢?

这里针对 JAVA 的 Tomcat 容器单独说明下情况。

Tomcat 容器 ShutDown

关闭 JAVA 的 Tomcat 容器我们一般都是执行 bin 目录下的 shutdown.sh 脚本。

实际上仅仅执行该脚本后,容器确实无法访问,但是应用并没有完全关闭掉。

如果通过 ps 查询进程就会发现,该路径下的 java 程序依旧是启动的。

最终我们需要通过 kill -9 PID 的方式完全关闭。

这其中原因一般都是项目应用中可能使用了线程池一类的东西导致。

Tomcat 的 shutdown.sh 脚本并不能同步关闭应用启动的一些后台线程。

更多推荐

章节目录