分类: Oracle
2006-03-17 16:16:22
附连内存的 SGA 查询(第 2 版中 Arup 最喜欢的特性)位于该列表之首,但优化程序统计信息管理、新的“比较时段”报表以及其他新特性同样引人注目。
这一部分涉及:
·
·
·
·
·
·
·
挂起但未瘫痪:附连内存的 SGA 查询
假设您使用 Oracle 企业管理器诊断和解决性能问题。一天,出现了一个棘手的问题:一个设计糟糕的应用程序引起了严重的库高速缓存锁定问题,并且数据库呈现挂起状态。您必须快速确定导致该问题发生的会话,并快速终止这些会话。
您可以启动 Oracle 企业管理器来诊断此问题。且慢!如果整个数据库充满了挂起的会话,那么 Oracle 企业管理器中的查询是否也会挂起?
如果使用 Oracle 数据库 10g 第 2 版,则答案是否定的。正如我在中所介绍的,在该版本中,“在内存访问模式下进行监控”选项使企业管理器可以直接从 SGA 内存(而不是 V$SESSION)中选择会话。因为在该模式下绕过了 SQL 层,挂起的数据库就不会阻碍此查询的执行。相反,将自动启动查询。 让我们看看该特性是如何工作的。在 Enterprise Manager 屏幕上,选择 Performance 选项卡并滚动到该页面底部的“Additional Monitoring Links”部分,屏幕与下图类似。 注意红色椭圆框中“Hang Analysis”的超链接。单击该链接,将显示一个与下图类似的屏幕。 该图展示了各种“死”会话。在该示例中,您可以看到 SID 为 193 的会话(根会话)已经阻止了其他两个会话,即 192 和 214。该图中的会话颜色表示会话受阻的时间。可以单击 SID 访问 Session Details 屏幕,以获取更多信息。 还记得 ORADEBUG 实用程序吗?Oracle 企业管理器使用该实用程序获得有关系统挂起的数据。启用 SGA 直接连接时,Oracle 将对每个实例使用一个 SQL 收集器。该收集器随企业管理器自动启动。检索到以下视图中的数据:V$SESSION V$SESSION_WAIT V$SYSTEM_EVENT V$SYSSTAT附连内存的 SGA 查询是一个非常强大的特性,以后肯定能帮您解决棘手问题。我们都对可“征服”数据库的应用程序有一种亲切感,为什么呢?现在,您可以给出答案了。我认为此特性是第 2 版一个最适用于数据库管理员的特性。
如果 SQL 工作负载很大(包含上百条语句)并且 SQL 语句比较复杂,您可能等待较长的时间。但与些同时却用户迫切要求您提供答案。您该怎么办?
在 Oracle 数据库 10g 第 2 版中,您可以轻松地中断此顾问程序并查看到目前为止生成的建议或查找结果。第 1 版中的 SQL Tuning Advisor 中提供这些功能,现在已经扩展到 SQL Access Advisor。 让我们看看该功能的工作方式。从 Advisor Central 屏幕中,单击 SQL Access Advisor 链接。 从标题“Actions”旁边的右侧下拉列表中选择“Interrupt”选项,然后按 Go 按钮。该命令将中断 SQL Access Advisor,您可以立即看到建议。当然,这些建议并不是完整的集合,但在大多数情况下可以满足用户的需要。 如果您使用的是命令行版本的 SQL Access Advisor 而不是 Oracle 企业管理器,那么您是否仍可以查看工作进度?当然,您可以使用新的视图 V$ADVISOR_PROGRESS。SQL> desc v$advisor_progress Name Null?类型 ----------------------------------------- -------- ----------- SID NUMBER SERIAL# NUMBER USERNAME VARCHAR2(30) OPNAME VARCHAR2(64) ADVISOR_NAME VARCHAR2(64) TASK_ID NUMBER TARGET_DESC VARCHAR2(32) SOFAR NUMBER TOTALWORK NUMBER UNITS VARCHAR2(32) BENEFIT_SOFAR NUMBER BENEFIT_MAX NUMBER FINDINGS NUMBER RECOMMENDATIONS NUMBER TIME_REMAINING NUMBER START_TIME DATE LAST_UPDATE_TIME DATE ELAPSED_SECONDS NUMBER ADVISOR_METRIC1 NUMBER METRIC1_DESC VARCHAR2(64)此处的列 TOTALWORK 和 SOFAR 显示了已经完成的工作量以及总工作量,这与您从 V$SESSION_LONGOPS 视图中看到的内容相似。
select sid, serial#, sql_trace, sql_trace_waits, sql_trace_binds from v$session where username = 'HR'输出结果如下:
SID SERIAL# SQL_TRAC SQL_T SQL_T ---------- ---------- -------- ----- ----- 196 60946 DISABLED FALSE FALSE此处您可以看到,SID 为 196、Serial# 为 60946 的会话未启用跟踪。 现在,您可以对等待事件(而不是绑定变量)启用跟踪。可以使用程序包 dbms_monitor 启用跟踪。
begin dbms_monitor.session_trace_enable ( session_id => 196, serial_num => 60960, waits => true, binds => false ); end; /现在,如果您要查看会话信息:
select sid, serial#, sql_trace, sql_trace_waits, sql_trace_binds from v$session where username = 'HR'输出结果如下:
SID SERIAL# SQL_TRAC SQL_T SQL_T ---------- ---------- -------- ----- ----- 196 60960 ENABLED TRUE FALSE注意,仅当使用程序包 dbms_monitor 中的过程 session_trace_enable 启用跟踪(而不是通过 alter session set sql_trace = true 或设置事件 10046)时,才会填充视图 V$SESSION。在以后的某个时间点上,如果您要查明哪些会话已经启用了跟踪,可以使用以上查询执行此操作。 如果使用程序包 dbms_monitor 中的其他过程(如 SERV_MOD_ACT_TRACE_ENABLE 或 CLIENT_ID_TRACE_ENABLE)启用了跟踪,V$SESSION 视图将不显示该信息。相反,它们将记录到另一个视图 DBA_ENABLED_TRACES 中。可以将该视图与其他相关信息存储连接在一起以查看启用了跟踪的会话。例如,使用
SELECT * FROM (SELECT SID, 'SESSION_TRACE' trace_type FROM v$session WHERE sql_trace = 'ENABLED') UNION (SELECT SID, t.trace_type FROM v$session s, dba_enabled_traces t WHERE t.trace_type = 'CLIENT_ID' AND s.client_identifier = t.primary_id) UNION (SELECT SID, t.trace_type FROM v$session s, dba_enabled_traces t, v$instance i WHERE t.trace_type = 'SERVICE' AND s.service_name = t.primary_id AND (t.instance_name IS NULL OR t.instance_name = i.instance_name)) UNION (SELECT SID, t.trace_type FROM v$session s, dba_enabled_traces t, v$instance i WHERE t.trace_type = 'SERVICE_MODULE' AND s.service_name = t.primary_id AND s.module = t.qualifier_id1 AND (t.instance_name IS NULL OR t.instance_name = i.instance_name)) UNION (SELECT SID, t.trace_type FROM v$session s, dba_enabled_traces t, v$instance i WHERE t.trace_type = 'SERVICE_MODULE_ACTION' AND s.service_name = t.primary_id AND s.module = t.qualifier_id1 AND s.action = t.qualifier_id2 AND (t.instance_name IS NULL OR t.instance_name = i.instance_name)) UNION (SELECT SID, t.trace_type FROM v$session s, dba_enabled_traces t, v$instance i WHERE t.trace_type = 'DATABASE' AND (t.instance_name IS NULL OR t.instance_name = i.instance_name))输出结果如下:
SID TRACE_TYPE ---------- --------------------- 136 SERVICE_MODULE 136 SERVICE_MODULE_ACTION您可以看到,您已经对会话 136 的 Service Module 和 Service Module Action 启用了跟踪。但 DBA_ENABLED_TRACES 并未显示绑定变量或等待事件。
1 begin 2 DBMS_SWRF_INTERNAL.AWR_EXTRACT ( 3 dmpfile => 'awr_data.dmp', 4 dmpdir => 'TMP_DIR', 5 bid => 302, 6 eid => 305 7 ); 8* end;我们来更详细地介绍一下以上各行。
行 | 说明 |
3 | 此处介绍了数据的目标文件名。这是一个 Data Pump 导出文件。如果未提供文件名,则使用默认值 awrdat.dmp。 |
4 | 写入转储文件的目录对象。在本示例中,您可能已将目录 TMP_DIR 定义为 /tmp。 |
5 | 该时段起始快照的 ID。 |
6 | 结束快照 ID。您在此处导出位于 302 和 305 之间的快照。 |
1 begin 2 DBMS_SWRF_INTERNAL.AWR_LOAD ( 3 SCHNAME => 'ARUP', 4 dmpfile => 'awr_data', 5 dmpdir => 'TMP_DIR' 6 ); 7* end;在此代码中,您将转储文件 awr_data.dmp 的内容加载到由目录对象 TMP_DIR 指定的目录中。加载 AWR 数据时,它并不直接加载到 SYS 模式中,而是先进入另一个模式中。参数 SCHNAME 中提供了模式名(如第 3 行中所示)。导入后,该数据移动到 SYS 模式中:
1 begin 2 DBMS_SWRF_INTERNAL.MOVE_TO_AWR ( 3 SCHNAME => 'ARUP' 4 ); 5* end;此处,您将模式 ARUP 中的 AWR 数据移动到 SYS。 正如我在上面指出的,将 AWR 移动到其他数据库具有很多优点和用途。可以在不同的数据库中分析数据而不会对生产造成太大的影响。此外,可以构建一个由从多个数据库中收集的 AWR 数据组成的中心数据库。 所有这些加载步骤都已经放置到一个名为 awrload.sql 的文件(位于 $ORACLE_HOME/rdbms/bin 目录中)中。同样,脚本 awrextr.sql 包含提取过程的所有步骤。 尽管这个将生产 AWR 数据卸载到备用数据库的机制已被外部化,但它在 Oracle 数据库 10g 第 2 版中的主要用途是帮助解决客户报告的任何问题。使用此方法,客户可以发送 AWR 转储文件格式的原始数据,支持人员随后可以将这些数据导入到他们的模式中以帮助重现和诊断问题。