Oracle排查问题常用脚本

 

使用Oracle做数仓时,经常会查询一些数据库会话信息。 平时常用的查询SQL如下:

查询会话信息,注释部分如果打开,则显示undo的使用情况。

 SELECT DISTINCT S.INST_ID,
                S.MACHINE,
                S.BLOCKING_SESSION,
                S.SQL_ID,
                S.LAST_CALL_ET,
                S.SID,
                S.SERIAL#,
                S.EVENT,
                S.USERNAME,
                S.MODULE,
                Q.SQL_TEXT,
                P.SPID,
                'ALTER SYSTEM KILL SESSION ''' || S.SID || ',' || S.SERIAL# ||
                ''' IMMEDIATE; ' AS KILLSESSION/*,
                T.XIDUSN,
                T.UBAFIL,
                T.UBABLK,
                T.USED_UBLK,
                T.START_DATE,
                T.STATUS AS TRANS_STATUS,
                R.STATUS AS ROLL_STATUS,
                R.RSSIZE,
                RS.SEGMENT_NAME*/
  FROM GV$SESSION S
  JOIN GV$PROCESS P
    ON S.PADDR = P.ADDR
   AND S.INST_ID = P.INST_ID
  JOIN V$INSTANCE I
    ON S.INST_ID = I.INSTANCE_NUMBER
/*  LEFT JOIN V$TRANSACTION T
    ON S.SADDR = T.SES_ADDR
  LEFT JOIN V$ROLLSTAT R
    ON T.XIDUSN = R.USN
  LEFT JOIN DBA_ROLLBACK_SEGS RS
    ON RS.SEGMENT_ID = T.XIDUSN*/
  LEFT JOIN GV$SQL Q
    ON S.SQL_ID = Q.SQL_ID
   AND S.INST_ID = Q.INST_ID
 WHERE WAIT_CLASS <> 'Idle';

--查看执行计划
Select * From Table(dbms_xplan.display_cursor(''));

 

查询历史会话信息

历史会话信息就像v$session 的快照。 每秒都会记录。 用来定位已经退出的会话是否存在问题。

SELECT *
  FROM V$ACTIVE_SESSION_HISTORY A
 WHERE A.SESSION_ID = '1990'
   AND A.SAMPLE_TIME >=
       TO_DATE('2020-12-25 10:00:00', 'yyyy-mm-dd hh24:mi:ss');

 

如果想追溯很久之前的会话是否存在问题,也可以查看 dba_hist_active_sess_history ,这个是会话的历史信息, 会记录更长时间。 

 

如果碰到 temp表空间不足的情况,并且已经确定自己的SQL没问题,那么可以考虑看一下是否有其他会话正在占用临时表空间。

SELECT SESSION_ADDR, USERNAME, A.BLOCKS FROM V$SORT_USAGE A;
  • session_addr 可以关联 v$session.saddr 
  • username 用来确定是什么用户在占用临时表空间
  • blocks 可以确定占用表空间的大小

查询表空间的SQL

SELECT TABLESPACETYPE,
       TABLESPACE_NAME,
       ROUND(SUM(FREE_SIZE_GB), 4) AS FREE_SIZE_GB,
       ROUND(SUM(TOTAL_SIZE_GB), 4) AS TOTAL_SIZE_GB,
       ROUND(SUM(EXTENDED_MAX_SIZE_GB), 4) AS EXTENDED_MAX_SIZE_GB,
       ROUND(SUM(FREE_SIZE_GB) / SUM(TOTAL_SIZE_GB), 4) * 100 AS CURRENT_FREE_PERCENTS
  FROM (SELECT 'DATA' AS TABLESPACETYPE,
               TABLESPACE_NAME,
               0 AS FREE_SIZE_GB,
               SUM(BYTES) / 1024 / 1024 / 1024 AS TOTAL_SIZE_GB,
               SUM(DECODE(A.AUTOEXTENSIBLE, 'YES', A.MAXBYTES, 'NO', A.BYTES)) / 1024 / 1024 / 1024 AS EXTENDED_MAX_SIZE_GB
          FROM DBA_DATA_FILES A
         GROUP BY TABLESPACE_NAME
        UNION ALL
        SELECT 'DATA' AS TABLESPACETYPE,
               TABLESPACE_NAME,
               SUM(BYTES) / 1024 / 1024 / 1024 AS FREE_SIZE_GB,
               0 AS TOTAL_SIZE_GB,
               0 AS EXTENDED_MAX_SIZE_GB
          FROM DBA_FREE_SPACE B
         GROUP BY TABLESPACE_NAME
        UNION ALL
        SELECT 'TEMP' AS TABLESPACETYPE,
               TABLESPACE_NAME,
               0 AS FREE_SIZE_GB,
               SUM(BYTES) / 1024 / 1024 / 1024 AS TOTAL_SIZE_GB,
               0 AS EXTENDED_MAX_SIZE_GB
          FROM DBA_TEMP_FILES
         GROUP BY TABLESPACE_NAME
        UNION ALL
        SELECT 'TEMP' AS TABLESPACETYPE,
               TABLESPACE_NAME,
               SUM(FREE_SPACE) / 1024 / 1024 / 1024 AS FREE_SIZE_GB,
               0 AS TOTAL_SIZE_GB,
               0 AS EXTENDED_MAX_SIZE_GB
          FROM DBA_TEMP_FREE_SPACE
         GROUP BY TABLESPACE_NAME)
 GROUP BY TABLESPACETYPE, TABLESPACE_NAME;

 

posted on 2020-12-25 15:21  我是一只胖子  阅读(183)  评论(0编辑  收藏  举报