Oracle 日常健康脚本

时间:2024-01-26 07:18:11

文章目录

      • 摘要
      • 常用脚本

摘要

保持 Oracle 数据库的良好健康状况对于系统的可靠性和性能至关重要。本文将介绍一些常用的 Oracle 日常健康脚本,帮助您监控数据库并及时识别潜在的问题,以保证数据库的稳定运行。

常用脚本

1.查询数据库实例和实例级别的信息
通过 gv d a t a b a s e 、 g v database、 gv databasegvinstance
查询数据库实例和实例级别的信息。
获取数据库名称、实例名称、平台名称、主机名称、数据库版本和启动时间等信息。

SELECT a.NAME DBNAME,
       b.instance_name,
       a.PLATFORM_NAME,
       b.host_name,
       b.version,
       b.startup_time
  FROM gV$DATABASE a, gv$instance b
where a.inst_id = b.inst_id
order by 2;

2.查询数据库注册表历史记录的详细信息
包括操作时间、动作和注释。通过按照时间降序排序,可以查看最近执行的注册表更改操作和对应的注释。

SELECT TO_CHAR(ACTION_TIME, 'YYYY-MM-DD HH24:MI:SS')  ACTION_TIME,
       ACTION,
       COMMENTS
  FROM SYS.DBA_REGISTRY_HISTORY
ORDER BY 1 DESC;

3.查询从V$LOG_HISTORY表中检索最近10天的日志记录
按照日期和小时统计每个小时的日志数量。查询结果按日期和小时排序。
查询使用了SUBSTR函数来提取日期和小时部分,并通过TO_CHAR函数格式化为’MM/DD/RR HH24:MI:SS’的形式。然后使用DECODE函数根据小时值进行条件判断,如果符合条件则返回1,否则返回0。使用SUM函数对每个小时的返回值进行求和,得到每个小时的日志数量。最后使用COUNT函数统计总日志数量。

SELECT SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR HH:MI:SS'), 1,  5) DAY,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '00',
                  1,
                  0)) H00,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '01',
                  1,
                  0)) H01,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '02',
                  1,
                  0)) H02,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '03',
                  1,
                  0)) H03,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '04',
                  1,
                  0)) H04,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '05',
                  1,
                  0)) H05,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '06',
                  1,
                  0)) H06,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '07',
                  1,
                  0)) H07,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '08',
                  1,
                  0)) H08,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '09',
                  1,
                  0)) H09,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '10',
                  1,
                  0)) H10,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '11',
                  1,
                  0)) H11,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '12',
                  1,
                  0)) H12,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '13',
                  1,
                  0)) H13,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '14',
                  1,
                  0)) H14,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '15',
                  1,
                  0)) H15,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '16',
                  1,
                  0)) H16,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '17',
                  1,
                  0)) H17,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '18',
                  1,
                  0)) H18,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '19',
                  1,
                  0)) H19,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '20',
                  1,
                  0)) H20,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '21',
                  1,
                  0)) H21,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '22',
                  1,
                  0)) H22,
       SUM(DECODE(SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR  HH24:MI:SS'), 10, 2),
                  '23',
                  1,
                  0)) H23,
       COUNT(*) TOTAL
  FROM V$LOG_HISTORY A
WHERE FIRST_TIME > TRUNC(SYSDATE - 10)
GROUP BY SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR HH:MI:SS'),  1, 5)
ORDER BY SUBSTR(TO_CHAR(FIRST_TIME, 'MM/DD/RR HH:MI:SS'),  1, 5);

4.检索有关数据库存储和结构的统计信息
TOTAL STORAGES 和对应的总存储大小
INDEX STORAGES 和对应的索引存储大小
TABLESPACES 和对应的表空间数量
FILES 和对应的数据文件数量
TOTAL TABLES 和对应的表数量
TOTAL INDEXES 和对应的索引数量
DB_BLOCK_SIZE 和对应的数据块大小
NLS_CHARACTERSET 和对应的字符集
NLS_NCHAR_CHARACTERSET 和对应的NCHAR字符集

