oracle dba常用脚本2

复制代码
11、表空间实有、现有、使用情况查询对比
SELECT TABLESPACE_NAME 表空间,
       TO_CHAR(ROUND(BYTES / 1024, 2), '99990.00') || '' 实有,
       TO_CHAR(ROUND(FREE / 1024, 2), '99990.00') || 'G' 现有,
       TO_CHAR(ROUND((BYTES - FREE) / 1024, 2), '99990.00') || 'G' 使用,
       TO_CHAR(ROUND(10000 * USED / BYTES) / 100, '99990.00') || '%' 比例
  FROM (SELECT A.TABLESPACE_NAME TABLESPACE_NAME,
               FLOOR(A.BYTES / (1024 * 1024)) BYTES,
               FLOOR(B.FREE / (1024 * 1024)) FREE,
               FLOOR((A.BYTES - B.FREE) / (1024 * 1024)) USED
          FROM (SELECT TABLESPACE_NAME TABLESPACE_NAME, SUM(BYTES) BYTES
                  FROM DBA_DATA_FILES
                 GROUP BY TABLESPACE_NAME) A,
               (SELECT TABLESPACE_NAME TABLESPACE_NAME, SUM(BYTES) FREE
                  FROM DBA_FREE_SPACE
                 GROUP BY TABLESPACE_NAME) B
         WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME)
 ORDER BY FLOOR(10000 * USED / BYTES) DESC;
复制代码
12、数据文件自动扩展
ALTER DATABASE DATAFILE '/oradata/zghx/TS_XMGL_DATA1.dbf' AUTOEXTEND ON NEXT  100M MAXSIZE  30000M;

13、查看回滚
select t.STATE,
       t.UNDOBLOCKSDONE 已回滚,
       t.UNDOBLOCKSTOTAL - t.UNDOBLOCKSDONE 剩余,
       t.UNDOBLOCKSTOTAL 回滚总量
  from v$fast_start_transactions t
 where state = 'RECOVERING';

14、查看session 回滚大小
select a.SID,
       a.USERNAME,
       b.XIDUSN,
       b.USED_UREC,
       b.USED_UBLK,
       r.RSSIZE / 1024 / 1024
  from v$transaction b, v$session a, v$rollstat r
 where a.SADDR = b.SES_ADDR
   and b.XIDUSN = r.USN
   and a.sid = 'xxx'

15、用户操作权限
SELECT *
  FROM dba_TAB_PRIVS t
 where t.owner not in ('SYSTEM', 'SYS', 'OUTLN', 'DBSNMP', 'PERFSTAT',
        'MGMT_VIEW', 'CTXSYS', 'MDSYS', 'DMSYS', 'OLAPSYS',
        'ORDSYS', 'XDB', 'WMSYS', 'SYSMAN', 'ORDPLUGINS')
 order by t.owner;

在这里插入代码片

复制代码
16、检查一下系统当前的锁
SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME, BLOCK
  FROM V$LOCK
 WHERE SID IN (SELECT SID FROM V$SESSION WHERE USERNAME IS NOT NULL);
复制代码
17、查找前十条磁盘读多(性能差)的sql
SELECT SID, TYPE, ID1, ID2, LMODE, CTIME
  FROM V$LOCK
 WHERE ADDR IN
       (SELECT ADDR FROM V$TRANSACTION WHERE START_DATE < TRUNC(SYSDATE));

18、查看占io较大的正在运行的session
 SELECT se.sid,
        se.serial#,
        se.sql_address,
        se.username,
        se.status,
        se.terminal,
        se.program,
        se.MODULE,
        pr.SPID,
        st.event,
        st.p1text,
        si.physical_reads,
        si.block_changes
   FROM v$session se, v$session_wait st, v$sess_io si, v$process pr
  WHERE st.sid = se.sid
    AND st.sid = si.sid
    AND se.PADDR = pr.ADDR
    AND se.sid > 6
    AND st.wait_time = 0
    AND st.event NOT LIKE 'SQL%'
  ORDER BY physical_reads DESC;
