DBA学习之路

敬畏数据,谨慎对待每一个问题

导航

与awr/addm/ash类似信息的相关视图

Posted on 2024-05-11 21:38  dclogs  阅读(10)  评论(0编辑  收藏  举报

转自:https://www.cnblogs.com/lijiaman/p/10381167.html

转自:https://blog.csdn.net/u014596132/article/details/135558951

(一)与awr/addm/ash类似信息的相关视图

(1)视图

  • v$session
  • v$active_session_history、wrh$_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$SESSIONV$SESSION_WAIT

(2.2)v$active_session_history

  v$active_session_history是记录了数据库活跃会话的采样,如果是多节点,则用gv$active_session_history来查看所有节点的信息。每隔1秒钟,数据库会进行一次采样,将活跃会话记录到该视图,每个活跃会话记录一行。该视图是ASH的核心,用以记录活动SESSION的历史等待信息,这部分内容记录在内存中,期望值是记录一个小时的内容。

  v$active_session_history使用的是x$ash基表。x$ash数据存放在Shared Pool的ASH Buffer中,大小由隐含参数"_ash_size"决定。每1秒(_ash_sampling_interval,单位毫秒)将v$session中记录保存到 v$active_session_history 视图中,只会加载非idle会话。存在内存,重启就会消失。用做ASH报表,其关系如下图:

视图数据流向说明重要!!!

  1. mmnl进程从gv$session视图(从X$KSUSE基表获取)采集信息到ash buffers中,并且被获取到X$ASH基表中,默认1秒一次(_ash_sampling_interval,单位毫秒)。
  2. gv$active_session_history视图从X$ASH基表读取数据,由mmon进程将gv$active_session_history视图信息持久化到wrh$_active_session_history基表中。
  3. dba_hist_active_sess_history视图从wrh$_active_session_history基表读取数据,默认10秒一次(_ash_disk_filter_ratio,秒)。
  4. awr报告数据从dba_hist_active_sess_history视图获取。

其中x$ksuse是gv$session视图所使用的基表,同样可以通过前面的方法查到(set autotrace trace或者select view_definition from v$fixed_view_definition where view_name='gv$session';)。首先mmnl进程从gv$session动态性能视图中采集信息,默认每秒采集一次,然后将采集的信息写入到ash buffers中,此时活动会话信息已经进入到x$ash表中,然后gv$active_session_history视图从x$ash基表中读取数据,mmon进程负责对gv$active_session_history视图中的信息进行持久化,持久化到wrh$_active_session_history基表中,而dba_hist_active_sess_history视图中的数据又是来源于wrh$_active_session_history基表。可以看到ash相关的部分除了需要mmon进程进行持久化到awr,实际上正如前边所说的,ash 和 awr是两个不同的东西,不能混为一谈。

ash

               图1. v$active_session_history是ash报告的数据来源

关于ash相关的几个隐含参数:

• _ash_disk_filter_ratio

采样到DBA_HIST_ACTIVE_SESS_HISTORY中的频率,默认为10s一次

• _ash_disk_write_enable

开启采样到DBA_HIST_ACTIVE_SESS_HISTORY,设置为false则即使创建快照也不会刷新数据到DBA_HIST_ACTIVE_SESS_HISTORY视图中

• _ash_eflush_trigger

ASH buffers满了多少以后会写出,默认为66%

• _ash_enable

禁用和启用ASH采样

• _ash_sample_all

设置为true,则所有会话都会被采样,包括处于空闲等待的会话,默认是false

• _ash_sampling_interval

ASH采样间隔时间,默认为1000ms

• _ash_size

ASH buffers大小

查看_ash_size如果超过256m可能触发bug20185439(2268127.1)

如果_ash_size过小(默认1m),可能导致刷新次数过多,造成性能瓶颈。

设置参数会刷新一次。

建议大小为 total_size的1.5倍

select total_size/1024/1024,awr_flush_emergency_count from v$ash_info;

Oracle建议多次出现此问题再解决 Active Session History (ASH) performed an emergency flush

ash是否存在异常刷新(awr_flush_emergency_count)

select total_size/1024/1024,awr_flush_emergency_count from v$ash_info;

alter system set “_ash_size”=2048618 sid=‘*’ scope=spfile

(2.3)dba_hist_active_sess_history

  视图gv$active_session_history会每秒钟将数据库所有节点的活跃会话采样一次,但是数据是存放在内存中的,无法长久保存。而mmon进程把v$active_session_history中的信息采集到基表WRH$_ACTIVE_SESSION_HOSTORY,然后dba_hist_active_sess_history从基表中获取信息,awr从dba_hist_active_sess_history中每隔10秒钟转储来自v$active_session_history的活动session信息。可以说,dba_hist_active_sess_history是v$active_session_history的持久化视图。多个触发条件写入dba视图中。

(3)它们之间的视图数据流向(为方便记忆,下图不涉及基表,如需理解可往上查看)

                                              视图数据流向

ps:这里需要非常注意,假如一个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来得到类似的效果。

image

                                                                  图1.blocking session树形图

我们来做一次测试,对表test01和test02进行DML操作,观察运行情况,操作如下

(1)创建测试表test01,test02。并在2个表的id列添加主键约束

image image

         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";
复制代码

结果如下,红色的为阻塞源头:

image

(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/dclogs/p/18187201