达梦数据库实例监控

继上一篇介绍到如何达梦安装集成使用,今天主要文章就是介绍如何玩转达梦数据库以及一些sql语句分析,排查,监控等,让我们开始吧。

语句一:监控数据库实例的运行状态,模式,事务等核心信息。

sql语句如下:

SELECT     TO_CHAR(START_TIME, 'YYYY-MM-DD HH24:MI:SS') AS START_TIME,    CASE STATUS$         WHEN 'OPEN' THEN '1'         WHEN 'MOUNT' THEN '2'         WHEN 'SUSPEND' THEN '3'         ELSE '4'     END AS STATUS,    CASE MODE$         WHEN 'PRIMARY' THEN '1'         WHEN 'NORMAL' THEN '2'         WHEN 'STANDBY' THEN '3'         ELSE '4'     END AS MODE,    (SELECT COUNT(*) FROM V$TRXWAIT) AS TRXNUM,    (SELECT COUNT(*) FROM V$THREADS) AS THREADSNUM,    DATEDIFF(DAY, START_TIME, SYSDATE) AS DBSTARTDAYFROM V$INSTANCE;

执行结果:

图片

相关字段含义如下:

 START_TIME- 实例启动时间 :数据库实例最近一次启动的具体时间。用于判断实例运行时长、排查重启问题STATUS$- 实例状态 :  1  数据库已打开,正常提供服务;2:数据库已装载但未打开,用于维护操作;3:数据库挂起状态,可能因资源问题;4:未知或异常状态MODE$- 数据库运行模式:1:主库模式,用于数据守护环境;2:普通模式,单实例运行;3:备库模式,用于数据守护;4:特殊模式或异常TRXNUM- 等待事务数:= 0:系统运行正常,无事务阻塞;> 0:存在锁等待或资源争用;数值越大说明系统并发问题越严重THREADSNUM - 线程数量:数据库当前活动的线程总数,数据库的并发处理能力,系统负载情况,连接池使用状况DBSTARTDAY- 实例运行天数:实例连续运行的天数,可以用来判断系统稳定性以及故障排查时间参考等。如果这个值小于1,则表示近期重启过V$INSTANCE:显示当前数据库实例的基本信息,包含实例状态、启动时间、运行模式等V$TRXWAIT:显示当前正在等待锁或其他资源的事务信息,用于监控系统锁等待和死锁情况V$THREADS:显示数据库线程信息,反映数据库的并发处理状态

语句二:会话状态监控。

图片

sql语句如下:

-- 查询会话状态统计和最大会话数SELECT     DECODE(STATE, NULL, 'TOTAL', STATE) AS STATE_TYPE,    COUNT(SESS_ID) AS COUNT_VALFROM V$SESSIONS WHERE STATE IN ('IDLE', 'ACTIVE')GROUP BY ROLLUP(STATE)UNION ALLSELECT 'MAX_SESSION' AS STATE_TYPE, para_value AS COUNT_VALFROM V$DM_INI WHERE para_name = 'MAX_SESSIONS';
-- 达梦数据库session修改记录达到大事务级别-- 查询最大使用记录数SELECT MAX(t.ins_cnt + t.del_cnt + t.upd_cnt + t.upd_ins_cnt) AS used_urec FROM V$TRX t;

第一个查询获取系统会话最大数量,超过这个会话最大数量后,后应用层无法再连接数据库,TOTAL字段含义为当前已经使用的会话数量。第二个则是查询计算当前所有事务中最大的操作记录数,相关参数字段如下:

ins_cnt:插入记录数del_cnt:删除记录数upd_cnt:更新记录数upd_ins_cnt:更新插入记录数监控意义:用于识别大事务,预防事务过大的性能问题其中可以借助TOTAL/MAX_SESSION字段的百分比,如果这个百分比超过70%,那么就发起预警警告,同时通过v$trx视图查询可以看到指定事务的修改记录,从而判断出是否是大事务,比如说超过1w行修改就是大事务会话

语句三:表空间/数据文件监控

图片

图片

sql语句如下:

SELECT     F.TABLESPACE_NAME,    T.TOTAL_SPACE AS "TOTAL_SIZE",    F.FREE_SPACE AS "FREE_SIZE"FROM (    SELECT         TABLESPACE_NAME,        ROUND(SUM(BLOCKS * (SELECT PARA_VALUE / 1024 FROM V$DM_INI WHERE PARA_NAME = 'GLOBAL_PAGE_SIZE') / 1024)) AS FREE_SPACE    FROM DBA_FREE_SPACE    GROUP BY TABLESPACE_NAME) FJOIN (    SELECT         TABLESPACE_NAME,        ROUND(SUM(BYTES / 1048576)) AS TOTAL_SPACE    FROM DBA_DATA_FILES    GROUP BY TABLESPACE_NAME) T ON F.TABLESPACE_NAME = T.TABLESPACE_NAME;
--数据文件自动拓展检查SELECT '表空间文件自动扩展设置',       LISTAGG(CLIENT_PATH || ':' || CASE AUTO_EXTEND WHEN 1 THEN '自动扩展' ELSE '手动扩展' END, ', ') WITHIN GROUP (ORDER BY CLIENT_PATH)FROM V$DATAFILE;

