oracle-故障处理-如何通过相关视图分析数据库实时性能问题

简介:

排查思路

1. 查看数据库active session 的等待事件

  SELECT s.inst_id,s.wait_class, s.event, COUNT (*)
    FROM gv$session s
   WHERE status = 'ACTIVE'
GROUP BY s.inst_id,s.wait_class, s.event
ORDER BY 4 DESC;

2.查看active session 正在执行的sql

SELECT q.sql_text,
       q.sql_fulltext,
       s.sql_exec_start,
       s.sql_exec_id,
       s.sql_id,
       s.*
  FROM gv$session s, v$sql q
 WHERE s.sql_id = q.sql_id AND s.status = 'ACTIVE' AND s.TYPE = 'USER';

3.查看是否有锁等待

col sql_id for a20
col status for a10
col event for a40
col wait_class for a20
col program for a30

WITH s AS
 (SELECT * FROM gv$session)
SELECT LEVEL,
       lpad(' ', (LEVEL - 1) * 5, ' ') || nvl(s.username, '(oracle)') AS username,
       s.inst_id,
       s.sid,
       s.serial#,
       s.sql_id,
       s.status,
       s.event,
       s.blocking_session,
       s.wait_class,
       s.seconds_in_wait,
       --s.machine,
       --s.module,
       s.program 
       --,to_char(s.logon_time, 'YYYY-MM-DD HH24:MI:SS') AS logon_time
  FROM s
 WHERE LEVEL > 1
    OR EXISTS (SELECT 1 FROM s s2 WHERE s2.blocking_session = s.sid)
CONNECT BY PRIOR s.sid = s.blocking_session
 START WITH s.blocking_session IS NULL; 

4. 查看那些对象被锁住,被哪个session锁住,锁的类型,session正在执行的sql

  SELECT p.inst_id,
         p.spid,
         p.BACKGROUND,
         l.session_id sid,
         s.serial#,
         s.username,
         s.osuser,
         s.status,
         s.event,
         o.object_name,
         l.locked_mode,
         s.program,
         s.logon_time,
         s.sql_id
    FROM gv$process p,
         gv$locked_object l,
         dba_objects o,
         gv$session s
   WHERE     l.object_id = o.object_id
         AND l.session_id = s.sid
         AND p.addr = s.paddr
ORDER BY sid, s.serial#;

5. 查看访问某个对象(表、存储过程等)的Session:

select /*+rule+*/ s.inst_id,s.username,s.sid,s.serial#,s.event,s.sql_id,
 'alter system kill session ''' || s.sid || ',' || s.serial# || ',@' ||s.inst_id || ''' immediate;' kill_script  from gv$session s
 where s.sid in (select /*+rule */ SID  from  gv$access where object =upper('tableA')) and type='USER'; 

SELECT /*+ rule */
       DISTINCT
       s.inst_id,
       s.username,
       s.sid,
       s.serial#,
       s.status,
       s.event,
       s.sql_id,
       s.sql_exec_id,
       s.sql_exec_start,
        s.blocking_session,
       s.wait_class,
       s.seconds_in_wait,
       s.machine,
       s.module,
       s.program 
       ,to_char(s.logon_time, 'YYYY-MM-DD HH24:MI:SS') AS logon_time
       'alter system kill session ''' || s.sid || ',' || s.serial# || ',@' ||s.inst_id || ''' immediate;' kill_session_script,
       'kill -9 ' || p.spid kill_process_script
  FROM gv$session s, gv$access a, gv$process p
 WHERE     s.inst_id = a.inst_id
       AND s.sid = a.sid
       AND p.addr = s.paddr
       AND s.TYPE = 'USER'
       and a.object =upper('tableA')
       --  AND s.status = 'KILLED'
       -- AND s.username = 'userA'; 
<!-- 获得表、索引、视图、存储过程、函数的DDL

select dbms_metadata.get_ddl('TABLE','TABLE_NAME','TABLE_OWNER') from dual;
select dbms_metadata.get_ddl('INDEX','INDEX_NAME','INDEX_OWNER') from dual;
select dbms_metadata.get_ddl('VIEW','VIEW_NAME','VIEW_OWNER') from dual;
select dbms_metadata.get_ddl('PROCEDURE','PROCEDURE_NAME','PROCEDURE_OWNER') from dual;
select dbms_metadata.get_ddl('FUNCTION','FUNCTION_NAME','FUNCTION_OWNER') from dual;  -->

6. kill session

SELECT /*+ rule */
       DISTINCT
       s.inst_id,
       s.username,
       s.sid,
       s.serial#,
       s.status,
       s.event,
       s.sql_id,
       s.sql_exec_id,
       s.sql_exec_start,
       s.PLSQL_OBJECT_ID,
       s.PREV_EXEC_ID,
       s.PREV_EXEC_START,
       s.blocking_session,
       s.BLOCKING_INSTANCE,
       s.BLOCKING_SESSION_STATUS,    
       s.wait_class,
       s.seconds_in_wait,
       s.machine,
       s.module,
       s.program,
       p.spid,
       p.PGA_USED_MEM/1024/1024,
       p.PGA_ALLOC_MEM/1024/1024,
       p.PGA_MAX_MEM/1024/1024
       ,to_char(s.logon_time, 'YYYY-MM-DD HH24:MI:SS') AS logon_time,
       'alter system kill session ''' || s.sid || ',' || s.serial# || ',@' ||s.inst_id || ''' immediate;' kill_session_script,
       'kill -9 ' || p.spid kill_process_script
  FROM gv$session s,  gv$process p
 WHERE     s.inst_id = a.inst_id
       AND s.sid in (select /*+rule */ SID  from  gv$access where object =upper('tableA'))
       AND p.addr = s.paddr
       AND s.TYPE = 'USER'
       --  AND s.status = 'KILLED'
        AND s.username = 'userA';
目录
相关文章
|
2月前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
135 11
|
3月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
3月前
|
存储 Oracle 关系型数据库
oracle数据恢复—Oracle数据库文件大小变为0kb的数据恢复案例
存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组存储位图信息,重新导出控制文件中记录的数据文件,发现这些文件的大小依然为0kb。
|
3月前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
69 7
|
2月前
|
存储 Oracle 关系型数据库
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
|
4月前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
301 64
|
3月前
|
Oracle 关系型数据库 数据库
oracle数据库技巧
【10月更文挑战第25天】oracle数据库技巧
44 6
|
3月前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
45 5
|
4月前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
4月前
|
监控 Oracle 关系型数据库
Oracle数据库性能优化
【10月更文挑战第16天】Oracle数据库性能优化是
58 1

热门文章

最新文章

推荐镜像

更多