当前位置: 首页 > news >正文

达梦数据库常见的重要巡检语句

一、数据库授权信息查询

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

1.该项需注意数据库授权的有效日期,到期前需及时进行更换。

2.授权CPU个数字段值(出现过因限制CPU使用个数导致DB性能下降)

二、查询数据库的实例信息

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;

1.该sql查询的是数据库的安装信息参数,当需要进行实例迁移时需保障两端实例必须一致。

2.系统状态字段查询值如为非OPEN状态,需检查数据库是否正常

3.日志文件大小即redo日志不建议低于2G大小

三、查询数据库中语句统计信息

select

    NAME,

    STAT_VAL

from

    v$sysstat

where

    name in ('select statements',

    'insert statements',

    'delete statements',

    'update statements',

    'ddl statements',

    'transaction total count')

1.这个值是数据库启动以后从0不断递增的值,当数据库重启后清空又从0计数。

2.该值可以用来做监控项判断某个时间段sql的执行情况

四、数据库表空间的状态检查

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

需重点关注表空间类型非联机的情况,需重点监控

五、查询数据库表空间的使用情况

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

1.MAIN|TEMP|ROLL|SYSTEM这几个表空间是由系统自动管理的不需要关注使用率情况

2.SQL的计算公式比较复杂,原因是因为一个表空间可以有多个数据文件,这些数据文件中如有一个设置的是自动拓展空间且无上限,那么就不应该关注使用率了。

六、查询表空间的数据文件使用情况

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

MAIN|TEMP|ROLL|SYSTEM这几个表空间是由系统自动管理的不需要关注

七、查询数据库中的用户信息

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

1.需关注用户中是否存在密码设置有效期后到期的用户

2.需关注查询中的状态字段是正常状态还是非预期下的用户账号已被锁定

八、查询数据库中用户权限

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

需关注是否给应用用户授予DBA权限这类操作

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

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'

需关注库中的函数、包函数、存储过程等对象是否报错,是否需要处理

十、查询数据库中的大表信息

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

十一、查询数据库中会话的使用情况

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)

十二、长时间空闲会话检查

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;

1.在达梦数据库中默认情况下不会断开数据库的会话连接

2.运维中出现过管理工具中执行一条insert语句未进行提交,导致其他事务插入该表时发生事务等待从而影响生产的情况

3.对于长时间的空闲会话,应该定期进行会话连接清理

十三、查询数据库的redo日志大小

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

单个redo文件不建议低于2g大小,最好保障每个redo大小日志都是一样的

十四、查询数据库的定时任务信息

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

检查数据库中是否有配置定时数据备份任务,来保障数据安全

社区地址:https://eco.dameng.com

http://www.lryc.cn/news/624170.html

相关文章:

  • 线程(基本概念和相关命令)
  • 重温k8s基础概念知识系列三(工作负载)
  • Linux设备模型深度解析
  • Rust Async 异步编程(五):执行器和系统 I/O
  • Python可视化工具-Bokeh:动态显示数据
  • java_spring boot 中使用 log4j2 及 自定义layout设置示例
  • 【Java后端】MyBatis-Plus 原理解析
  • 股票术语:“支撑位”
  • 链表OJ题讲解---试金石含金量
  • qt svg缺失元素, 原因是不支持 rgba
  • 测试Windows10IoT系统是否可以正常运行KingSCSDA3.8软件
  • JavaScirpt高级程序设计第三版学习查漏补缺(1)
  • JavaScript 中constructor 属性的指向异常问题
  • 【前端面试题】JavaScript核心面试题解析
  • 芋道RBAC实现介绍
  • 软件开发 - foreground 与 background
  • 数据结构与算法之 leetcode 98. 验证二叉搜索树 (前序,中序,后序遍历)
  • React 基础实战:从组件到案例全解析
  • Wasserstein GAN:如何解决GANS训练崩溃,深入浅出数学原理级讲解WGAN与WGAN-GP
  • C语言相关简单数据结构:双向链表
  • 【数据分享】黑龙江省黑土区富锦市土地利用数据
  • 正则表达式实用面试题与代码解析专栏
  • 【Linux系列】常见查看服务器 IP 的方法
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘imageio’问题
  • Go语言企业级权限管理系统设计与实现
  • 2024年08月13日 Go生态洞察:Go 1.23 发布与全面深度解读
  • pandas series常用函数
  • leetcode热题100——day33
  • Python 内置模块 collections 常用工具
  • (机器学习)监督学习 vs 非监督学习