第一个是查询数据库中所有表空间的总大小和剩余空闲大小。

计算逻辑:

 1. 从 V$DM_INI 获取 GLOBAL_PAGE_SIZE(全局页面大小)

 2. 将空闲块数(BLOCKS) × 页面大小 ÷ 1024 ÷ 1024 = 空闲空间(MB)

主要是用来监控表空间使用情况,预防空间不足,同时根据使用趋势规划存储扩容(空间不足会影响数据库性能)

第二个sql是用来检查所有数据文件的自动扩展设置状态。确保关键表空间启用自动扩展,避免因空间满导致业务中断,空间不足时需及时扩容或清理数据

语句四:sql语句执行统计

SELECT  NAME,  STAT_VALFROM  v$sysstatWHERE  name IN (    'select statements initiated',    'insert statements initiated',    'delete statements initiated',    'update statements initiated',    'ddl statements',    'transaction total count',    'select statements in PL/SQL',  'insert statements in PL/SQL',    'delete statements in PL/SQL',    'update statements in PL/SQL',   'DDL in PL/SQL count',    'dynamic exec in PL/SQL',    'DB time(ms)',    'parse time',   'hard parse time(ms)',    'latch wait time(ms)',    'mutex wait time(ms)',    'IO wait time',  'trx lock wait time(ms)',    'redo sync wait time(ms)',    'redo sync wait time for commit',  'parse count',    'parser errors',    'hard parse count',    'plan total',  'plan cache hit',    'logic read count',    'recycle logical reads',      'physical read count',    'physical multi read count',    'physical write count');

图片

这个 SQL 语句用于查询达梦数据库的系统性能统计信息,它监控了数据库的各种关键操作和性能指标。其中每个字段涵义如下:

SQL 操作统计

select statements initiated:执行的 SELECT 语句数量insert statements initiated:执行的 INSERT 语句数量delete statements initiated:执行的 DELETE 语句数量update statements initiated:执行的 UPDATE 语句数量ddl statements:DDL(数据定义语言)语句数量

事务统计

transaction total count:事务总数PL/SQL 中的 SQL 操作select statements in PL/SQL:PL/SQL 中执行的 SELECT 数量insert statements in PL/SQL:PL/SQL 中执行的 INSERT 数量delete statements in PL/SQL:PL/SQL 中执行的 DELETE 数量update statements in PL/SQL:PL/SQL 中执行的 UPDATE 数量DDL in PL/SQL count:PL/SQL 中执行的 DDL 数量dynamic exec in PL/SQL:PL/SQL 中动态执行的语句数量

时间统计(性能关键指标)

DB time(ms):数据库总处理时间(毫秒)parse time:SQL 解析时间hard parse time(ms):硬解析时间(毫秒)latch wait time(ms):闩锁等待时间(毫秒)mutex wait time(ms):互斥锁等待时间(毫秒)IO wait time:I/O 等待时间trx lock wait time(ms):事务锁等待时间(毫秒)redo sync wait time(ms):重做日志同步等待时间(毫秒)redo sync wait time for commit:提交时的重做日志同步等待时间

解析相关统计parse count:

解析总次数parser errors:解析错误次数hard parse count:硬解析次数plan total:执行计划总数plan cache hit:执行计划缓存命中次数

I/O 操作统计logic read count:

逻辑读次数recycle logical reads:回收的逻辑读次数physical read count:物理读次数physical multi read count:多块物理读次数physical write count:物理写次数

图片

SELECT     '硬解析率' AS "指标",    ROUND((硬解析次数/解析总次数)*100, 2) || '%' AS "值"FROM (    SELECT         MAX(CASE WHEN name = 'hard parse count' THEN stat_val END) AS "硬解析次数",        MAX(CASE WHEN name = 'parse count' THEN stat_val END) AS "解析总次数"    FROM v$sysstat    WHERE name IN ('hard parse count', 'parse count'));

图片

语句五:慢sql语句监控