复制代码
19、查看当前有哪些用户正在使用数据
select a.osuser,
       a.username,
       a.machine,
       b.cpu_time / b.executions / 1000000 || 's',
       b.sql_text   
  from v$session a, v$sqlarea b   
 where a.sql_address = b.address   
 order by cpu_time / executions desc;
复制代码
20、查看锁
col object_name for a35;
col machine     for a30;
select object_name,
         object_type,
         machine,
         s.sid,
         s.serial#,
         s.username,
         s.program,
         s.module,
         s.status
    from v$locked_object l, dba_objects o, v$session s
   where l.object_id = o.object_id(+)
     and l.session_id = s.sid;

21、查各session的逻辑读及物理读
col machine for a15
col module for a25
select s.sid,s.serial#,s.process,s.machine,s.module,si.block_gets,si.physical_reads
  from v$session s,v$session_wait sw,v$sess_io si 
where s.status='ACTIVE'
  and s.sid=sw.sid(+) 
  and s.sid=si.sid(+)
  and s.module is not null;
复制代码
22、查长事务
SELECT SID,
       SERIAL#,
       CONTEXT,
       SOFAR,
       TOTALWORK,
       to_char(start_time, 'yyyymmddhh24miss') strtime,
       ROUND(SOFAR / TOTALWORK * 100, 2) "%_COMPLETE"
  FROM V$SESSION_LONGOPS
 WHERE TOTALWORK != 0
   AND SOFAR <> TOTALWORK;

23、查长事务相关的SQL
select s.sid, s.serial#, q.sql_text
  from v$session s, v$sql q
 where s.sid in (SELECT SID
                   FROM V$SESSION_LONGOPS
                  WHERE TOTALWORK != 0
                    AND SOFAR <> TOTALWORK)
   and s.sql_address = q.address;

24、查大量的Enqueue Wait时查哪些会话闲着	
select sysdate day,
       sid,
       serial#,
       machine,
       nvl(sql_hash_value, prev_hash_value) hash_value,
       last_call_et
  from v$session
 where sid in (select sid
                 from v$lock
                where block = 1
               UNION ALL
               select sid
                 from v$lock
                where type = 'TX'
                  and lmode > 1)
   and last_call_et > 60
   and type = 'USER'
   and status <> 'ACTIVE';

25、查语句使用的临时空间
SELECT S.sid || ',' || S.serial# sid_serial,
       S.username,
       S.program,
          T.blocks * TBS.block_size / 1024 / 1024 mb_used,
       T.tablespace,
          T.sqladdr address,
       Q.hash_value,
       Q.sql_text   
  FROM v$sort_usage T, v$session S, v$sql Q, dba_tablespaces TBS   
 WHERE T.session_addr = S.saddr   
   AND T.sqladdr = Q.address(+)   
   AND T.tablespace = TBS.tablespace_name   
 ORDER BY S.sid;

26、查看每个会话的UGA内存使用
select username, value || 'bytes' "Current UGA memory"
  from v$session sess, v$sesstat stat, v$statname name
 where sess.sid = stat.sid
   and stat.statistic# = name.statistic#
   and name.name = 'session uga memory';

27、查各session消耗CPU的问题
select ss.sid,
       se.machine,
       ss.value CPU,
       se.username,
       se.program,
       se.process,
       se.module
  from v$sesstat ss, v$session se
 where ss.statistic# in
       (select statistic#
          from v$statname
         where name = 'CPU used by this session')
   and se.sid = ss.sid
   and ss.sid > 6
   and se.module is not null
   and se.status = 'ACTIVE'
 order by ss.value;

28、查非并行等待语句
select s.sid, s.serial#, q.sql_text
  from v$session s, v$sql q
 where s.sid in (select sid
                   from v$session_wait
                  where event not like 'PX%'
                    and state = 'WAITING')
   and s.sql_address = q.address;

