Oracle session相关数据字典(一)
(一)session相关视图
(1)视图
- v$session
- v$active_session_history
- dba_hist_active_session_history
如果是多节点数据库,v$session和v$active_hist_session_history仅获得单节点的信息,可以使用gv$sessiongv$active_session_history来获取所有节点的信息。
(2)三个视图介绍
(2.1)v$session
v$session视图记录了当前连接到数据库的session信息,记录的是实时的数据,当有新的会话连接到数据库时,v$session就会产生一条新的session记录,一旦会话断开,记录消除,所以v$session的信息是实时动态变化的。
视图结构如下:
链接: v$session视图介绍 ,其它2个视图与其类似,不再介绍。
(2.2)v$active_session_history
v$active_session_history是记录了数据库活跃会话的采样,如果是多节点,则用gv$active_session_history来查看所有节点的信息。每隔1秒钟,数据库会进行一次采样,将活跃会话记录到该视图,每个活跃会话记录一行。该视图是ASH的核心,用以记录活动SESSION的历史等待信息,这部分内容记录在内存中,期望值是记录一个小时的内容。
关于活跃会话的定义,大致如下:会话在CPU进行运算或者是非空闲等待的会话都属于活跃会话。官方解释:A database session is considered active if it was on the CPU or was waiting for an event that didn't belong to the Idle
wait class. Refer to the V$EVENT_NAME
view for more information on wait classes.
图1. v$active_session_history是ash报告的数据来源
(2.3)dba_hist_active_sess_history
视图gv$active_session_history会每秒钟将数据库所有节点的活跃会话采样一次,但是数据是存放在内存中的,无法长久保存。而dba_hist_active_sess_history则会将gv$active_session_history里的数据每10秒采样一次并持久化保存。
(3)视图数据流向
图2.视图数据流向
注意:这里需要非常注意,假如一个sql语句运行了100秒,那么会在v$active_session_history里面采集到100~101次,而v$dba_hist_active_session_history每隔10秒从v$active_session_history里面采集一次样本,那么会采集到10~11次样本,计算时间时需要x10.
(二)session相关视图的用途
(1)使用v$session来查看实时阻塞会话
以前处理异常锁的方式如下:
1.查询blocking session
select se.machine,se.sid,se.serial#,se.seconds_in_wait,se.paddr,lo.block from v$lock lo, v$session se where lo.sid = se.sid and lo.block > 0; --bloc>0代表这个会话阻塞了其他会话
2.根据1的sid,serial#杀死会话
alter system kill session 'sid,serial#';
后来在EM里面的Blocking session里面看到下图,以折叠图的形式展现,最上面的代表正在阻塞其它session的会话,研究了一下,可以使用v$session来得到类似的效果。
图1.blocking session树形图
我们来做一次测试,对表test01和test02进行DML操作,观察运行情况,操作如下
(1)创建测试表test01,test02。并在2个表的id列添加主键约束
test01表 test02表
(2)对2个表进行操作,执行顺序如下
----------------------------------------test01操作-------------------------------------------------------
[sessid:27 ] delete from test01; --删除test01整个表的数据,未提交,阻塞源头
[sessid:28 ] update test01 set name = 'aaa' where id = 1; --更新test01表id=1的行,会话产生等待
[sessid:142] insert into test01 values(1,'abc'); --插入test01表id=1的行,会话产生等待
[sessid:25 ] delete from test01 where id = 2; --删除test01表id=2的行,会话产生等待
[sessid:29 ] update test01 set name = 'bbb' where id = 2; --更新test01表id=2的行,会话产生等待
-----------------------------------------test02操作--------------------------------------------------------
[sessid:30 ] insert into test02 values(3,'augly',3000); --插入test02表id=3的行,未提交,阻塞源头
[sessid:23 ] insert into test02 values(3,'augly',3300); --插入test02表id=3的行,会话产生等待
此时我们到EM里面观察,就会发现图1的blocking session树形图。
在实际环境中,大部分系统是没有安装EM的,在没有EM的情况下,我们依然可以通过v$session得到类似的图形
--使用v$session来查看阻塞session信息 SELECT LPAD(' ',5*LEVEL-1)||S."USERNAME" AS user_name , LPAD(' ',5*LEVEL-1)||S."SID" AS session_id, S."SERIAL#", S."SQL_ID",
S."ROW_WAIT_OBJ#", S."WAIT_CLASS", S."EVENT", S."P1", S."P2", S."P3", S."SECONDS_IN_WAIT" FROM V$SESSION S WHERE S."BLOCKING_SESSION" IS NOT NULL OR S.SID IN(SELECT DISTINCT BLOCKING_SESSION FROM V$SESSION) START WITH S."BLOCKING_SESSION" IS NULL CONNECT BY PRIOR S."SID" = S."BLOCKING_SESSION";
结果如下,红色的为阻塞源头:
(2)使用v$active_session_history、dba_hist_active_sess_history来查看历史阻塞会话信息
有时数据库出现问题,而我们不在现场,事后需要分析当时的业务异常情况,可以使用v$active_session_history和dba_hist_active_sess_history来分析当时的情况。
使用dba_hist_active_sess_history的例子:https://www.cnblogs.com/lijiaman/p/10423272.html
【完】
相关文章
- Oracle数据库:数据的仓库,永久就存储,Oracle安装教程,修改Oracle scott,sys,system用户的密码,查看表格
- Oracle数据库:oracle数据类型转换to_char()日期和数字转字符,to_number()字符转数字,to_date()字符转日期函数
- Oracle数据库:表的关系:一对多,一对一,多对多,一一继承和修改的关系,表不是重点,重点是数据和约束关系
- Oracle DBCA高级玩法:从模板选择、脚本调用到多租户
- [转]Oracle 多行数据合并成一行
- [转]MYSQL 与 Oracle 之间的数据类型转换
- [转] JAVA读取excel数据(插入oracle数据库)
- ORACLE分区表删除分区数据
- Oracle基本操作,Oracle修改列名,Oracle修改字段类型
- oracle用索引提高效率
- oracle维护数据的完整性
- 在oracle中操作数据——使用特点的格式插入日期 sql函数的使用——日期函数
- 转 oracle catalog 库常用脚本
- Oracle实例与Oracle数据库
- 深入内核:Oracle数据提交与事务隔离的深度解析
- Oracle中用随机数更新字段----将一张表的数据插入另一张表----环境设置
- 迁移mysql数据到oracle上
- 开发基于以太坊的区块链底层平台,秘猿科技想做共识数据时代的Oracle
- oracle 11g RAC 的一些基本概念(三)
- Sqoop是一款开源的工具,主要用于在HADOOP(Hive)与传统的数据库(mysql、oracle...)间进行数据的传递
- 针对各主流数据mysql、sqlserver、oracle中文乱码问题。
- [Oracle工程师手记]X$KCCAL表
- [Oracle 工程师手记]探究 Oracle PDB Application Container (二)
- [Oracle][Metadata]如何查找与某一个功能相关的数据字典名
- [Oracle]查看数据是否被移入 DataBuffer 的方法
- oracle sql生成临时递增数据
- oracle闪回查询
- Windows中cmd命令启动Oracle数据
- 解决办法:由于oracle版本不同导致导入数据时失败
- oracle时间格式转换问题 ORA-01810: format code appears twice--转
- Oracle 快速插入1000万条数据的实现方式
- Oracle引入机器学习、AI保障云安全服务