ORACLE紧急情况信息收集
- 格式:doc
- 大小:68.00 KB
- 文档页数:8
oracle 收集统计信息语句题目:Oracle数据库的收集统计信息语句及其作用导语:Oracle数据库是业界广泛使用的关系数据库管理系统之一,它提供了丰富的功能和优化技术来提高查询性能。
其中,收集统计信息是一项重要的优化策略之一。
本文将详细介绍Oracle数据库中收集统计信息的语句,以及具体的作用。
第一部分:简介和背景介绍Oracle数据库收集统计信息的背景和重要性,并阐述为何需要收集统计信息。
第二部分:收集统计信息的语法详细解析收集统计信息的语句,展示各个参数的含义,包括以下内容:1. ANALYZE TABLE语句:用于收集指定表的统计信息。
2. DBMS_STATS.GATHER_SCHEMA_STATS过程:用于收集整个模式的统计信息。
3. DBMS_STATS.GATHER_DATABASE_STATS过程:用于收集整个数据库的统计信息。
第三部分:收集统计信息的方法和工具介绍通过不同方法和工具收集统计信息的优缺点,并提供一些具体的示例:1. 手动收集统计信息方法,如使用ANALYZE TABLE语句。
2. 自动收集统计信息方法,如使用Oracle的自动统计信息工作调度器。
3. 使用Oracle Enterprise Manager(OEM)的统计信息收集向导。
第四部分:收集统计信息的作用详细说明收集统计信息的具体作用,并阐述收集统计信息对查询性能的影响:1. 改善查询性能:通过收集统计信息,查询优化器可以做出更准确的成本估计,从而生成更优化的执行计划。
2. 刷新数据字典缓存:收集统计信息还可以刷新数据字典缓存,确保最新的数据字典信息供查询优化器使用。
3. 提高空间利用率:通过收集统计信息,数据库管理员可以更好地了解数据库对象的存储和空间使用情况,从而更好地进行容量规划和优化。
第五部分:收集统计信息的最佳实践提供一些建议和最佳实践供读者参考,以确保收集的统计信息有效并提升数据库性能。
结语:总结Oracle数据库中收集统计信息的语句及其作用。
oracle 表信息收集作用及原理在 Oracle 数据库中,表信息的收集涉及收集数据库表的统计信息,这些统计信息对于查询优化器决定最佳执行计划非常重要。
表信息收集包括收集表的大小、行数、索引信息、分区信息以及列的数据分布情况等。
这些统计信息对于数据库的性能优化和查询性能的提升至关重要。
以下是收集表信息的作用和一些原理:1. 查询优化: 统计信息收集对于查询优化器选择最佳执行计划非常重要。
根据表的大小、行数、列的数据分布情况以及索引信息等统计数据,优化器可以更好地选择执行计划,从而提高查询性能。
2. 索引优化: 统计信息能够告诉优化器哪些索引是最有效的,帮助数据库管理系统决定是否使用索引,以及如何使用索引。
3. 成本估算: 收集到的统计信息用于估算不同执行计划的成本,并选择代价最小的执行计划。
4. 自动数据库优化: 在Oracle数据库中,自动数据库优化功能 Automatic Database Optimization)会自动收集表的统计信息,并且在需要时自动执行优化。
收集表信息的原理:收集表信息通常使用Oracle提供的统计信息收集工具,比如`DBMS_STATS`包。
这些工具可以使用以下方法收集表信息:- 收集表的行数和大小信息: 通过扫描表来统计行数和存储空间信息。
- 收集列的数据分布信息: 分析列中数据的分布情况,例如,最小值、最大值、平均值等。
- 收集索引信息: 收集索引的统计信息,如B树索引的高度、键值分布等。
- 收集分区表的分区信息: 对于分区表,收集每个分区的统计信息,包括行数、大小等。
- 收集表的使用情况: Oracle还会记录表的使用情况,比如最近一次访问时间、更新时间等。
在收集表信息时,需要注意统计信息的准确性和更新频率。
定期收集统计信息可以确保优化器有最新的信息来做出最优的执行计划选择。
然而,收集统计信息也需要消耗系统资源,因此需要权衡收集频率和系统开销之间的关系。
⼿动收集oracle的统计信息脚本及相关操作我们⼀般习惯使⽤oracle⾃带的统计信息收集,但很多时候我们会发现,有很多关键的表始终没有被收集过。
connect ⽤户/密码grant create any table to ⽤户;-- 这⼀步⾮常重要,需要显式地赋予⽤户建表权限CREATE OR REPLACE PROCEDURE ANALYZE_TB ASOWNER_NAME VARCHAR2(100);V_LOG INTEGER;V_SQL1 VARCHAR2(800);V_TABLENAME VARCHAR2(50);CURSOR CUR_LOG ISSELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME = 'ANALYZE_LOG';--1BEGIN--DBMS_OUTPUT.ENABLE (buffer_size=>100000);--1.1BEGINOPEN CUR_LOG;FETCH CUR_LOGINTO V_LOG;IF V_LOG = 0 THENEXECUTE IMMEDIATE 'CREATE TABLE ANALYZE_LOG (USER_NAME VARCHAR(20),OP_TIME CHAR(19) DEFAULT to_char(sysdate,''yyyy-mm-dd hh24:mi:ss''),ERROR_TEXT VARCHAR(200),TABLE_NAME VARCHAR(40))';END IF;END;SELECT USER INTO OWNER_NAME FROM DUAL;V_SQL1 := 'INSERT INTO ANALYZE_LOG (USER_NAME,ERROR_TEXT,TABLE_NAME) VALUES (''' || OWNER_NAME || ''',''ANALYZE BEGIN'',''ALL'')';EXECUTE IMMEDIATE V_SQL1;sys.dbms_stats.gather_schema_stats(ownname => UPPER(OWNER_NAME),estimate_percent => 100, --定义收集的百分⽐method_opt => 'FOR ALL INDEXED COLUMNS',cascade => TRUE); --cascade => TRUE,degree=>8 degree定义并⾏线程数,最⼤建议不要超过CPU线程数的⼀半V_SQL1 := 'INSERT INTO ANALYZE_LOG (USER_NAME,ERROR_TEXT,TABLE_NAME) VALUES (''' || OWNER_NAME || ''',''ANALYZE END'',''ALL'')';EXECUTE IMMEDIATE V_SQL1;commit;--1.2 delete tmptbstatitics and lock statisticsBEGINfor x in (select a.table_name, st_analyzed, b.stattype_lockedfrom user_tables a, user_tab_statistics bwhere a.temporary = 'Y'and a.table_name = b.table_nameand (b.STATTYPE_LOCKED is null ORst_analyzed is not null)) LOOPIF st_analyzed IS NOT NULL THEN--delete statsdbms_stats.delete_table_stats(ownname => user,tabname =>x.table_name,force => TRUE);END IF;IF x.stattype_locked IS NULL THEN--lock statsdbms_stats.lock_table_stats(ownname => user,tabname =>x.table_name);END IF;END LOOP;end;EXCEPTIONWHEN OTHERS THENIF CUR_LOG%ISOPEN THENCLOSE CUR_LOG;END IF;commit;end;/定义执⾏计划VARIABLE JOBNO NUMBER;VARIABLE INSTNO NUMBER;BEGINSELECT INSTANCE_NUMBER INTO :INSTNO FROM V$INSTANCE; DBMS_JOB.SUBMIT(:JOBNO,'ANALYZE_TB;',TRUNC(SYSDATE)+1+2/24,'TRUNC(SYSDATE)+2+2/24',TRUE,:INSTNO); COMMIT;END;/禁⽤执⾏计划BEGINDBMS_AUTO_TASK_ADMIN.disable(client_name => 'auto optimizer stats collection',operation => NULL,window_name => NULL);END;注:estimate_percent=>dbms_stats.auto_sample_size效率会⽐null⾼80%左右最后,附上DBMS_STATS.GATHER_TABLE_STATS的语法供以后查看:DBMS_STATS.GATHER_TABLE_STATS (ownname VARCHAR2,tabname VARCHAR2,partname VARCHAR2,estimate_percent NUMBER,block_sample BOOLEAN,method_opt VARCHAR2,degree NUMBER,granularity VARCHAR2,cascade BOOLEAN,stattab VARCHAR2,statid VARCHAR2,statown VARCHAR2,no_invalidate BOOLEAN,force BOOLEAN);参数说明:ownname:要分析表的拥有者tabname:要分析的表名.partname:分区的名字,只对分区表或分区索引有⽤.estimate_percent:采样⾏的百分⽐,取值范围[0.000001,100],null为全部分析,不采样. 常量:DBMS_STATS.AUTO_SAMPLE_SIZE是默认值,由oracle决定最佳取采样值.block_sapmple:是否⽤块采样代替⾏采样.method_opt:决定histograms信息是怎样被统计的.method_opt的取值如下:for all columns:统计所有列的histograms.for all indexed columns:统计所有indexed列的histograms.for all hidden columns:统计你看不到列的histogramsfor columns SIZE | REPEAT | AUTO | SKEWONLY:统计指定列的histograms.N的取值范围[1,254]; REPEAT上次统计过的histograms;AUTO由oracle决定N的⼤⼩;SKEWONLY multiple end-points with the same value which is what we define by "there is skew in the datadegree:决定并⾏度.默认值为null.granularity:Granularity of statistics to collect ,only pertinent if the table is partitioned.cascace:是收集索引的信息.默认为falase.stattab指定要存储统计信息的表,statid如果多个表的统计信息存储在同⼀个stattab中⽤于进⾏区分.statown存储统计信息表的拥有者.以上三个参数若不指定,统计信息会直接更新到数据字典.no_invalidate: Does not invalidate the dependent cursors if set to TRUE. The procedure invalidates the dependent cursors immediately if set to FALSE.force:即使表锁住了也收集统计信息.执⾏存储过程exec ANALYZE_TB查看最后⼀次收集时间select table_name,last_analyzed from all_tables where owner='⽤户名' order by 2;。
Oracle的告警⽇志的查看与监控Oracle的数据库⽇志⼤致可以分为三⼤类告警⽇志、跟踪⽇志、重做⽇志今天主要来谈谈告警⽇志告警⽇志(记录报错信息)⼀般命名为alert_<SID>.log,数据库告警⽇志是按时间顺序记录message和错误信息。
告警⽇志具体记录的内容1:所有的内部错误(ORA-600)信息,块损坏错误(ORA-1578)信息,以及死锁错误(ORA-60)信息等。
2:管理操作,例如CREATE、ALTER、DROP语句等,以及数据库启动、关闭以及⽇志归档的⼀些信息。
2.1 涉及物理结构的所有操作:例如创建、删除、重命名数据⽂件与联机重做⽇志⽂件的ALTER DATABASE命令,此外还涉及重新分配数据⽂件⼤⼩以及将数据⽂件联机与脱机的操作。
2.2 表空间操作,例如DROP与CREATE命令,此外还包括为了进⾏⽤户管理的备份⽽将表空间置⼊和取出热备份模式的操作3:与共享服务器或调度进程相关功能的消息和错误信息。
4:物化视图的⾃动刷新过程中出现的错误。
5:动态参数的修改信息。
查看告警⽇志所在的路径SQL> show parameter background_dump_dest;如何监控告警⽇志1.通过外部表来查看告警⽇志⽂件的内容。
相当的⽅便。
然后也是使⽤定制SQL语句来查询错误信息依据⽇志所在路径创建逻辑⽬录create or replace directory alert_log as'/home/oracle/app/product/19.3.0/dbhome_1/rdbms/log';创建外部表关联这个⽬录,就可以直接通过表查看⽇志信息了create table alert_logs(text varchar2(2000))organization external(type oracle_loaderdefault directory alert_logaccess parameters(records delimited by newlinefieldsreject rows with all null fields)location('alert_CDB.log'))reject limit unlimited;检查是否存在数据库系统错误提⽰信息,查看有⽆“ORA-”,Error”,“Failed”等出错信息。
nightingale oracle告警规则Nightingale Oracle 告警规则Nightingale Oracle 是一种用于监控和管理数据库系统的工具。
它可以帮助管理员更好地了解和掌握数据库的性能、健康状况和异常情况。
在配置 Nightingale Oracle 告警规则时,需要考虑以下几个方面。
1. 监控重要指标:在配置告警规则时,需要明确监控数据库的哪些指标。
这些指标可能包括 CPU 使用率、内存利用率、磁盘空间、IO 请求数量等。
通过监控这些指标,可以及时发现数据库系统的潜在问题,并采取相应的措施。
2. 设置合理的阈值:为了准确判断数据库是否异常,需设置合理的阈值。
过高或过低的阈值都可能导致误报或漏报。
合理的做法是根据数据库的历史数据和预估负载情况来设置阈值。
例如,如果数据库的正常 CPU 使用率为 60% - 80%,则可以设置超过 90% 的使用率为告警条件。
3. 分级告警策略:在配置告警规则时,需要考虑告警的分级策略。
将告警分为不同的级别,根据不同级别的重要性和紧急程度来采取不同的响应措施。
例如,当CPU 使用率高于阈值时,可以设置为低级别告警,只需发送通知邮件;而当磁盘空间不足时,可设置为高级别告警,需要发送短信通知,并触发相关自动化脚本来执行清理操作。
4. 告警通知和处理:配置告警规则后,需要设置告警通知方式和处理流程。
常见的通知方式包括邮件、短信、移动应用推送等。
管理员应确保告警通知能够及时、准确地发送给相关人员,并设定相应的处理人员和流程,以便快速响应和解决问题。
5. 告警规则的周期性检查和更新:告警规则需要定期检查和更新。
数据库系统的工作负载和环境都可能发生变化,因此告警规则也需要跟随调整。
管理员应定期评估和优化告警规则,确保其持续有效。
综上所述,配置 Nightingale Oracle 告警规则时需明确监控的指标、设置合理的阈值、应用分级告警策略、配置告警通知和处理方式,并定期检查和更新告警规则。
oracle统计信息收集工作原理Oracle数据库的统计信息收集是优化查询性能的重要工具。
通过收集表和索引的统计信息,数据库优化器可以更好地选择执行计划,从而提高查询性能。
在这篇文章中,我们将探讨Oracle统计信息收集的工作原理。
1. 统计信息包括哪些内容。
在Oracle数据库中,统计信息包括表的行数、块数、平均行长度、列的数据分布和密度等信息,以及索引的高度、选择性等信息。
这些统计信息可以帮助优化器评估不同执行计划的成本,并选择最佳的执行计划。
2. 统计信息的收集方式。
Oracle数据库可以通过多种方式收集统计信息,包括使用DBMS_STATS包中的存储过程、使用ANALYZE命令、自动统计信息收集任务等。
其中,自动统计信息收集任务是Oracle数据库自带的一种自动收集统计信息的机制,可以根据数据库中的数据变化情况自动触发统计信息的收集。
3. 统计信息的使用。
一旦收集了统计信息,数据库优化器就可以使用这些信息来生成最佳的执行计划。
例如,当优化器需要选择一个索引来执行查询时,它会使用索引的统计信息来评估不同索引的成本,并选择最佳的执行计划。
4. 统计信息的更新策略。
由于数据库中的数据会不断变化,统计信息也需要定期更新以反映最新的数据分布情况。
Oracle数据库提供了自动统计信息收集任务来定期收集和更新统计信息,同时也可以手动触发统计信息的收集和更新。
总的来说,Oracle数据库的统计信息收集是优化查询性能的重要工具,通过收集表和索引的统计信息,数据库优化器可以更好地选择执行计划,从而提高查询性能。
同时,合理的统计信息收集策略也是保证数据库性能稳定的重要手段之一。
ORACLE数据库应急预案一、背景介绍数据库是企业中非常重要的数据存储和管理系统,它包含了企业的核心业务数据、用户信息、财务数据等重要信息。
一旦数据库出现故障,不仅可能导致企业业务中断,还可能造成数据丢失,给企业带来巨大损失。
因此建立一个完善的数据库应急预案非常重要,为应对数据库故障或灾难事件,保障数据安全,保障业务的正常运行。
二、应急预案的制定1.明确应急责任:-确定应急小组成员:由系统管理员、数据库管理员、业务负责人等组成应急小组,明确各自职责,制定相应的应急预案。
2.应急预案编制:-收集整理数据库详细信息:包括数据库版本、配置参数、用户信息、表结构等,以备快速恢复数据库。
-制定故障诊断流程和处理方案:明确故障发生后处理的流程,包括故障诊断、数据备份、故障修复等步骤。
-制定灾难恢复方案:在数据库遭受严重灾难性损失时,需要有相应的灾难恢复方案,包括数据备份、容灾策略等。
-制定数据更新和备份策略:明确定期进行数据库备份和数据更新的策略,确保数据的安全可靠。
三、数据库故障处理1.故障诊断和异常恢复:-监控数据库运行状态,及时发现故障。
-根据数据库错误日志、监控工具等进行故障诊断。
-采取相应措施恢复数据库服务,如重启数据库、恢复损坏的数据文件等。
2.数据库备份和恢复:-定期进行数据库备份,并将备份数据存放在安全的地方。
-制定备份和恢复策略,包括全量备份、增量备份等。
-在数据损坏或丢失时,及时恢复数据库数据。
3.数据库容灾处理:-部署数据库冗余集群,实现数据库高可用性。
-灾难发生时,自动切换到备用数据库,保证业务的连续性。
四、数据库灾难恢复1.灾难恢复方案:-根据不同的灾难情况,制定相应的灾难恢复方案。
-定期进行灾难演练,检验恢复方案的可行性。
2.数据库恢复流程:-确定数据库受损的程度,根据程度采取不同恢复措施。
-恢复数据库数据,包括全量恢复和增量恢复等。
3.数据库恢复验收:-恢复后必须进行数据验证,确认数据的完整性和准确性。
oracle 收集统计信息语句在Oracle数据库中,收集统计信息是一项重要的管理任务,它可以帮助优化查询性能、确定索引使用和更新数据库统计信息。
收集统计信息是通过执行统计分析来实现的,Oracle提供了一些语句和工具来完成这项任务。
1. DBMS_STATS包Oracle提供了DBMS_STATS包,它包含了一些程序单元(也称为子程序或函数),用于收集数据库对象的统计信息。
1.1 收集表统计信息使用DBMS_STATS包的GATHER_TABLE_STATS子程序可以收集表的统计信息。
该子程序可以指定需要收集统计信息的表的名字、模式和分区标识等。
```SQLEXECDBMS_STATS.GATHER_TABLE_STATS(ownname=>'SCOTT', tabname=>'EMP', cascade=>TRUE);```1.2 收集索引统计信息使用DBMS_STATS包的GATHER_INDEX_STATS子程序可以收集索引的统计信息。
该子程序可以指定需要收集统计信息的索引的名字、模式和分区标识等。
```SQLEXECDBMS_STATS.GATHER_INDEX_STATS(ownname=>'SCOTT', indname=>'EMP_IDX', cascade=>TRUE);```1.3 收集列统计信息使用DBMS_STATS包的GATHER_COLUMN_STATS子程序可以收集列的统计信息。
该子程序可以指定需要收集统计信息的列所在的表的名字、模式和分区标识等。
```SQLEXECDBMS_STATS.GATHER_COLUMN_STATS(ownname=>'SCOTT', tabname=>'EMP', colname=>'EMP_NAME', cascade=>TRUE);```2. ANALYZE语句除了使用DBMS_STATS包来收集统计信息,Oracle还提供了ANALYZE语句用于收集统计信息。
数据库性能下降_检查应急预案第一章、公共检查部分 (2)1.1、数据库可用性检查 (2)1.2、检查OS日志 (2)1.3、系统资源检查 (2)1.4、数据库日志检查 (3)1.5、检查数据库归档日志目录 (3)第二章、数据库个别业务性能问题 (3)2.1、大部分业务基本正常,个别业务长时间执行未成功 (3)2.2、单个ORACLE连接进程持续非常繁忙 (4)第三章、数据库整体性能问题 (5)3.1 等待事件 (5)3.2 获取STA TSPACK\AWR报告 (5)3.3 获取执行计划 (5)3.4 相应的处理建议 (6)第四章、整个数据库hang (6)4.1不能使用sqlplus / as sysdba进入数据库时 (6)4.2能使用sqlplus / as sysdba进入数据库时 (6)4.3 执行RDA收集信息 (7)4.4 收集最近的STATSPACK/AWR报告 (7)4.5 收集10G ASH报告 (8)4.6 收集10GR2的CRS信息 (8)第一章、公共检查部分1.1、数据库可用性检查分别尝试从AP机器和数据库主机登录数据库看能否登录oracle用户登录后,执行如下操作:select object_id from dba_objects where rownum < 5;create table tmp0001 select object_id from dba_objects where rownum < 5;drop table tmp0001;select * from dba_2pc_pending;1)如果以上SQL可顺利快速执行,最后的SQL也没有返回被挂起的两阶段提交事务,说明数据库不是阻塞所有业务的原因2)如果以上SQL执行非常缓慢或被HANG住,表明当前数据库存在问题3)如果应用、中间件日志中有数据库方面的报错,根据错误号进行分析1.2、检查OS日志查看OS日志,看是否有相应的报错。
根据不同的平台选择以下命令查看AIX:errpt、mailHPUX:vi /var/adm/syslog/syslog.log、dmesg 、mail1.3、系统资源检查AIX下使用TOPAS/vmstat/lsps –a/sar 等命令;HPUX下使用top /glance/vmstat/swapinfo –atm/sar等命令,查看当前CPU/mem/swap的占用情况1)如果CPU有超过平常很高的WIO2)如果user很高,查看top cpu占用的进程是否为oracle进程如果是oracle后台进程CPU占用高,则联系ORACLE驻场工程师协助判断是否碰到了某个已知的BUG如果是oracle连接进程CPU占用高,执行$ORACLE_BASE/sql/get_by_spid.sh获得高CPU进程正在执行的语句和相应的执行计划3)如果MEM很低,SWAP区page out很频繁,需要联系系统管理员检查内存情况,如是否出现异常的memory leak。
同时针对ORACLE检查以下情况连接数--- v$session 根据status/machine/program/username分组统计(group by),与应用一起分析连接数异常的原因。
获得占用高MEMORY的oracle进程,执行$ORACLE_BASE/sql/pga_sid.sql获得该进程PGA的内存使用情况,执行$ORACLE_BASE/sql/get_by_spid.sh获得高CPU进程正在执行的语句和相应的执行计划。
1.4、数据库日志检查执行$ORACLE_BASE/sql/oracle_health_check.sql查看数据库alert日志/UDUMP/BDUMP是否有异常信息,如ORA-报错,此前没有或很少出现的警告提示信息.如果检查到报错信息,根据报错情况进行分析和采取相应的处理办法。
1.5、检查数据库归档日志目录1)切换频率是否正常/目录权限及使用率2)如果数据库日志长时间没有写入信息,没有日志切换,可能数据库已经处于挂起的状态,第二章、数据库个别业务性能问题2.1、大部分业务基本正常,个别业务长时间执行未成功2.1.1、根据应用的pid、sid等信息,找到数据库中对应的session、SQL。
得到该SQL的执行计划。
1)执行$ORACLE_BASE/sql/show_spid.sql即可根据SID快速获取操作系统进行号spid的信息;2)执行$ORACLE_BASE/sql/get_by_spid.sh spid,即可根据操作系统进程号依次打印执行的SQL语句和执行计划;3)执行$ORACLE_BASE/sql/showsql_pid.sql即可根据pid快速获取执行的SQL语句4)执行$ORACLE_BASE/sql/showsql_sid.sql即可根据sid快速获取执行的SQL语句如果执行计划不恰当,需要分析执行计划变化的原因(如索引不正确、统计信息过时、绑定变量偷窥等)采取相应的错误如添加缺失的索引、重新收集统计信息等,评估中止该业务的影响,尝试停止该SQL的执行后,重新收集相关表的统计信息,使业务SQL 能按正确的执行计划执行。
如果执行计划正确,SQL却长时间不能返回结果,则按照以下办法尽快收集必要信息,再重启任务。
$ sqlplus "/as sysdba"oradebug setospid <process ID>oradebug unlimitoradebug dump processstate 10oradebug tracefile_name--得到trace文件名exit得到该进程的stack信息:$ sqlplus "/as sysdba"oradebug setospid <process ID>oradebug unlimitoradebug dump errorstack 3oradebug tracefile_name--得到trace文件名Exit2.1.2、如果PID、SID定位不到,则查询STATSPACK、AWR报告、v$session_wait和v$lock 视图。
1)9i下,执行$ORACLE_HOME/rdbms/admin/spreport.sql获得STA TSPACK报告10g下,执行$ORACLE_HOME/rdbms/admin/awrrpt.sql获取最近时间的AWR报告2)执行$ORACLE_BASE/sql/show_wait.sql和show_wait_global.sql快速获得v$session_wait 视图的详细信息3)执行$ORACLE_BASE/sql/session_enqueue.sql获得v$lock视图中中锁持有者和锁等待者的详细信息2.2、单个ORACLE连接进程持续非常繁忙通过top\topas\glance命令在OS上获得持续繁忙的操作系统进程号spid然后执行$ORACLE_BASE/sql/get_by_spid.sh spid,即可根据操作系统进程号依次打印执行的SQL语句和执行计划;如果执行计划不恰当,需要分析执行计划变化的原因(如索引不正确、统计信息过时、绑定变量偷窥等)采取相应的错误如添加缺失的索引、重新收集统计信息等,评估中止该业务的影响,尝试停止该SQL的执行后,重新收集相关表的统计信息,使业务SQL 能按正确的执行计划执行。
如果执行计划正确,SQL却长时间不能返回结果,则按照以下办法尽快收集必要信息,再重启任务。
$ sqlplus "/as sysdba"oradebug setospid <process ID>oradebug unlimitoradebug dump processstate 10oradebug tracefile_name--得到trace文件名exit得到该进程的stack信息:$ sqlplus "/as sysdba"oradebug setospid <process ID>oradebug unlimitoradebug dump errorstack 3oradebug tracefile_name--得到trace文件名Exit第三章、数据库整体性能问题现象:业务处理总体非常缓慢,但也有部分业务能够处理完成或者数据库主机CPU持续异常很高,而且都是ORACLE连接进程造成的时候请用以下方法检查3.1 等待事件找到当前数据库等待最多的事件:1)9i下通过查询v$session_wait视图获取当前等待最多的事件。
执行$ORACLE_BASE/sql/show_session_wait.sql可快速查询按event分组的统计情况2)10g下使用ash工具来看最近15分钟等待事件及造成等待事件的SQL和session ASH的收集办法:执行$ORACLE_HOME/rdbms/admin/ashrpt.sql3.2 获取STATSPACK\AWR报告1)9i下,执行$ORACLE_HOME/rdbms/admin/spreport.sql获得STATSPACK报告也可以下办法手工获取最近几分钟的statspack报告Sqlplus perfstat/PASSWORDExec statspack.snap(i_snap_level => 7);……等待几分钟Exec statspack.snap(i_snap_level => 7);$ORACLE_HOME/rdbms/admin/spreport.sql2)10g下,执行$ORACLE_HOME/rdbms/admin/awrrpt.sql获取最近时间的AWR报告3.3 获取执行计划1)9i下可用$ORACLE_HOME/rdbms/admin/sprepsql.sql获取问题SQL的执行计划2)10g下可用以下办法获取执行计划$ORACLE_HOME/rdbms/admin/awrsqrpt.sql或者select * from table(dbms_xplan.display_cursor('SQL_ID'));得到以上SQL的执行计划后如保存有该SQL正常时期的执行计划,则判断和正常的执行计划是否有不同如果没有该SQL正常时期的执行计划,则需要判断执行计划是否是否恰当。
3.4 相应的处理建议对比历史情况分析确认这些等待是否正常,SQL执行计划是否正常,确认问题SQL对于已确认的问题SQL,评估中止该session对业务的影响:该session是否可被中止;中止后需要进行的进行的处理:是否要重新收集表的统计信息,是否要新建索引;中止该session,完成事务回滚预计需要的时间根据评估结果选择需要执行的操作:中止session、切HA、切应急库第四章、整个数据库hang现象:整个数据库hang住,无法进行任何操作。