29、查看各session的buffer cache hit ratio
select substr(a.username, 1, 12) "User",
       a.sid "sid",
       a.SERIAL#,
       a.PROGRAM,
       b.consistent_gets "ConsGets",
       b.block_gets "BlockGets",
       b.physical_reads "PhysReads",
       100 * round((b.consistent_gets + b.block_gets - b.physical_reads) /
                   (b.consistent_gets + b.block_gets),
                   3) HitRatio
  from v$session a, v$sess_io b
 where a.sid = b.sid
   and (b.consistent_gets + b.block_gets) > 0
   and a.username is not null
 order by HitRatio asc;

30、查询最近1个小时内的跑得时间最长的SQL
SELECT a.sql_id,
       a.parsing_schema_name || '.' uname,
       round(a.buffer_gets / decode(a.executions, 0, 1, a.executions)) per_bu,
       TRUNC(((a.ELAPSED_TIME / decode(a.executions, 0, 1, a.executions)) /
             1000000),
             2) etime,
       round(buffer_gets / decode(a.ROWS_PROCESSED, 0, 1, a.ROWS_PROCESSED)) buf_row,
       a.executions,
       a.sql_fulltext,
       a.sql_text,
       a.module
  FROM v$sqlarea a,
       (SELECT DISTINCT sql_id
          FROM v$active_session_history b
         WHERE b.SAMPLE_TIME BETWEEN SYSDATE - 120 / 1440 AND SYSDATE) b
 WHERE a.sql_id = b.sql_id
   AND a.MODULE NOT IN ('PL/SQL Developer', 'plsqldev.exe', 'ORACLE.EXE')
   AND TRUNC(((a.ELAPSED_TIME / decode(a.executions, 0, 1, a.executions)) /
             1000000),
             2) > 100
 ORDER BY 3 DESC;

31、Oracle一个大事务的SQL往往不知道运行到了哪里,可以使用如下SQL查看执行进度。
SELECT se.sid,
       opname,
       TRUNC(sofar / totalwork * 100, 2) pct_work,
       elapsed_seconds elapsed,
       ROUND(elapsed_seconds * (totalwork - sofar) / sofar) remain_time,
       sql_text
  FROM v$session_longops sl, v$sqlarea sa, v$session se
 WHERE sl.sql_hash_value = sa.hash_value
   AND sl.sid = se.sid
   AND sofar != totalwork
 ORDER BY start_time;

32、查询表空间的剩余量
SELECT D.TABLESPACE_NAME "表空间名",
       T.EXTENT_MANAGEMENT,
       T.SEGMENT_SPACE_MANAGEMENT,
       D.TOT_GROOTTE_MB "表空间大小(M)",
       D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
       ROUND(F.TOTAL_BYTES / 1024) "空闲大小G",
       TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,
                     2),
               '990.99') "使用比"
  FROM (SELECT TABLESPACE_NAME,
               ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
               ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
          FROM SYS.DBA_FREE_SPACE
         GROUP BY TABLESPACE_NAME) F,
       (SELECT DD.TABLESPACE_NAME,
               ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
          FROM SYS.DBA_DATA_FILES DD
         GROUP BY DD.TABLESPACE_NAME) D,
       DBA_TABLESPACES T
 WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
   AND D.TABLESPACE_NAME = T.TABLESPACE_NAME
--and D.TABLESPACE_NAME not in('UNDOTBS1','UNDOTBS2','UNDOTBS3','UNDOTBS4')
 ORDER BY 7 DESC;

33、临时表空间
SELECT A.TABLESPACE_NAME TABLESPACE,
       D.MB_TOTAL,
       SUM(A.USED_BLOCKS * D.BLOCK_SIZE) / 1024 / 1024 MB_USED,
       D.MB_TOTAL - SUM(A.USED_BLOCKS * D.BLOCK_SIZE) / 1024 / 1024 MB_FREE
  FROM GV$SORT_SEGMENT A,
       (SELECT B.NAME, C.BLOCK_SIZE, SUM(C.BYTES) / 1024 / 1024 MB_TOTAL
          FROM GV$TABLESPACE B, GV$TEMPFILE C
         WHERE B.TS# = C.TS#
         GROUP BY B.NAME, C.BLOCK_SIZE) D
 WHERE A.TABLESPACE_NAME = D.NAME
 GROUP BY A.TABLESPACE_NAME, D.MB_TOTAL;

