CPU 性能诊断案例

本文作者: Allan (allan@itpub.net

Oracle数据库经常会遇到CPU利用率很高的情况,这种时候大都是数据库中存在着严重性能低下的SQL语句,这种SQL语句大大的消耗了CPU资源,导致整个系统性能低下。当然,引起严重性能低下的SQL语句的原因是多方面的,具体的原因要具体的来分析,下面通过一个实际的案例来说明如何来诊断和解决CPU利用率高的这类问题。

操作系统:solairs8

数据库:Oracle9.2.0.4

问题描述:现场工程师汇报数据库非常慢,几乎所有应用操作均无法正常进行。

首先登陆主机,执行top发现CPU资源几乎消耗殆尽,存在很多占用CPU很高的进程,而内存和I/O都不高,具体如下:

last pid: 26136;  load averages:  8.89,  8.91,  8.12                                                                       

216 processes: 204 sleeping, 8 running, 4 on cpu

CPU states:  0.6% idle, 97.3% user,  1.8% kernel,  0.2% iowait,  0.0% swap

Memory: 8192M real, 1166M free, 14M swap in use, 8179M swap free

PID USERNAME THR PRI NICE  SIZE   RES STATE   TIME    CPU COMMAND

25725 oracle     1  50    0 4550M 4508M cpu2   12:23 11.23% oracle

25774 oracle     1  41    0 4550M 4508M run    14:25 10.66% oracle

26016 oracle     1  31    0 4550M 4508M run     5:41 10.37% oracle

26010 oracle     1  41    0 4550M 4508M run     4:40  9.81% oracle

26014 oracle     1  51    0 4550M 4506M cpu6    4:19  9.76% oracle

25873 oracle     1  41    0 4550M 4508M run    12:10  9.45% oracle

25723 oracle     1  50    0 4550M 4508M run    15:09  9.40% oracle

26121 oracle     1  41    0 4550M 4506M cpu0    1:13  9.28% oracle

于是先查看数据库的告警日志ALERT文件,并没有发现有什么错误存在,日志显示数据库运行正常,排除数据库本身存在问题。

然后查看这些占用CPU资源很高的Oracle进程究竟是在做什么操作,使用如下SQL语句:

SQL> select sql_text,spid,v$session.program,process  from

         v$sqlarea,v$session,v$process

     where v$sqlarea.address=v$session.sql_address

           and v$sqlarea.hash_value=v$session.sql_hash_value

           and v$session.paddr=v$process.addr

           and v$process.spid in (PID);

用top中占用CPU很高的进程的PID替换脚本中的PID,得到相应的Oracle进程所执行的SQL语句,发现占用CPU资源很高的进程都是执行同一个SQL语句:

SELECT d.domainname,d.mswitchdomainid, a.SERVICEID,a.SERVICECODE,a.USERTYPE,a.STATUS,a.NOTIFYSTATUS,to_char(a.DATECREATED,'yyyy-mm-dd hh24:mi:ss') DATECREATED,VIPFLAG,STATUS2,CUSTOMERTYPE,CUSTOMERID  FROM service a, gatewayloc b, subbureaunumber c, mswitchdomain d   WHERE b.mswitchdomainid = d.mswitchdomainid and b.gatewaysn = c.gatewaysn  AND a.ServiceCode like c.code||'%' and a.serviceSpecID=1 and a.status!='4' and a.status!='10'  and a.servicecode like '010987654321%' and SubsidiaryID=999999999

基本上可以肯定是这个SQL引起了系统CPU资源大量被占用,那究竟是什么原因造成这个SQL这么大量占用CPU资源呢,我们先来看看数据库的进程等待事件都有些什么:

SQL> select sid,event,p1,p1text from v$session_wait;

       SID    EVENT       P1      P1TEXT
       ---  -------  -----------  ---------
        12 latch free  4.3982E+12 address
        36 latch free  4.3982E+12 address
        37 latch free  4.3982E+12 address
        84 latch free  4.3982E+12 address
       102 latch free  4.3982E+12 address
       101 latch free  4.3982E+12 address
        85 latch free  4.3982E+12 address
       106 latch free  4.3982E+12 address
       155 latch free  4.3982E+12 address
       151 latch free  4.3982E+12 address
       149 latch free  4.3982E+12 address
       147 latch free  4.3982E+12 address
         1 pmon  timer  300 duration

从上面的查询我们可以看出,大都是latch free的等待事件,然后接着查一下这些latch的等待都是什么进程产生的:

SQL> select spid from v$process where addr in

 (select paddr from v$session where sid in(84,102,101,106,155,151));

SPID

----------

25774

26010

25873

25725

由此看出latch free这个等待事件导致了上面的那个SQL语句都在等待,占用了大量的CPU资源。我们来看看究竟主要是那种类型的latch的等待,根据下面的SQL语句:

SQL> SELECT latch#, name, gets, misses, sleeps

     FROM v$latch

     WHERE sleeps>0

     ORDER BY sleeps;

LATCH#  NAME                          GETS     MISSES      SLEEPS  

---------- ----------------------------------------------------------------

    15   messages                       96876       20          1    

   159   library cache pin allocation   407322      43          1    

   132   dml lock allocation            194533      213         2    

     4   session allocation             304897      48          3    

   115   redo allocation                238031      286         4    

    17   enqueue hash chains            277510      85          5    

     7   session idle bit               2727264     314         16   

   158   library cache pin              3881788     5586        58   

   156   shared pool                    2771629     6184        662  

   157   library cache                  5637573     25246       801  

    98   cache buffers chains           1722750424  758400      109837

由上面的查询可以看出最主要的latch等待是cache buffers chains,这个latch的等待表明数据库存在单独的BLOCK的竞争这些latch,我们来看这个latch存在的子latch及其对应的类型:

SQL> SELECT addr, latch#, gets, misses, sleeps

     FROM v$latch_children 

     WHERE sleeps>0         

     and latch# = 98  

     ORDER BY sleeps desc;

ADDR                 LATCH#       GETS     MISSES     SLEEPS

---------------- ---------- ---------- ---------- ----------

000004000A3DFD10         98   10840661      82891        389

000004000A698C70         98     159510          2        244

0000040009B21738         98  104269771      34926        209

0000040009B227A8         98  107604659      35697        185

000004000A3E0D70         98    5447601      18922        156

000004000A6C2BD0         98     853375          7        134

0000040009B24888         98   85538409      25752        106

……………

接着我们来查看sleep较多的子latch对应都有哪些对象:

SQL> select distinct a.owner,a.segment_name,a.segment_type from

     dba_extents a,

      (select dbarfil,dbablk  from x$bh  where hladdr in

          (select addr  from (select addr  from v$latch_children  order by sleeps desc)

           where rownum < 5)

       ) b

   where a.RELATIVE_FNO = b.dbarfil  and a.BLOCK_ID <= b.dbablk and a.block_id + a.blocks > b.dbablk;

OWNER                    SEGMENT_NAME                    SEGMENT_TYPE

---------------------------------------------------------------------------

TEST                    I_SERVICE_SERVICESPECID              INDEX

TEST                    I_SERVICE_SUBSIDIARYID               INDEX

TEST                    SERVICE                              TABLE

TEST                    MSWITCHDOMAIN                        TABLE

TEST                    I_SERVICE_SC_S                       INDEX

…………………

我们看到在开始的那个SQL语句中的几个对象都有包括在内,于是来看看开始的那个SQL的执行计划:

SQL> set autotrace trace explain

SQL>SELECT d.domainname,d.mswitchdomainid, a.SERVICEID,a.SERVICECODE,a.USERTYPE,a.STATUS,a.NOTIFYSTATUS,to_char(a.DATECREATED,'yyyy-mm-dd hh24:mi:ss') DATECREATED,VIPFLAG,STATUS2,CUSTOMERTYPE,CUSTOMERID  FROM service a, gatewayloc b, subbureaunumber c, mswitchdomain d   WHERE b.mswitchdomainid = d.mswitchdomainid and b.gatewaysn = c.gatewaysn  AND a.ServiceCode like c.code||'%' and a.serviceSpecID=1 and a.status!='4' and a.status!='10'  and a.servicecode like '010987654321%' and SubsidiaryID=999999999;

Execution Plan

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE

   1    0   NESTED LOOPS

   2    1     NESTED LOOPS

   3    2       NESTED LOOPS

   4    3         TABLE ACCESS (FULL) OF 'SUBBUREAUNUMBER'

   5    3         TABLE ACCESS (BY INDEX ROWID) OF 'GATEWAYLOC'

   6    5           INDEX (UNIQUE SCAN) OF 'PK_GATEWAYLOC' (UNIQUE)

   7    2       TABLE ACCESS (BY INDEX ROWID) OF 'MSWITCHDOMAIN'

   8    7         INDEX (UNIQUE SCAN) OF 'PK_MSWITCHDOMAIN' (UNIQUE)

   9    1     TABLE ACCESS (BY INDEX ROWID) OF 'SERVICE'

  10    9       AND-EQUAL

  11   10         INDEX (RANGE SCAN) OF 'I_SERVICE_SERVICESPECID' (NON

          -UNIQUE)                

  12   10         INDEX (RANGE SCAN) OF 'I_SERVICE_SUBSIDIARYID' (NON-

          UNIQUE)

根据开始查到的引起latch free等待中的对象和SQL语句的执行计划,觉得SERVICE表上的索引有问题,似乎存在了过多的扫描,于是将同样的SQL语句在别的地市的同样的数据库上执行一下,查看相应的执行计划:

SQL> set autotrace trace explain

SQL>SELECT d.domainname,d.mswitchdomainid, a.SERVICEID,a.SERVICECODE,a.USERTYPE,a.STATUS,a.NOTIFYSTATUS,to_char(a.DATECREATED,'yyyy-mm-dd hh24:mi:ss') DATECREATED,VIPFLAG,STATUS2,CUSTOMERTYPE,CUSTOMERID  FROM service a, gatewayloc b, subbureaunumber c, mswitchdomain d   WHERE b.mswitchdomainid = d.mswitchdomainid and b.gatewaysn = c.gatewaysn  AND a.ServiceCode like c.code||'%' and a.serviceSpecID=1 and a.status!='4' and a.status!='10'  and a.servicecode like '010987654321%' and SubsidiaryID=999999999;

Execution Plan

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE

   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'SERVICE'

   2    1     NESTED LOOPS

   3    2       NESTED LOOPS

   4    3         NESTED LOOPS

   5    4           TABLE ACCESS (FULL) OF 'SUBBUREAUNUMBER'

   6    4           TABLE ACCESS (BY INDEX ROWID) OF 'GATEWAYLOC'

   7    6             INDEX (UNIQUE SCAN) OF 'PK_GATEWAYLOC' (UNIQUE)

   8    3         TABLE ACCESS (BY INDEX ROWID) OF 'MSWITCHDOMAIN'

   9    8           INDEX (UNIQUE SCAN) OF 'PK_MSWITCHDOMAIN' (UNIQUE)

  10    2       INDEX (RANGE SCAN) OF 'I_SERVICE_SC_S' (NON-UNIQUE)

对比两个执行计划,发现索引I_SERVICE_SERVICESPECID和I_SERVICE_SUBSIDIARYID是不应该走的,于是又对比了两个地方SERVICE表上的索引个数:

SQL> select index_name from user_indexes where table_name='SERVICE';

INDEX_NAME

------------------------------

I_SERVICE_ACCOUNTNUM

I_SERVICE_CID

I_SERVICE_DATEACTIVATED

I_SERVICE_PRICEPLANID

I_SERVICE_SC_S

I_SERVICE_SERVICECODE

I_SERVICE_SERVICESPECID

I_SERVICE_SUBSIDIARYID

PK_SERVICE_SID

SQL> select index_name from user_indexes where table_name='SERVICE';

INDEX_NAME

------------------------------

I_SERVICE_ACCOUNTNUM

I_SERVICE_CID

I_SERVICE_DATEACTIVATED

I_SERVICE_SC_S

I_SERVICE_SERVICECODE

PK_SERVICE_SID

发现存在问题的数据库中的SERVICE表上不知道怎么多出了I_SERVICE_PRICEPLANID、I_SERVICE_SERVICESPECID 、I_SERVICE_SUBSIDIARYID三个索引,而这些索引就是导致了开始那个SQL语句用了不该用的索引,引起latch free等待和CPU占用很高的罪魁祸首,于是删除了那三个索引,重新执行相应的SQL语句,很快就得出了结果,CPU的利用率也马上下降为正常了,观察结果如下:

last pid: 26387;  load averages:  1.61, 1.38, 1.21                                                                      

195 processes: 194 sleeping, 1 on cpu

CPU states: 96.2% idle,  1.6% user,  1.7% kernel,  0.5% iowait,  0.0% swap

Memory: 8192M real, 1183M free, 14M swap in use, 8179M swap free

PID USERNAME THR PRI NICE  SIZE   RES STATE   TIME    CPU COMMAND

26383 oracle     1  59    0 4550M 4506M sleep   0:12  4.52% oracle

  409 root      15  59    0 7168K 7008K sleep 173.1H  0.53% picld

25653 oracle     1  59    0 4550M 4508M sleep   2:12  0.48% oracle

26384 root       1  59    0 2800K 1912K cpu2    0:00  0.21% top-3.5b8-sun4u

25569 oracle     1  59    0 4550M 4508M sleep   0:12  0.09% oracle

25717 oracle     1  59    0 4550M 4507M sleep   0:07  0.05% oracle

25571 oracle     1  59    0 4550M 4507M sleep   0:10  0.04% oracle

25681 oracle     1  59    0 4550M 4508M sleep   0:10  0.04% oracle

25544 oracle     1  58    0 4554M 4501M sleep   0:14  0.03% oracle

25703 oracle     1  59    0 4550M 4506M sleep   0:23  0.03% oracle

………………

对于CPU利用率过高的情况,如果是SQL语句性能比较低下引起的基本上都可以按照这个思路来诊断和解决问题,当然具体问题还得具体分析,解决问题的方法也有很多种,这里不过是抛砖引玉一下,只要能最终达到我们解决问题的目的就可以了。


总结cpu调优的步骤:

1、top命令检查cpu,内存使用情况

2、查看数据库告警日志alertSID.log 排除数据库本身出现问题。

3、根据top命令的pid,找到对应的,导致cpu被大量使用的sql语句(v4session , v$progress , v$sqlarea)。

4、看看当前数据库在等待什么事件。并且找出对应的会话的sid(v$sessison_wait)

5、v$progress 和 v$session 视图连接根据地址,核实pid 与sid。

6、查询v$latch视图,查看等待哪种类型的latch。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手,深入研究相关技术,并结合性能调整及丰富的诊断案例,力图将Oracle知识全面、系统、深入地展现给读者。   本书给出了大量取自实际工作现场的实例,在分析实例的过程中,兼顾深度与广度,不仅对实际问题的现象、产生原因和相关的原理进行了深入浅出的讲解,更主要的是,结合实际应用环境,提供了一系列解决问题的思路和方法,包括详细的操作步骤,具有很强的实战性和可操作性,适用于具备一定数据库基础、打算深入学习Oracle技术的数据库从业人员,尤其适用于入门、进阶以及希望深入研究Oracle技术的数据库管理人员。 第1章 数据库的启动和关闭 1 1.1 数据库的启动 1 1.1.1 启动数据库到NOMOUNT状态的过程 2 1.1.2 启动数据库到MOUNT状态 18 1.1.3 启动数据库OPEN阶段 26 1.2 数据库的访问 37 1.2.1 客户端的TNSNAMES.ORA文件配置 37 1.2.2 服务器端的监听器文件listener.ora配置 39 1.2.3 通过不同服务器名对数据库的访问 41 1.2.4 动态监听器注册服务 42 1.3 数据库的关闭 46 1.3.1 数据库关闭的步骤 46 1.3.2 几种关闭方式的对比 48 第2章 控制文件与数据库初始化 51 2.1 控制文件的内容 51 2.2 SCN 53 2.2.1 SCN的定义 53 2.2.2 SCN的获取方式 53 2.2.3 SCN的进一步说明 54 2.3 检查点(Checkpoint) 57 2.3.1 检查点(Checkpoint)的工作原理 57 2.3.2 常规检查点与增量检查点 59 2.3.3 LOG_CHECKPOINT_TO_ALERT参数 63 2.3.4 控制文件与数据文件头信息 64 2.3.5 数据库的启动验证 66 2.3.6 使用备份的控制文件 70 2.3.7 FAST_START_MTTR_TARGET 71 2.3.8 关于检查点执行的案例 74 2.3.9 Oracle 10g自动检查点调整 75 2.3.10 检查点信息及恢复起点 78 2.3.11 正常关闭数据库的状况 78 2.3.12 数据库异常关闭的情况 80 2.3.13 数据库并行恢复案例一则 82 2.3.14 判断一个死事务的恢复进度 85 2.4 数据库的初始化 86 2.4.1 bootstrap$及数据库初始化过程 86 2.4.2 bootstrap$的定位 88 2.4.3 Oracle中独一无二的Cache对象 89 2.4.4 Oracle数据库的引导 91 2.4.5 系统对象与bootstrap$ 92 2.4.6 bootstrap$的重要性 94 2.4.7 BBED工具的简要介绍 95 2.4.8 坏块的处理与恢复 97 第3章 参数及参数文件 103 3.1 初始化参数的分类 103 3.1.1 推导参数(Derived Parameters) 103 3.1.2 操作系统依赖参数 104 3.1.3 可变参数 104 3.1.4 初始化参数的获取 105 3.2 参数文件 107 3.2.1 PFILE和SPFILE 108 3.2.2 获取参数的视图 110 3.2.3 SPFILE的创建 111 3.2.4 SPFILE的搜索顺序 112 3.2.5 使用PFILE/SPFILE启动数据库 112 3.2.6 修改参数 113 3.2.7 解决SPFILE参数修改错误 118 3.2.8 重置SPFILE中设置的参数 120 3.2.9 判断是否使用了SPFILE 120 3.2.10 SPFILE的备份与恢复 121 3.2.11 Oracle 11g参数文件恢复 127 3.2.12 如何设置Events事件 128 3.2.13 导出SPFILE文件 129 3.3 诊断案例之一:参数文件 131 3.3.1 登录系统检查告警日志文件 131 3.3.2 尝试重新启动数据库 132 3.3.3 检查数据文件 132 3.3.4 MOUNT数据库,检查系统参数 133 3.3.5 检查参数文件 133 3.3.6 再次检查alert文件 134 3.3.7 修正PFILE 135 3.3.8 启动数据库 135 3.4 诊断案例之二:RAC环境参数文件 135 3.4.1 数据库资源异常 135 3.4.2 问题的发现 136 3.4.3 参数文件问题的解决 137 第4
深入解析OracleDBA入门进阶与诊断案例 扫描版 作  者:盖国强 著 出 版 社:人民邮电出版社 出版时间:2009-1-1 页  数:527 内容简介   针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手,深入研究相关技术,并结合性能调整及丰富的诊断案例,力图将Oracle知识全面、系统、深入地展现给读者。   本书给出了大量取自实际工作现场的实例,在分析实例的过程中,兼顾深度与广度,不仅对实际问题的现象、产生原因和相关的原理进行了深入浅出的讲解,更主要的是,结合实际应用环境,提供了一系列解决问题的思路和方法,包括详细的操作步骤,具有很强的实战性和可操作性,适用于具备一定数据库基础、打算深入学习Oracle技术的数据库从业人员,尤其适用于入门、进阶以及希望深入研究Oracle技术的数据库管理人员。 目录 第1章 数据库的启动和关闭   1.1 数据库的启动   1.2 数据库的访问   1.3 数据库的关闭  第2章 控制文件与数据库初始化   2.1 控制文件的内容   2.2 SCN   2.3 检查点(Checkpoint)   2.4 数据库的初始化  第3章 参数及参数文件   3.1 初始化参数的分类   3.2 参数文件   3.3 诊断案例之一:参数文件   3.4 诊断案例之二:RAC环境参数文件  第4章 数据字典   4.1 数据字典概述   4.2 内部RDBMS(X$)表   4.3 数据字典表   4.4 静态数据字典视图   4.5 动态性能视图   4.6 最后的验证  第5章 内存管理   5.1 PGA管理   5.2 SGA管理   5.3 Oracle的内存分配和使用  第6章 Buffer Cache与Shared Pool原理   6.1 Buffer Cache原理   6.2 Shared Pool的基本原理  第7章 重做(Redo)   7.1 Redo的作用   7.2 Redo的原理   7.3 Redo与Latch   7.4 Oracle 9i Redo的增强   7.5 Oracle 10g Redo的增强   7.6 Redo的内容   7.7 产生多少Redo   7.8 Redo写的触发条件   7.9 Redo Log Buffer的大小设置   7.10 commit做了什么?   7.11 日志的状态   7.12 日志的块大小   7.13 日志文件的大小   7.14 如何调整日志文件大小   7.15 为什么热备份期间产生的Redo要比正常的多   7.16 能否不生成Redo   7.17 Redo故障的恢复   7.18 诊断案例一:通过Clear日志恢复数据库   7.19 诊断案例二:日志组过度激活的诊断   附录 数值在Oracle的内部存储  第8章 回滚与撤销   8.1 什么是回滚和撤销   8.2 回滚段存储的内容   8.3 并发控制和一致性读   8.4 回滚段的前世今生   8.5 Oracle 10g的UNDO_RETENTION管理增强   8.6 UNDO_RETENTION的内部实现   8.7 Oracle 10g In Memory Undo新特性   8.8 Oracle 11g UNDO表空间备份增强   8.9 回滚机制的深入研究   8.10 Oracle 9i闪回查询的新特性   8.11 使用ERRORSTACK进行错误跟踪   8.12 Oracle 10g闪回查询特性的增强   8.13 ORA-01555成因与解决   8.14 Oracle 11g闪回数据归档   8.15 AUM下如何重建UNDO表空间   8.16 使用Flashback Query恢复误删除数据   8.17 诊断案例之一:释放过度扩展的UNDO空间   8.18 特殊情况的恢复   8.19 诊断案例之二:回滚段损坏的恢复  第9章 等待事件   9.1 等待事件的源起   9.2 从等待发现瓶颈   9.3 Oracle 10g的增强   9.4 顶级等待事件   9.5 重要等待事件  第10章 性能诊断与SQL优化   10.1 使用AUTOTRACE功能辅助SQL优化   10.2 获取SQL执行计划的方法   10.3 捕获问题SQL解决过度CPU消耗问题   10.4 使用SQL_TRACE/10046事件进行数据库诊断   10.5 使用物化视图进行翻页性能调整   10.6 一次横跨两岸的问题诊断   10.7 总结
深入解析OracleDBA入门进阶与诊断案例 扫描版 作  者:盖国强 著 出 版 社:人民邮电出版社 出版时间:2009-1-1 页  数:527 内容简介   针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手,深入研究相关技术,并结合性能调整及丰富的诊断案例,力图将Oracle知识全面、系统、深入地展现给读者。   本书给出了大量取自实际工作现场的实例,在分析实例的过程中,兼顾深度与广度,不仅对实际问题的现象、产生原因和相关的原理进行了深入浅出的讲解,更主要的是,结合实际应用环境,提供了一系列解决问题的思路和方法,包括详细的操作步骤,具有很强的实战性和可操作性,适用于具备一定数据库基础、打算深入学习Oracle技术的数据库从业人员,尤其适用于入门、进阶以及希望深入研究Oracle技术的数据库管理人员。 目录 第1章 数据库的启动和关闭   1.1 数据库的启动   1.2 数据库的访问   1.3 数据库的关闭  第2章 控制文件与数据库初始化   2.1 控制文件的内容   2.2 SCN   2.3 检查点(Checkpoint)   2.4 数据库的初始化  第3章 参数及参数文件   3.1 初始化参数的分类   3.2 参数文件   3.3 诊断案例之一:参数文件   3.4 诊断案例之二:RAC环境参数文件  第4章 数据字典   4.1 数据字典概述   4.2 内部RDBMS(X$)表   4.3 数据字典表   4.4 静态数据字典视图   4.5 动态性能视图   4.6 最后的验证  第5章 内存管理   5.1 PGA管理   5.2 SGA管理   5.3 Oracle的内存分配和使用  第6章 Buffer Cache与Shared Pool原理   6.1 Buffer Cache原理   6.2 Shared Pool的基本原理  第7章 重做(Redo)   7.1 Redo的作用   7.2 Redo的原理   7.3 Redo与Latch   7.4 Oracle 9i Redo的增强   7.5 Oracle 10g Redo的增强   7.6 Redo的内容   7.7 产生多少Redo   7.8 Redo写的触发条件   7.9 Redo Log Buffer的大小设置   7.10 commit做了什么?   7.11 日志的状态   7.12 日志的块大小   7.13 日志文件的大小   7.14 如何调整日志文件大小   7.15 为什么热备份期间产生的Redo要比正常的多   7.16 能否不生成Redo   7.17 Redo故障的恢复   7.18 诊断案例一:通过Clear日志恢复数据库   7.19 诊断案例二:日志组过度激活的诊断   附录 数值在Oracle的内部存储  第8章 回滚与撤销   8.1 什么是回滚和撤销   8.2 回滚段存储的内容   8.3 并发控制和一致性读   8.4 回滚段的前世今生   8.5 Oracle 10g的UNDO_RETENTION管理增强   8.6 UNDO_RETENTION的内部实现   8.7 Oracle 10g In Memory Undo新特性   8.8 Oracle 11g UNDO表空间备份增强   8.9 回滚机制的深入研究   8.10 Oracle 9i闪回查询的新特性   8.11 使用ERRORSTACK进行错误跟踪   8.12 Oracle 10g闪回查询特性的增强   8.13 ORA-01555成因与解决   8.14 Oracle 11g闪回数据归档   8.15 AUM下如何重建UNDO表空间   8.16 使用Flashback Query恢复误删除数据   8.17 诊断案例之一:释放过度扩展的UNDO空间   8.18 特殊情况的恢复   8.19 诊断案例之二:回滚段损坏的恢复  第9章 等待事件   9.1 等待事件的源起   9.2 从等待发现瓶颈   9.3 Oracle 10g的增强   9.4 顶级等待事件   9.5 重要等待事件  第10章 性能诊断与SQL优化   10.1 使用AUTOTRACE功能辅助SQL优化   10.2 获取SQL执行计划的方法   10.3 捕获问题SQL解决过度CPU消耗问题   10.4 使用SQL_TRACE/10046事件进行数据库诊断   10.5 使用物化视图进行翻页性能调整   10.6 一次横跨两岸的问题诊断   10.7 总结
深入解析OracleDBA入门进阶与诊断案例 扫描版 作  者:盖国强 著 出 版 社:人民邮电出版社 出版时间:2009-1-1 页  数:527 内容简介   针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手,深入研究相关技术,并结合性能调整及丰富的诊断案例,力图将Oracle知识全面、系统、深入地展现给读者。   本书给出了大量取自实际工作现场的实例,在分析实例的过程中,兼顾深度与广度,不仅对实际问题的现象、产生原因和相关的原理进行了深入浅出的讲解,更主要的是,结合实际应用环境,提供了一系列解决问题的思路和方法,包括详细的操作步骤,具有很强的实战性和可操作性,适用于具备一定数据库基础、打算深入学习Oracle技术的数据库从业人员,尤其适用于入门、进阶以及希望深入研究Oracle技术的数据库管理人员。 目录 第1章 数据库的启动和关闭   1.1 数据库的启动   1.2 数据库的访问   1.3 数据库的关闭  第2章 控制文件与数据库初始化   2.1 控制文件的内容   2.2 SCN   2.3 检查点(Checkpoint)   2.4 数据库的初始化  第3章 参数及参数文件   3.1 初始化参数的分类   3.2 参数文件   3.3 诊断案例之一:参数文件   3.4 诊断案例之二:RAC环境参数文件  第4章 数据字典   4.1 数据字典概述   4.2 内部RDBMS(X$)表   4.3 数据字典表   4.4 静态数据字典视图   4.5 动态性能视图   4.6 最后的验证  第5章 内存管理   5.1 PGA管理   5.2 SGA管理   5.3 Oracle的内存分配和使用  第6章 Buffer Cache与Shared Pool原理   6.1 Buffer Cache原理   6.2 Shared Pool的基本原理  第7章 重做(Redo)   7.1 Redo的作用   7.2 Redo的原理   7.3 Redo与Latch   7.4 Oracle 9i Redo的增强   7.5 Oracle 10g Redo的增强   7.6 Redo的内容   7.7 产生多少Redo   7.8 Redo写的触发条件   7.9 Redo Log Buffer的大小设置   7.10 commit做了什么?   7.11 日志的状态   7.12 日志的块大小   7.13 日志文件的大小   7.14 如何调整日志文件大小   7.15 为什么热备份期间产生的Redo要比正常的多   7.16 能否不生成Redo   7.17 Redo故障的恢复   7.18 诊断案例一:通过Clear日志恢复数据库   7.19 诊断案例二:日志组过度激活的诊断   附录 数值在Oracle的内部存储  第8章 回滚与撤销   8.1 什么是回滚和撤销   8.2 回滚段存储的内容   8.3 并发控制和一致性读   8.4 回滚段的前世今生   8.5 Oracle 10g的UNDO_RETENTION管理增强   8.6 UNDO_RETENTION的内部实现   8.7 Oracle 10g In Memory Undo新特性   8.8 Oracle 11g UNDO表空间备份增强   8.9 回滚机制的深入研究   8.10 Oracle 9i闪回查询的新特性   8.11 使用ERRORSTACK进行错误跟踪   8.12 Oracle 10g闪回查询特性的增强   8.13 ORA-01555成因与解决   8.14 Oracle 11g闪回数据归档   8.15 AUM下如何重建UNDO表空间   8.16 使用Flashback Query恢复误删除数据   8.17 诊断案例之一:释放过度扩展的UNDO空间   8.18 特殊情况的恢复   8.19 诊断案例之二:回滚段损坏的恢复  第9章 等待事件   9.1 等待事件的源起   9.2 从等待发现瓶颈   9.3 Oracle 10g的增强   9.4 顶级等待事件   9.5 重要等待事件  第10章 性能诊断与SQL优化   10.1 使用AUTOTRACE功能辅助SQL优化   10.2 获取SQL执行计划的方法   10.3 捕获问题SQL解决过度CPU消耗问题   10.4 使用SQL_TRACE/10046事件进行数据库诊断   10.5 使用物化视图进行翻页性能调整   10.6 一次横跨两岸的问题诊断   10.7 总结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值