set linesize 100
set pages 200
col ITEM  format a30
col TOTAL_SIZE  format a30
SELECT 'TOTAL STORAGES' AS ITEM,
       ROUND(SUM(BYTES) / 1024 / 1024 / 1024, 2) || 'GB'  TOTAL_SIZE
  FROM DBA_SEGMENTS
UNION ALL
SELECT 'INDEX STORAGES', ROUND(SUM(BYTES) / 1024 / 1024 /  1024, 2) || 'GB'
  FROM DBA_SEGMENTS
WHERE SEGMENT_TYPE = 'INDEX'
UNION ALL
SELECT 'TABLESPACES', TO_CHAR(COUNT(*))
  FROM V$TABLESPACE
UNION ALL
SELECT 'FILES', TO_CHAR(COUNT(*))
  FROM V$DATAFILE
UNION ALL
SELECT 'TOTAL TABLES', TO_CHAR(COUNT(*))
  FROM DBA_TABLES
UNION ALL
SELECT 'TOTAL INDEXES', TO_CHAR(COUNT(*))
  FROM DBA_INDEXES
UNION ALL
SELECT 'DB_BLOCK_SIZE', VALUE
  FROM V$PARAMETER
WHERE TRIM(UPPER(NAME)) = 'DB_BLOCK_SIZE'
UNION ALL
SELECT T1.PARAMETER, T1.VALUE
  FROM V$NLS_PARAMETERS T1
WHERE UPPER(TRIM(T1.PARAMETER)) IN
       ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

5.检索ASM磁盘的相关信息
从V$ASM_DISK视图检索ASM磁盘的相关信息
GROUP_NUMBER:ASM磁盘所属的磁盘组编号。
DISK_NUMBER:ASM磁盘的编号。
TOTAL_MB:ASM磁盘的总容量(以MB为单位)。
FREE_MB:ASM磁盘的可用容量(以MB为单位)。
NAME:ASM磁盘的名称。
FAILGROUP:ASM磁盘所属的失效组。
PATH:ASM磁盘的路径。
CREATE_DATE:ASM磁盘的创建日期和时间。

set linesize 400
set pages 300
col NAME  format a15
col FAILGROUP  format a15
col PATH  format a30
SELECT GROUP_NUMBER,
       DISK_NUMBER,
       TOTAL_MB,
       FREE_MB,
       NAME,
       FAILGROUP,
       PATH,
       TO_CHAR(CREATE_DATE, 'YYYY-MM-DD HH24:MI:SS')  CREATE_DATE
  FROM V$ASM_DISK A
ORDER BY 1;

6.检索ASM磁盘组的相关信息
GROUP_NUMBER:ASM磁盘组的编号。
NAME:ASM磁盘组的名称。
STATE:ASM磁盘组的状态。可能的值包括:MOUNTED(已挂载)、DISMOUNTED(已卸载)、UNKNOWN(未知)等。
TYPE:ASM磁盘组的类型。例如,NORMAL(普通磁盘组)或HIGH_REDUNDANCY(高冗余磁盘组)。
TOTAL_MB:ASM磁盘组的总容量(以MB为单位)。
FREE_MB:ASM磁盘组的可用容量(以MB为单位)。

这条SQL查询用于从V$ASM_DISKGROUP视图检索ASM磁盘组的相关信息,并按照GROUP_NUMBER和NAME进行排序。

SELECT A.GROUP_NUMBER,A.NAME,A.STATE,A.TYPE, A.TOTAL_MB, A.FREE_MB     FROM V$ASM_DISKGROUP A  ORDER BY 1, 2

7.查看表空间的相关信息
STATUS:表空间的状态。
NAME:表空间的名称。
TYPE:表空间的类型。
EXTENT_MGT:表空间的数据段管理方式。
SEGMENT_MGT:表空间的段空间管理方式。
TS_SIZE:表空间的总大小(以MB为单位)。
FREE:表空间的可用空间(以MB为单位)。
USED:表空间的已使用空间(以MB为单位)。
PCT_USED:表空间的使用率。