34、查询表空间的剩余量
SELECT D.TABLESPACE_NAME "表空间名",
       T.EXTENT_MANAGEMENT,
       T.SEGMENT_SPACE_MANAGEMENT,
       D.TOT_GROOTTE_MB "表空间大小(M)",
       D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
       ROUND(F.TOTAL_BYTES / 1024) "空闲大小G",
       TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,
                     2),
               '990.99') "使用比"
  FROM (SELECT TABLESPACE_NAME,
               ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
               ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
          FROM SYS.DBA_FREE_SPACE
         GROUP BY TABLESPACE_NAME) F,
       (SELECT DD.TABLESPACE_NAME,
               ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
          FROM SYS.DBA_DATA_FILES DD
         GROUP BY DD.TABLESPACE_NAME) D,
       DBA_TABLESPACES T
 WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
   AND D.TABLESPACE_NAME = T.TABLESPACE_NAME
   and D.TABLESPACE_NAME not in
       ('UNDOTBS1', 'UNDOTBS2', 'UNDOTBS3', 'UNDOTBS4')
 ORDER BY 7 DESC;
复制代码
35、失效索引检查
SELECT OWNER INDEX_OWNER,
       INDEX_NAME,
       INDEX_TYPE,
       'N/A' PARTITION_NAME,
       STATUS,
       TABLE_NAME,
       TABLESPACE_NAME
  FROM DBA_INDEXES
 WHERE STATUS = 'UNUSABLE'
UNION ALL
SELECT A.INDEX_OWNER,
       A.INDEX_NAME,
       B.INDEX_TYPE,
       A.PARTITION_NAME,
       A.STATUS,
       B.TABLE_NAME,
       A.TABLESPACE_NAME
  FROM DBA_IND_PARTITIONS A, DBA_INDEXES B
 WHERE A.INDEX_NAME = B.INDEX_NAME
   AND A.INDEX_OWNER = B.OWNER
   AND A.STATUS = 'UNUSABLE';

36、表行数,使用的块数,空的块数,块的使用率,行迁移和链接的数量,pctfree,pctused的数据,行的平均大小
select t.table_name,
       t.last_analyzed,
       blocks, --表中数据所占的数据块数
       empty_blocks, --表中的空块数
       avg_space, --数据块中平均的使用空间
       chain_cnt, --表中行连接和行迁移的数量
       avg_row_len, --每条记录的平均长度
       t.num_rows --行数
  from dba_tables t
 where t.table_name = upper('emp')
   and t.owner = upper('scott');
相关推荐
六月雨滴2 分钟前
存储性能监控与优化及最佳实践总结
数据库·oracle·dba
学习论之费曼学习法12 分钟前
Agent记忆系统:让AI拥有长期记忆能力
数据库·人工智能·oracle
arronKler2 小时前
数据库设计三大范式
数据库·oracle
oradh4 小时前
Oracle物理存储结构概述
数据库·oracle·物理结构·oracle基础·oracle入门·oracle物理存储结构概述
数据最前线5 小时前
亡羊补牢?Oracle 计划推出月度安全补丁
数据库·oracle
这个DBA有点耶5 小时前
某银行核心系统从Oracle迁移到国产数据库全程复盘(DBA视角)
数据库·经验分享·sql·oracle·dba·智能硬件
阿坤带你走近大数据6 小时前
DM达梦数据库的介绍
数据库·mysql·oracle·国产信创
我科绝伦(Huanhuan Zhou)7 小时前
oracle linux8.8一键部署oracle 11g
数据库·oracle
数据库小学妹7 小时前
企业级数据库迁移实践:从Oracle到国产数据库的兼容性与实施策略
数据库·mysql·oracle·dba
六月雨滴7 小时前
Oracle 安全架构概述
数据库·oracle·dba·安全架构