正德厚生,臻于至善

达梦数据库巡检脚本

DBA,数据世界的医生(附达梦巡检代码)

1.数据库授权信息查询

SELECT LIC_VERSION AS "许可证版本"       ,
        SERIES_NO AS "序列号"           ,
        CHECK_CODE AS "校验码"          ,
        AUTHORIZED_CUSTOMER AS "最终用户",
        PROJECT_NAME AS "项目名称"       ,
        PRODUCT_TYPE AS "产品名称"       ,
        CASE SERVER_TYPE WHEN '1' THEN '正式版' WHEN '2' THEN '测试版' WHEN '3' THEN '试用版' WHEN '4' THEN '其他' END AS "产品类型",
        TO_CHAR(EXPIRED_DATE) AS "有效日期",
        OS_TYPE AS "授权系统",
        TO_CHAR(AUTHORIZED_USER_NUMBER) AS "授权用户数",
        NVL(TO_CHAR(CONCURRENCY_USER_NUMBER),'') AS "授权并发数",
        NVL(TO_CHAR(MAX_CPU_NUM),'') AS "授权CPU个数",
        CLUSTER_TYPE AS "授权集群"
        FROM V$LICENSE;

2.查询数据库的实例信息

SELECT '版本号',(SELECT id_code)FROM v$instance
union all
select '数据库名',name from v$database
union all
select '实例名',instance_name from v$instance
union all
select '系统状态',status$ from v$instance
union all
select '实例模式',mode$ from v$instance
union all
select '是否启用归档',case arch_mode when 'Y' then '是' when 'N' then '否' end from v$database 
union all
SELECT  '页大小',cast(PAGE()/1024 as varchar)
union all
SELECT  '大小写敏感',cast(case SF_GET_CASE_SENSITIVE_FLAG()when '1' then '是' when '0' then '否' end as varchar)
union all
SELECT '字符集',CASE SF_GET_UNICODE_FLAG() WHEN '0' THEN 'GBK18030' WHEN '1' then 'UTF-8' when '2' then 'EUC-KR' end
union all
SELECT  '以字符为单位',cast(case SF_GET_LENGTH_IN_CHAR()when '1' then '是' when '0' then '否' end as varchar)
union all
SELECT  '空白字符填充模式',cast(case (select BLANK_PAD_MODE()) when '1' then '是' when '0' then '否' end as varchar)
union all
select '日志文件个数',to_char(count(*)) from v$rlogfile
union all
select '日志文件大小',cast(RLOG_SIZE/1024/1024 as varchar) from v$rlogfile where rowid =1
union all
select '创建时间',to_char(create_time) from v$database
union all
select '启动时间',to_char(last_startup_time) from v$database;

3.查询数据库中语句统计信息

select NAME,
       STAT_VAL
        from v$sysstat
 where name in ('select statements',
                'insert statements',
                'delete statements',
                'update statements',
                'ddl statements',
                'transaction total count');

4.数据库表空间的状态检查

SELECT NAME AS "NAME",
       CASE TYPE$ WHEN '1' THEN 'DB类型' WHEN '2' THEN '临时表空间' END AS "TYPE",
       CASE STATUS$ WHEN '0' THEN '联机' WHEN '1' THEN '脱机' WHEN '2' THEN '脱机' WHEN '3' THEN '损坏'END AS "STATUS",
       TOTAL_SIZE*PAGE/1024/1024 AS "TOTALSIZE",
       FILE_NUM AS "FILENUM"
FROM V$TABLESPACE;

5.查询数据库表空间的使用情况

