在微信群看到别人分享的面试题,关于服务器资源占用过高的问题,想起之前曾经遇到过这样的问题,于是翻看聊天记录整理了一下如何解决类似问题。
2020年12月23日这天部署应用包的时候,发现在运维平台部署应用的时候,部署了很久,还没有完成。在这几天前,部署应用的时候,就有些异常,应用部署需要很久才能部署完成,当时没有去盘查问题,直到23号这天完全部署不上应用了。
于是我登陆服务器,top查看一下系统中各个进程的资源占用状况,发现cpu占用都快爆了。
用ps -ef|grep 查看这些异常的进程,全都是Oracle的,发现全是空连接占用导致。
然后我准备重启一下Oracle。
用Oracle用户登录服务器,
先执行sqlplus /nolog(注:sqlplus /nolog不进行连接数据库的操作。/nolog是不登陆到数据库服务器的意思,如果没有/nolog参数,sqlplus会提示你输入用户名和密码)
再执行conn /as sysdba;
执行shutdown immediate;关闭数据库
然后执行startup启动数据库
这时候发现关闭数据库的时候,卡住了,等了很久,应该还是因为空连接的原因,oracle空线程太多卡住了,然后我就使用命令
ps -ef|grep LOCAL=NO|grep -v grep|cut -c 9-15|xargs kill -9
杀掉所有Oracle的空连接进程,把user为Oracle的pid都kill掉。
都删除后,执行conn /as sysdba 然后startup,数据库启动后遇到个小问题,然后百度了一下,也记录一下。
虽然已经知道了是数据库的问题,但是排查原因没那么快,就整理了一下临时解决方案,因为第二天还是会出现占用资源过高的情况。
1、清除空连接
ps -ef|grep -v grep |grep LOCAL=NO |awk ‘{print $2}’ |xargs kill -9
(注:上面批量杀进程的指令是我百度的,这里是同事告诉的另一种写法)
2、用oracle登录连接数据库后 执行关闭数据库 shutdown immediate
3、oracle登录执行 lsnrctl stop
4、oracle登录执行 lsnrctl start
5、用oracle登录连接数据库后 执行关闭数据库 startup
最后还是通过百度找到了解决的方法,百度yyds!记录一下。
2021年4月27日