第一部分查询从SYS.DBA_TABLESPACES表、DBA_DATA_FILES表和DBA_FREE_SPACE表中检索非临时表空间的相关信息,并计算出表空间的总大小、可用空间、已使用空间以及使用率。
第二部分查询从SYS.DBA_TABLESPACES表、DBA_TEMP_FILES表和V$TEMP_EXTENT_POOL表中检索临时表空间的相关信息,并计算出表空间的总大小、可用空间、已使用空间以及使用率。

SELECT STATUS,
       NAME,
       TYPE,
       EXTENT_MGT,
       SEGMENT_MGT,
       TS_SIZE,
       FREE,
       USED,
       PCT_USED
  FROM (SELECT DECODE(D.STATUS, 'OFFLINE', D.STATUS,  D.STATUS) STATUS,
               D.TABLESPACE_NAME NAME,
               D.CONTENTS TYPE,
               D.EXTENT_MANAGEMENT EXTENT_MGT,
               D.SEGMENT_SPACE_MANAGEMENT SEGMENT_MGT,
               ROUND(NVL(A.BYTES, 0) / 1024 / 1024, 0)  TS_SIZE,
               ROUND(NVL(F.BYTES, 0) / 1024 / 1024, 0) FREE,
               ROUND(NVL(A.BYTES - NVL(F.BYTES, 0), 0) / 1024  / 1024, 0) USED,
               DECODE((1 -
                      SIGN(1 - SIGN(TRUNC(NVL((A.BYTES -  NVL(F.BYTES, 0)) /
                                               A.BYTES * 100,
                                               0)) - 90))),
                      1,
                      TO_CHAR(TRUNC(NVL((A.BYTES -  NVL(F.BYTES, 0)) / A.BYTES * 100,
                                        0))),
                      TO_CHAR(TRUNC(NVL((A.BYTES -  NVL(F.BYTES, 0)) / A.BYTES * 100,
                                        0)))) || '%%' PCT_USED
          FROM SYS.DBA_TABLESPACES D,
               (SELECT TABLESPACE_NAME, SUM(BYTES) BYTES
                  FROM DBA_DATA_FILES
                 GROUP BY TABLESPACE_NAME) A,
               (SELECT TABLESPACE_NAME, SUM(BYTES) BYTES
                  FROM DBA_FREE_SPACE
                 GROUP BY TABLESPACE_NAME) F
         WHERE D.TABLESPACE_NAME = A.TABLESPACE_NAME(+)
           AND D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
           AND NOT (D.EXTENT_MANAGEMENT LIKE 'LOCAL' AND
                D.CONTENTS LIKE 'TEMPORARY')
         ORDER BY 2)
UNION ALL
SELECT DECODE(D.STATUS, 'OFFLINE', D.STATUS, D.STATUS)  STATUS,
       D.TABLESPACE_NAME,
       D.CONTENTS TYPE,
       D.EXTENT_MANAGEMENT EXTENT_MGT,
       D.SEGMENT_SPACE_MANAGEMENT SEGMENT_MGT,
       ROUND(NVL(A.BYTES, 0) / 1024 / 1024, 2) TS_SIZE,
       ROUND(NVL(A.BYTES - NVL(T.BYTES, 0), 0) / 1024 /  1024, 2) FREE,
       ROUND(NVL(T.BYTES, 0) / 1024 / 1024, 2) USED,
       DECODE((1 -
              SIGN(1 - SIGN(TRUNC(NVL(T.BYTES / A.BYTES *  100,  0)) - 90))),
              1,
              TO_CHAR(TRUNC(NVL(T.BYTES / A.BYTES * 100,  0))),
              TO_CHAR(TRUNC(NVL(T.BYTES / A.BYTES * 100,  0)))) PCT_USED
  FROM SYS.DBA_TABLESPACES D,
       (SELECT TABLESPACE_NAME, SUM(BYTES) BYTES
          FROM DBA_TEMP_FILES
         GROUP BY TABLESPACE_NAME) A,
       (SELECT TABLESPACE_NAME, SUM(BYTES_CACHED) BYTES
          FROM V$TEMP_EXTENT_POOL
         GROUP BY TABLESPACE_NAME) T
