作者:dbtan |【转载时请以超链接形式标明文章出处作者信息】


Oracle 10g的增强:

虽然v$session_wait记录的信息如此重要,但是这些重要的信息是随session而消逝的,如果我们希望获得数据库的历史状态及session的历史状态及session的历史等待信息等数据,是不可得的。

所以很多时候很难回答这样的问题:
·这个系统昨天是什么样子的?
·今天和昨天相比有什么不同?
·1个小时前的那次性能下滑是哪个用户引起的?
·是哪些事件使我们今天用了更多的时间来等待?
你也可能一次又一次地听到Oracle Support这样问:
·问题出现时系统是怎样的状况?
·问题出现时系统有哪些等待?
·你能否重现(Reproduce)问题以使我们判断?

很多这样的问题是极其使人恼火的,我们当然不希望问题重现(reproduce)再次引起宕机或业务损失,而那些问题看起来分明是不作为的责任推卸。可是事实是,失去了现场和当时的状态以及session的实时信息,DBA也的确很难判断问题的所在。

从Oracle 10g开始,Oracle开始改变这一切,所以赘述这么多,我只想更郑重地告诉大家,这一改变是多么的重要。

新增v$session_wait_history视图:
为了更有效地保留session信息,Oracle 10g新增了一个v$session_wait_history视图,该视图用以记录活动session的最近10次等待事件。以下查询输出了SID为1078的会话最近的10次等待,以前这些信息一旦成为历史就无法获取:

sys@CCDB> select event,p1text,p1,p2text,p2,p3text,p3,wait_time
  2  from v$session_wait_history where sid = 1078;
EVENT                          P1TEXT             P1 P2TEXT         P2 P3TEXT         P3  WAIT_TIME
------------------------------ ---------- ---------- ---------- ------ ---------- ------ ----------
SQL*Net message to client      driver id  1650815232 #bytes          1                 0          0
SQL*Net message from client    driver id  1650815232 #bytes          1                 0          0
SQL*Net message to client      driver id  1650815232 #bytes          1                 0          0
SQL*Net message from client    driver id  1650815232 #bytes          1                 0          0
SQL*Net message to client      driver id  1650815232 #bytes          1                 0          0
SQL*Net message from client    driver id  1650815232 #bytes          1                 0          0
SQL*Net message to client      driver id  1650815232 #bytes          1                 0          0
SQL*Net message from client    driver id  1650815232 #bytes          1                 0          0
SQL*Net message to client      driver id  1650815232 #bytes          1                 0          0
SQL*Net message from client    driver id  1650815232 #bytes          1                 0          0
10 rows selected.

v$session_wait_history缺省记录活动会话最近的10次等待,这个约束受到一个隐含参数的影响,这个参数就是_session_wait_history其缺省值是10,如果想保留活动会话更多的等待,可以通过修改这个隐含参数来进行:

sys@CCDB> @GetHidPar.sql
Enter value for par: session_wait_history
old   4: AND x.ksppinm LIKE '%&par%'
new   4: AND x.ksppinm LIKE '%session_wait_history%'
NAME                     VALUE     DESCRIB
------------------------ --------- -------------------------------------------
_session_wait_history    10        enable session wait history collection

通过v$session_wait_history这个视图,可以将v$session_wait的功能进行延伸,获取更多的相关信息辅助数据库问题诊断。这是Oracle迈出的一小步。

- The End -