清理session的小插曲(r4笔记第95天)
前几天在做一次巡检的时候,通过top发现有3个进程占用的时间很长,之前也碰到过几次这种情况,但是排查发现是由于监控程序在运行,算是虚惊一场。 今天看到这些进程的情况,还是不能掉以轻心。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2249 xxxxxxxx 25 0 36.5g 3.0g 74m R 100.0 0.9 8949:04 oracleCUST01 (LOCAL=NO)
6579 xxxxxxxx 25 0 36.5g 3.1g 50m R 99.5 0.9 8938:02 oracleCUST01 (LOCAL=NO)
9042 xxxxxxxx 25 0 36.5g 3.1g 28m R 99.5 0.9 8934:51 oracleCUST01 (LOCAL=NO)
先抓出来一个进程,看看到底在干嘛?
>ksh showpid.sh 2249
*******************************************
Process has found, pid: 2249 , addr: 000000089856DEA0
####### Process Information from OS level as below ########
xxxxxxxx 2249 1 99 Mar26 ? 6-05:09:50 oracleCUST01 (LOCAL=NO)
xxxxxxxx 3137 23569 0 16:45 pts/7 00:00:00 ksh showpid.sh 2249
##############################################
SID SERIAL# USERNAME OSUSER MACHINE PROCESS TERMINAL TYPE LOGIN_TIME
---------- ---------- --------------- --------------- -------------------- --------------- --------------- ---------- -------------------
4471 62525 DB_PRSNL XXXX XXXXLSG_P10-KETNAP 5360:2832 LSG_P10-KETNAP USER 2015-03-26 11:31:52
发现是一个开发人员通过客户端发起的一个查询。这个查询竟然运行了这么长时间。
查看pmon进程的占用时间,已经持续很长时间了。
> ps -ef|grep pmon
xxxxxx 4904 1 2 Feb20 ? 1-00:04:58 ora_pmon_CUST01
这是个很明显的问题,发邮件给客户开发组进行确认,马上得到了反馈,可以Kill这个session.
但是客户dba在kill的时候,运行了alter system kill session报了ORA-00031: session marked for kill
查看v$session的状态,发现这几个session都是KILLED状态,看情况就是等待这几个session被清理了。
一个小时之后,我想查看一下这几个session是否已经被清理,发现没有任何变化。
关于kill session其实还有几种选项可用,我们可以使用kill session immediate,disconnect session immediate kill session 命令不会马上清理掉session,在做回滚操作的时候会进行等待,暂时将session标记为KILLED状态,如果使用kill session immediate就有点类似java中进行垃圾回收一样,我们显式声明system.gc(),但是不一定马上进行回收。 进行disconnect session immediate这种方式会kill掉专用服务连接进程,算是杀伤力较大的一种方式。 但是实际操作的时候发现还是有一定的差距,因为三种方式都不奏效。
SQL> alter system kill session '4471,62525';
alter system kill session '4471,62525'
*
ERROR at line 1:
ORA-00031: session marked for kill
SQL> alter system kill session '4471,62525' immediate;
alter system kill session '4471,62525' immediate
*
ERROR at line 1:
ORA-00031: session marked for kill
SQL> ALTER SYSTEM DISCONNECT SESSION '4471,62525' IMMEDIATE;
ALTER SYSTEM DISCONNECT SESSION '4471,62525' IMMEDIATE
*
ERROR at line 1:
ORA-00031: session marked for kill
这种情况就跟催有些起床困难户起床一样,一波波人赶过去,都败下阵来。 过了一会儿,查看session还是没有任何变化。这个时候只能从操作系统级进行清理了。 不过在清理之前,还是需要先验证一下是否这几个session在做相关的rollback操作。
SET LINESIZE 200
COLUMN username FORMAT A15
SELECT s.username,
s.sid,
s.serial#,
t.used_ublk,
t.used_urec,
rs.segment_name,
r.rssize,
r.status
FROM v$transaction t,
v$session s,
v$rollstat r,
dba_rollback_segs rs
WHERE s.saddr = t.ses_addr
AND t.xidusn = r.usn
AND rs.segment_id = t.xidusn
ORDER BY t.used_ublk DESC;
USERNAME SID SERIAL# USED_UBLK USED_UREC SEGMENT_NAME RSSIZE STATUS
--------------- ---------- ---------- ---------- ---------- ------------------------------ ---------- ---------------
DBAPPUSER 24787 9155 5 207 _SYSSMU94_2377138680$ 1513996288 ONLINE
DEVTEST 25083 169 3 181 _SYSSMU9_3265824918$ 1601298432 ONLINE
USER_ACCOUNT 3185 2609 3 30 _SYSSMU91_864415611$ 1604444160 ONLINE
DBAPPUSER 5803 28753 3 132 _SYSSMU98_2193874896$ 1584521216 ONLINE
DBAPPUSER 372 1053 3 36 _SYSSMU263_2805064819$ 1732501504 ONLINE
没有发现相关的rollback 在操作系统级进行清理,马上就处理掉了。查看sid为4471的session,发现已经被其它用户使用了。这个问题的解决就告一段落。
SID SERIAL# USERNAME OSUSER MACHINE PROCESS TERMINAL TYPE LOGIN_TIME STATUS
---------- ---------- --------------- --------------- -------------------- --------------- --------------- ---------- ------------------- --------
4471 62529 SECCAPP xxxxx ccbappr13 1234 unknown USER 2015-04-01 16:51:21 INACTIVE
可见这个问题不能掉以轻心,最好还是验证一下session是否已经被清理干净,否则这些资源会一直得不到释放,对系统还是有一定的影响。
- Haproxy安装部署文档及多配置文件管理方案
- ASM 翻译系列第三十四弹:ASM磁盘组重要属性介绍
- 博客集成Hitokoto·一言经典语句功能
- 博客网页导致电脑CPU飙升的问题解决记录
- 恢复WordPress分类目录的别名链接形式
- 替代crontab,统一定时任务管理系统cronsun简介
- 小网站最简单实用的动静分离优化方案
- Haproxy进阶管理:命令行控制后端节点上下线
- 网站集成打字震动特效JS代码改进版
- Linux基础知识之文件隐藏属性
- Linux系统chmod误操作目录权限恢复方法
- 结合VBS,实现批处理自动以管理员身份执行
- ASM 翻译系列第三十六弹:ACFS磁盘组的重平衡操作
- Linux基础知识之xargs命令
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux文件服务器实战详解(虚拟用户)
- Linux CentOS下安装Tomcat9及web项目的部署
- Linux文件服务器实战详解(系统用户)
- 关于bash函数你可能不知道的一些事情(译)
- Linux Centos7系统端口占用问题的解决方法
- Linux中利用sudo进行赋权的方法详解
- Centos7下用户登录失败N次后锁定用户禁止登陆的方法
- Linux服务器被黑以后的详细处理步骤
- linux下用户程序同内核通信详解(netlink机制)
- yum安装本地rpm软件方案详解
- CentOS 部署 flask项目的方法
- 在linux服务器下使用版本控制软件SVN的方法
- centos中yum命令删除还原的补救方法介绍
- Linux 创建子进程执行任务的实现方法
- Linux系统下安装jdbc与tomcat的图文教程