SELECT
       F.TABLESPACE_NAME ,
       ROUND((T.TOTAL_SPACE - F.FREE_SPACE) / 1024, 2) "USED" ,
       CASE WHEN H.TOTAL_MAX_SPACE == 0 THEN ROUND(F.FREE_SPACE / 1024, 2) ELSE ROUND((H.TOTAL_MAX_SPACE -(T.TOTAL_SPACE - F.FREE_SPACE)) / 1024, 2) END "FREE_MAX" ,
       CASE WHEN H.TOTAL_MAX_SPACE == 0 THEN ROUND(T.TOTAL_SPACE / 1024, 2) ELSE ROUND(H.TOTAL_MAX_SPACE / 1024, 2) END "TOTAL_MAX" ,
       CASE WHEN H.TOTAL_MAX_SPACE == 0 THEN ROUND((F.FREE_SPACE/1024)/(T.TOTAL_SPACE / 1024), 4)*100||'%' ELSE ROUND(((H.TOTAL_MAX_SPACE-(T.TOTAL_SPACE - F.FREE_SPACE))/1024)/(H.TOTAL_MAX_SPACE / 1024), 4)*100||'%' END PER_FREE_MAX,
       CASE WHEN H.TOTAL_MAX_SPACE == 0 THEN ROUND((((T.TOTAL_SPACE - F.FREE_SPACE))/1024)/(T.TOTAL_SPACE / 1024), 4)*100||'%' ELSE ROUND((((T.TOTAL_SPACE - F.FREE_SPACE))/1024)/(H.TOTAL_MAX_SPACE / 1024), 4)*100||'%' END PER_USED_MAX ,
       ROUND(F.FREE_SPACE / 1024, 2) "FREE" ,
       ROUND(T.TOTAL_SPACE / 1024, 2) "TOTAL",
       CASE WHEN T.TOTAL_SPACE == 0 THEN '' ELSE (ROUND((F.FREE_SPACE / T.TOTAL_SPACE), 4)* 100) || '% ' END PER_FREE,
       CASE WHEN T.TOTAL_SPACE == 0 THEN '' ELSE (ROUND((T.TOTAL_SPACE - F.FREE_SPACE) / T.TOTAL_SPACE, 4) * 100)||'%' END PER_USED
  FROM ( SELECT TABLESPACE_NAME,
                ROUND(SUM(BLOCKS * ( SELECT PARA_VALUE / 1024
                   FROM V$DM_INI
                  WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE' ) / 1024)) FREE_SPACE
           FROM DBA_FREE_SPACE
       GROUP BY TABLESPACE_NAME ) F, ( SELECT TABLESPACE_NAME,
                ROUND(SUM(BYTES / 1048576)) TOTAL_SPACE
           FROM DBA_DATA_FILES
       GROUP BY TABLESPACE_NAME ) T, ( SELECT TABLESPACE_NAME,
                ROUND(SUM(MAXBYTES / 1048576)) TOTAL_MAX_SPACE
           FROM DBA_DATA_FILES
       GROUP BY TABLESPACE_NAME ) H
 WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME AND F.TABLESPACE_NAME =H.TABLESPACE_NAME;

6.查询表空间的数据文件使用情况

SELECT  PATH,
       TO_CHAR(TOTAL_SIZE*PAGE/1024/1024) AS TOTAL_SIZE,
       TO_CHAR(FREE_SIZE*PAGE/1024/1024) AS FREE_SIZE,
       (TO_CHAR(100-FREE_SIZE*100/TOTAL_SIZE)) AS REM_PER,
       CASE AUTO_EXTEND WHEN '0' THEN '未开启' WHEN '1' THEN '已开启' END AS AUTO_EXTEND,
       NEXT_SIZE,
       MAX_SIZE,
       b.TABLESPACE_NAME
  FROM V$DATAFILE a,dba_data_files b where b.file_name = a.PATH  order by GROUP_ID;

7.查询数据库中的用户信息

SELECT A.USERNAME ,
       CASE B.RN_FLAG WHEN '0' THEN '否' WHEN '1' THEN '是' END AS READ_ONLY,
       CASE A.ACCOUNT_STATUS WHEN 'LOCKED' THEN '锁定' WHEN 'OPEN' THEN '正常' END AS "状态",
       TO_CHAR(A.LOCK_DATE,'YYYY-MM-DD HH24:MI:SS') AS "锁定起始时间",
       TO_CHAR(A.EXPIRY_DATE,'YYYY-MM-DD HH24:MI:SS') AS "密码截止使用时间",
       TO_CHAR(round(datediff(DAY,TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS'),TO_CHAR(A.EXPIRY_DATE,'YYYY-MM-DD HH24:MI:SS')),2)) AS EXPIRY_DATE_DAY,
       TO_CHAR(round(datediff(DAY,TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS'),TO_CHAR(A.LOCK_DATE,'YYYY-MM-DD HH24:MI:SS')),2)) AS LOCK_DATE_DAY,
       A.DEFAULT_TABLESPACE,
       A.PROFILE,
       TO_CHAR(A.CREATED,'YYYY-MM-DD HH24:MI:SS') AS CREATE_TIME
  FROM DBA_USERS A, 
       SYSUSERS B 
 WHERE A.USER_ID=B.ID;

8.查询数据库中用户权限

SELECT USERNAME AS "用户名", 
WM_CONCAT(PRIVILEGE) AS "默认权限"
FROM
(SELECT  A.USERNAME ,     
C.PRIVILEGE
 FROM DBA_USERS A,SYSUSERS B,
 (SELECT A.* FROM (SELECT GRANTEE,GRANTED_ROLE PRIVILEGE,'ROLE_PRIVS' PRIVILEGE_TYPE,
CASE ADMIN_OPTION WHEN 'Y' THEN 'YES' ELSE 'NO' END ADMIN_OPTION FROM DBA_ROLE_PRIVS 
UNION SELECT GRANTEE,PRIVILEGE,'SYS_PRIVS' PRIVILEGE_TYPE,ADMIN_OPTION FROM DBA_SYS_PRIVS
UNION SELECT GRANTEE,PRIVILEGE||' ON '||OWNER||'.'||TABLE_NAME PRIVILEGE,'TABLE_PRIVS' PRIVILEGE_TYPE,GRANTABLE FROM DBA_TAB_PRIVS) A
WHERE GRANTEE IN (SELECT USERNAME FROM ALL_USERS WHERE USERNAME NOT IN ('SYS','SYSDBA','SYSSSO','SYSAUDITOR') ) 
) C
 WHERE A.USER_ID=B.ID
 AND A.USERNAME = C.GRANTEE)
GROUP BY USERNAME;

9.查询数据库中的对象是否无效(函数、存储过程、包等对象)

SELECT  OWNER,
       OBJECT_NAME,
       OBJECT_TYPE,
       TO_CHAR(CREATED,'YYYY-MM-DD HH24:MI:SS'),
       TO_CHAR(LAST_DDL_TIME,'YYYY-MM-DD HH24:MI:SS')
  FROM DBA_OBJECTS
 WHERE OWNER NOT IN('SYS',
                    'SYSJOB',
                    'SYSAUDITOR',
                    'CTISYS',
                    'SYSSSO')
   and STATUS = 'INVALID';

10.查询数据库中的大表信息

SELECT A.TABLE_NAME,A.TABLESPACE_NAME,B.OWNER ,B.BYTES
                   FROM (SELECT TABLE_NAME,TABLESPACE_NAME FROM ALL_TABLES  GROUP BY TABLE_NAME,TABLESPACE_NAME) AS A
                   LEFT JOIN (SELECT OWNER,SEGMENT_NAME,SUM(BYTES) BYTES FROM DBA_SEGMENTS WHERE SEGMENT_TYPE='TABLE'GROUP BY OWNER,SEGMENT_NAME) AS B
                   ON A.TABLE_NAME=B.SEGMENT_NAME
                   WHERE B.OWNER NOT IN ('SYS','SYSDBA','SYSAUDITOR','SYSSSO','CTISYS') ORDER BY BYTES DESC LIMIT 10;

11.查询数据库中的分区大表信息

SELECT A.OWNER,
       A.TABLE_NAME,
       A.PARTITIONING_TYPE,
       TO_CHAR(ROUND(TABLE_USED_SPACE(A.OWNER, A.TABLE_NAME) * PAGE / 1024.0 / 1024, 2))    SIZEMB,
       A.PARTITION_COUNT                                                                 as partition_num,
       table_rowcount(a.owner, a.table_name)                                             as row_num
  FROM DBA_PART_TABLES a;

12.查询数据库中会话的使用情况

SELECT  *
FROM
        (
                SELECT
                        STATE    ,
                         CASE 
    WHEN  INSTR(CLNT_IP, ':',8)  > 0 
     THEN SUBSTR(CLNT_IP, 1, INSTR(CLNT_IP, ':',8) - 1) 
    ELSE CLNT_IP 
    END AS CLNT_IP  ,
                        CLNT_TYPE,
                        CURR_SCH ,
                        USER_NAME,
                        COUNT(*) COUNTS
                FROM
                        V$SESSIONS
                GROUP BY
                        STATE    ,
                         CASE 
    WHEN  INSTR(CLNT_IP, ':',8)  > 0 
     THEN SUBSTR(CLNT_IP, 1, INSTR(CLNT_IP, ':',8) - 1) 
    ELSE CLNT_IP 
    END   ,
                        CLNT_TYPE,
                        CURR_SCH ,
                        USER_NAME
                ORDER BY
                        STATE
        );

13.长时间空闲会话检查

SELECT SESS_ID,
       SESS_SEQ,
       USER_NAME,
       CREATE_TIME,
       CLNT_TYPE,
       CLNT_HOST,
       CLNT_IP,
       OSNAME,
       CONN_TYPE,
       CLNT_VER
  FROM SYS.V$SESSIONS
 WHERE STATE = 'IDLE'
   AND DATEDIFF(HH, LAST_SEND_TIME, SYSDATE) > 48
   AND DATEDIFF(HH, CREATE_TIME, SYSDATE) > 48;

14.查询数据库的redo日志大小

SELECT FILE_ID,PATH,CLIENT_PATH,RLOG_SIZE FROM V$RLOGFILE;

15.查询数据库的定时任务信息

SELECT  SYSJOB."NAME"           ,
        SCHE."NAME" SCHENAME    ,
        SCHE."JOBID"            ,
        SCHE."TYPE"             ,
        SCHE."FREQ_INTERVAL"    ,
        SCHE."FREQ_SUB_INTERVAL",
        SCHE."STARTTIME"        ,
        STEPS."NAME" STEPSNAME  ,
        STEPS."SEQNO" STEPSSEQNO,
        STEPS."TYPE" STEPSTYPE  ,
        STEPS.COMMAND WHAT      ,
        STEPS.SUCC_ACTION       ,
        STEPS.FAIL_ACTION
FROM
        SYSJOB.SYSJOBSCHEDULES SCHE
LEFT JOIN SYSJOB.SYSJOBSTEPS STEPS
ON
        SCHE.JOBID = STEPS.JOBID
LEFT JOIN SYSJOB.SYSJOBS SYSJOB
ON
        SCHE.JOBID = SYSJOB.ID
WHERE
        SCHE.VALID == 'Y'
ORDER BY
        STEPS.JOBID,
        STEPS.SEQNO ASC;

16.查询定时任务是否有错误

select  
         NAME ,
         '' STEPNAME ,
         MAX(START_TIME) START_TIME,
         ERRINFO
    from ( SELECT NAME ,
                  MAX(START_TIME) START_TIME,
                  ERRINFO
             FROM SYSJOB.SYSSTEPHISTORIES2
            WHERE ERRCODE !=0
         GROUP BY NAME,
                  ERRINFO
         union all
           select NAME ,
                  MAX(START_TIME) START_TIME,
                  ERRINFO
             from SYSJOB.SYSJOBHISTORIES2
            where ERRCODE !=0
         GROUP BY NAME,
                  ERRINFO )
   WHERE TO_CHAR(START_TIME,'YYYY-MM-DD HH24:MI:SS') >= TO_CHAR(TRUNC(ADD_DAYS(SYSDATE, -7)),'YYYY-MM-DD HH24:MI:SS')
GROUP BY NAME,
         ERRINFO
ORDER BY START_TIME DESC LIMIT 10;

17.数据字典的淘汰情况

SELECT ROUND(TOTAL_SIZE/1024.0/1024, 2) TOTALSIZE         ,
                          ROUND(USED_SIZE /1024.0/1024, 2) USEDSIZE         ,
                          DICT_NUM DICTNUM                                ,
                          ROUND(SIZE_LRU_DISCARD/1024.0/1024, 2)  SIZELRUDISCARD,
                          LRU_DISCARD LRUDISCARD,ROUND((USED_SIZE/1024.0/1024)/(TOTAL_SIZE/1024.0/1024)*100, 2) CACHE_HIT
                   FROM
                          V$DB_CACHE;

18.查询数据库中的无效索引

select owner, index_name,table_name,index_type,status from dba_indexes
where status != 'VALID' and owner not in ('SYS', 'SYSAUDITOR', 'SYSSSO', 'SYSDBA', 'DEM', 'SYSJOB', 'SYSDBO')
order by 1,2,3;

19.查询数据库分区表中的无效索引

SELECT *
  FROM (SELECT SCH_NAME, INDEX_NAME, PARTITION_NAME, SUBPARTITION_NAME,STATUS
          FROM DBA_IND_SUBPARTITIONS
        UNION
        SELECT SCH_NAME, INDEX_NAME, PARTITION_NAME, NULL,STATUS
          FROM DBA_IND_PARTITIONS
        UNION
        SELECT OWNER, INDEX_NAME, NULL, NULL,STATUS FROM DBA_INDEXES) S
 WHERE S.STATUS = 'UNUSABLE'
   AND S.SCH_NAME NOT IN
       ('SYS', 'SYSAUDITOR', 'SYSSSO', 'SYSDBA', 'DEM', 'SYSJOB', 'SYSDBO')
 ORDER BY 1, 2;

20.查询数据库中的大索引信息

SELECT objname AS "对象名",
objtype as "对象类型",
TABLESPACE_NAME AS "表空间",
to_char(round(TOT_BLOCKS/1024.0/1024.0*page(),2)) AS "大小(MB)"
from 
(
SELECT objname,objtype,TABLESPACE_NAME,SUM(page_used) TOT_BLOCKS 
FROM 
(select * from
/*(select owner||'.'||table_name objname,
 'TABLE/TABLE PART' objtype,
 TABLESPACE_NAME,
 TABLE_USED_PAGES(owner,table_name) page_used
 from dba_tables 
 where tablespace_name not in ('TEMP','ROLL','SYSTEM') 
and owner not in ('SYS','SYSAUDITOR','SYSSSO','SCHEDULER')
and temporary='N'
and TABLE_USED_PAGES(owner,table_name)> (select sum(TOTAL_SIZE)*0.0001 from v$datafile)
order by table_used_space(owner,table_name) desc
limit 10)
union all*/
(select owner||'.'||index_name objname,
 'INDEX/INDEX PART' objtype,
 TABLESPACE_NAME,
 INDEX_USED_PAGES(owner,index_name) page_used
 from dba_indexes 
 where tablespace_name not in ('TEMP','ROLL','SYSTEM') 
and owner not in ('SYS','SYSAUDITOR','SYSSSO','SCHEDULER')
and temporary='N'
and INDEX_TYPE != 'CLUSTER'
and INDEX_USED_PAGES(owner,index_name)> (select sum(TOTAL_SIZE)* 0 from v$datafile)
order by index_used_space(owner,table_name) desc)
order by page_used desc
limit 10
)
GROUP BY objname,objtype,TABLESPACE_NAME
order by TOT_BLOCKS DESC limit 10);

21.查询监视器信息

select
TO_CHAR(DW_CONN_TIME, 'YYYY-MM-DD HH24:MI:SS') CONN_TIME,
MON_CONFIRM,
MON_IP,
MON_ID,
MON_TERM
 from v$dmmonitor;

22.查询实例运行错误的日志

select * from V$INSTANCE_LOG_HISTORY where LEVEL$ not in ('INFO','WARN');

23.查询数据库中是否存在死锁

SELECT TO_CHAR(HAPPEN_TIME,'YYYY-MM-DD HH24:MI:SS') HAPPEN_TIME,SQL_TEXT  FROM V$DEADLOCK_HISTORY WHERE HAPPEN_TIME >DATEADD(DAY,-30,SYSDATE);

24.查询数据库中的已经运行后的慢SQL

SELECT SQL_TEXT,EXEC_TIME,FINISH_TIME FROM V$SYSTEM_LONG_EXEC_SQLS ORDER BY EXEC_TIME DESC;

25.查询数据库中运行报错的SQL语句

SELECT SQL_TEXT,ECPT_DESC,max(ERR_TIME)ERR_TIME FROM V$RUNTIME_ERR_HISTORY  group by SQL_TEXT,ECPT_DESC LIMIT 10;

26.查询数据库中正在运行的慢SQL

select *  from ( SELECT DATEDIFF(MS,LAST_RECV_TIME,SYSDATE) EXEC_TIME,
                            DBMS_LOB.SUBSTR(SF_GET_SESSION_SQL(SESS_ID)) SLOW_SQL,
                            SESS_ID,
                            CURR_SCH,
                            THRD_ID,
                            LAST_RECV_TIME,
                            SUBSTR(CLNT_IP,8,13) CONN_IP
                       FROM V$SESSIONS
                      WHERE  1=1 
                   and STATE='ACTIVE'
                   ORDER BY 1 DESC) 
             where EXEC_TIME >= ? and LAST_RECV_TIME > TO_TIMESTAMP('2000-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') LIMIT ?
赞(0) 打赏
未经允许不得转载:徐万新之路 » 达梦数据库巡检脚本

支持快讯、专题、百度收录推送、人机验证、多级分类筛选器,适用于垂直站点、科技博客、个人站,扁平化设计、简洁白色、超多功能配置、会员中心、直达链接、文章图片弹窗、自动缩略图等...

联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册