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');
相关推荐
fen_fen18 小时前
Oracle建表语句示例
数据库·oracle
此刻你1 天前
常用的 SQL 语句
数据库·sql·oracle
海心焱1 天前
从零开始构建 AI 插件生态:深挖 MCP 如何打破 LLM 与本地数据的连接壁垒
jvm·人工智能·oracle
德彪稳坐倒骑驴1 天前
MySQL Oracle面试题
数据库·mysql·oracle
吕司1 天前
MySQL库的操作
数据库·mysql·oracle
dishugj1 天前
【Oracle】 rac的一些问题以及解决方案
数据库·oracle
eWidget1 天前
面向信创环境的Oracle兼容型数据库解决方案
数据库·oracle·kingbase·数据库平替用金仓·金仓数据库
熊文豪1 天前
关系数据库替换用金仓——Oracle兼容性深度解析
数据库·oracle·金仓数据库·电科金仓·kes
eWidget1 天前
面向Oracle生态的国产高兼容数据库解决方案
数据库·oracle·kingbase·数据库平替用金仓·金仓数据库
A懿轩A1 天前
【MySQL 数据库】MySQL 数据库核心概念详解:库、表、字段、主键与关系型模型一文读懂
数据库·mysql·oracle