WHERE D.TABLESPACE_NAME = A.TABLESPACE_NAME(+)
   AND D.TABLESPACE_NAME = T.TABLESPACE_NAME(+)
   AND D.EXTENT_MANAGEMENT LIKE 'LOCAL'
   AND D.CONTENTS LIKE 'TEMPORARY'
ORDER BY 2;

8.查询RMAN备份作业的相关信息

包括备份名称(BACKUP_NAME)
开始时间(START_TIME)
耗时(ELAPSED_TIME)
状态(STATUS)
输入类型(INPUT_TYPE)
输出设备类型(OUTPUT_DEVICE_TYPE)
输入大小(INPUT_SIZE)
输出大小(OUTPUT_SIZE)
输出速率(OUTPUT_RATE_PER_SEC)

SELECT R.COMMAND_ID BACKUP_NAME,
       TO_CHAR(R.START_TIME, 'MM/DD/YYYY HH24:MI:SS')  START_TIME,
       R.TIME_TAKEN_DISPLAY ELAPSED_TIME,
       DECODE(R.STATUS,
              'COMPLETED',
              R.STATUS,
              'RUNNING',
              R.STATUS,
              'FAILED',
              R.STATUS,
              R.STATUS) STATUS,
       R.INPUT_TYPE,
       R.OUTPUT_DEVICE_TYPE,
       R.INPUT_BYTES_DISPLAY INPUT_SIZE,
       R.OUTPUT_BYTES_DISPLAY OUTPUT_SIZE,
       R.OUTPUT_BYTES_PER_SEC_DISPLAY OUTPUT_RATE_PER_SEC
  FROM (SELECT COMMAND_ID,
               START_TIME,
               TIME_TAKEN_DISPLAY,
               STATUS,
               INPUT_TYPE,
               OUTPUT_DEVICE_TYPE,
               INPUT_BYTES_DISPLAY,
               OUTPUT_BYTES_DISPLAY,
               OUTPUT_BYTES_PER_SEC_DISPLAY
          FROM V$RMAN_BACKUP_JOB_DETAILS
         ORDER BY START_TIME DESC) R
WHERE ROWNUM < 30;

9.查看备份集信息(控制文件)

从V$BACKUP_SET,V$BACKUP_PIECE视图查询

BS_KEY:备份集标识(BS.RECID)
PIECE:备份片号(BP.PIECE#)
COPY: 备份片拷贝号(BP.COPY#)
BP_KEY:备份片标识(BP.RECID)
CONTROLFILE_INCLUDED:控制文件是否包含在备份集中的标志列,如果是’NO’则显示为’-',否则显示原值。
STATUS:备份片的状态,将’A’转换为’AVAILABL’,‘D’转换为’DELETED’,‘X’转换为’EXPIRED’。AVAILAB代表可用状态
HANDLE:备份片的句柄信息。格式化为最大长度为25的字符串。
该查询筛选出满足以下条件的备份集和备份片:

备份片的状态为’A’或’X’。
备份集中包含控制文件。
备份集的完成时间在当前时间的前一天以后。

set linesize 500
set pages 500
column BS_KEY format 999999
column PIECE  format 99
column COPY  format 99
column BS_KEY format 999999
column CONTROLFILE_INCLUDED  format a15
column STATUS  format a20
column HANDLE  format a25
SELECT BS.RECID BS_KEY,
       BP.PIECE# PIECE,
       BP.COPY# COPY,
       BP.RECID BP_KEY,
       DECODE(BS.CONTROLFILE_INCLUDED, 'NO', '-', BS.CONTROLFILE_INCLUDED) CONTROLFILE_INCLUDED,
       DECODE(STATUS, 'A', 'AVAILABL', 'D', 'DELETED', 'X', 'EXPIRED') STATUS,
       HANDLE HANDLE
  FROM V$BACKUP_SET BS, V$BACKUP_PIECE BP
WHERE BS.SET_STAMP = BP.SET_STAMP
   AND BS.SET_COUNT = BP.SET_COUNT
   AND BP.STATUS <