SELECT     EXEC_TIME AS "执行时间(ms)",    SLOW_SQL AS "慢SQL语句",    SESS_ID AS "会话ID",    CURR_SCH AS "当前模式",    THRD_ID AS "线程ID",    LAST_RECV_TIME AS "最后接收时间",    CONN_IP AS "客户端IP",    ROUND(EXEC_TIME/1000, 2) AS "执行时间(秒)"FROM (    SELECT         DATEDIFF(ms, LAST_RECV_TIME, SYSDATE) AS EXEC_TIME,        DBMS_LOB.SUBSTR(SF_GET_SESSION_SQL(SESS_ID), 4000, 1) AS SLOW_SQL,        SESS_ID,        CURR_SCH,        THRD_ID,        LAST_RECV_TIME,        SUBSTR(CLNT_IP, 8, 13) AS CONN_IP    FROM V$SESSIONS    WHERE STATE = 'ACTIVE'        AND LAST_RECV_TIME IS NOT NULL        AND LAST_RECV_TIME > TO_DATE('2025-10-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS')    ORDER BY EXEC_TIME DESCWHERE EXEC_TIME >= 1000    AND ROWNUM <= 20;

表示查询耗时在1000毫秒以上,返回结果集前20条,执行结果如下:

图片

语句六:数据库用户状态监控

SELECT     A.USERNAME,    CASE B.RN_FLAG WHEN '0' THEN 'N' WHEN '1' THEN 'Y' END AS READ_ONLY,    CASE A.ACCOUNT_STATUS WHEN 'LOCKED' THEN '锁定' WHEN 'OPEN' THEN '正常' ELSE '异常' END AS ACCOUNT_STATUS,    TO_CHAR(A.EXPIRY_DATE, 'YYYY-MM-DD HH24:MI:SS') AS EXPIRY_DATE,    TO_CHAR(ROUND(DATEDIFF(DAY, SYSDATE, A.EXPIRY_DATE), 2)) AS EXPIRY_DATE_DAY,    A.DEFAULT_TABLESPACE,    A.PROFILE,    TO_CHAR(A.CREATED, 'YYYY-MM-DD HH24:MI:SS') AS CREATE_TIMEFROM DBA_USERS AJOIN SYSUSERS B ON A.USER_ID = B.IDWHERE A.USERNAME NOT IN ('SYS', 'SYSSSO', 'SYSAUDITOR');

图片

语句七:数据库授权监控

SELECT     CASE         WHEN expired_date IS NULL THEN ''         ELSE TO_CHAR(expired_date, 'YYYYMMDD')     END AS expired_date FROM V$LICENSE;

图片

EXPIRED_DATE字段表示授权到期日期,空表示永久授权。将该字段作为告警项避免因授权到期而导致实例出现异常

语句八:数据库缓存命中监控

-- 数据库缓存性能综合查询SELECT     ITEM AS "缓存监控项",    VALUE AS "数值"FROM (    -- 缓冲区命中率    SELECT 1 AS SORT, '缓冲区命中率' AS ITEM,           ROUND((1 - (PHY_READS / NULLIF(LOG_READS, 0))) * 100, 2) || '%' AS VALUE    FROM (        SELECT             MAX(CASE WHEN NAME = 'physical reads' THEN STAT_VAL ELSE 0 END) AS PHY_READS,            MAX(CASE WHEN NAME = 'logical reads' THEN STAT_VAL ELSE 0 END) AS LOG_READS        FROM V$SYSSTAT        WHERE NAME IN ('physical reads', 'logical reads')    )    UNION ALL    -- 物理读次数    SELECT 2, '物理读次数', TO_CHAR(STAT_VAL)    FROM V$SYSSTAT WHERE NAME = 'physical reads'    UNION ALL    -- 逻辑读次数    SELECT 3, '逻辑读次数', TO_CHAR(STAT_VAL)    FROM V$SYSSTAT WHERE NAME = 'logical reads'    UNION ALL    -- 缓存大小信息    SELECT 4, '缓冲区大小(MB)',            (SELECT TO_CHAR(ROUND(PARA_VALUE/1024/1024, 2))             FROM V$DM_INI             WHERE PARA_NAME = 'BUFFER' AND ROWNUM = 1)    FROM DUAL    WHERE EXISTS (SELECT 1 FROM V$DM_INI WHERE PARA_NAME = 'BUFFER')ORDER BY SORT;
-- 查看关键缓存指标SELECT     NAME AS "指标名称",    STAT_VAL AS "当前值",    CASE         WHEN NAME = 'buffer hit ratio' THEN STAT_VAL || '%'        WHEN NAME LIKE '%time%' THEN ROUND(STAT_VAL/1000, 2) || ' 秒'        ELSE TO_CHAR(STAT_VAL)    END AS "显示值"FROM V$SYSSTATWHERE NAME IN ('buffer hit ratio', 'logical reads', 'physical reads', 'buffer gets')   OR NAME LIKE '%cache%';

图片

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值