为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。 【DM版本】:DEM 6.1.0 【操作系统】: 【CPU】: 【问题描述】*: dem有没有自动清理监控数据的功能,如果没有,请提供下清理脚本
没有的,需要手工清理。参考以下方式
DEM后台库中存放自DEM部署启动以来的所有历史数据,而一般DEM后台库分配的磁盘资源较少,之前在一个项目中遇到历史数据太多导致磁盘不够的情况,记录一下解决方法。 --首先,统计出DEM下数据量较大的表 select table_name,table_rowcount(owner,table_name) rowcount from dba_tables where owner='DEM' order by rowcount desc; --我这里找到的表有如下这些 DMA_DATABASE_SQL_COUNT --907613737 DMA_DATABASE_SESSION --144149266 DMA_DATABASE_STAT --51700243 DMA_MAINFRAME_STAT --38417622 DMA_DATABASE_SQL_SLOW --35776039 DMA_DATABASE_SQL_COUNT_SQL_TEXT --30675548 -- DMA_MAINFRAME_DISK --21668130 DMA_DATABASE_EVENT --19428960 DMA_DATABASE_TS --以上表,除了DMA_DATABASE_SQL_COUNT_SQL_TEXT外,其他表都有一个TS字段,记录的是MILLSECOND值,可以用该列来过滤数据 --在以上表中的TS列上建立索引(已经存在的就不需要建立了) --注意:在配置这些的时候,最好暂时把DEM停掉 CREATE INDEX IDX_DMA_DATABASE_SQL_COUNT_TS ON DEM.DMA_DATABASE_SQL_COUNT(TS); CREATE INDEX IDX_DMA_DATABASE_SESSION_TS ON DEM.DMA_DATABASE_SESSION(TS); --表DMA_DATABASE_STAT的TS列上已有索引INDEX_DMA_DB_STAT_TS --表DMA_MAINFRAME_STAT的TS列上已有索引INDEX_DMA_MF_STAT_TS CREATE INDEX IDX_DMA_DATABASE_SQL_SLOW_TS ON DEM.DMA_DATABASE_SQL_SLOW(TS); CREATE INDEX IDX_DMA_MAINFRAME_DISK_TS ON DEM.DMA_MAINFRAME_DISK(TS); --表DMA_DATABASE_EVENT的TS列上已有索引INDEX_DMA_DB_EVENT_TS CREATE INDEX IDX_DMA_DATABASE_TS_TS ON DEM.DMA_DATABASE_TS(TS); --若已经运行了一段时间,有很多历史数据了,可以先手动把这些数据清理一下 --数据量比较小的话,可以直接delete --数据量很大的话,可以先把符合的数据查询插入到一个BAK表,然后直接truncate原表,再将BAK表中的数据写回到原表 --下面只写一个例子,其他表的操作基本都是一样的,以DMA_DATABASE_SQL_COUNT为例 CREATE TABLE DEM.DMA_DATABASE_SQL_COUNT_BAK AS SELECT * FROM DEM.DMA_DATABASE_SQL_COUNT WHERE TS > TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); --上面这句的意思是把7天内的数据备份出来 COMMIT; TRUNCATE TABLE DEM.DMA_DATABASE_SQL_COUNT; INSERT INTO DEM.DMA_DATABASE_SQL_COUNT SELECT * FROM DEM.DMA_DATABASE_SQL_COUNT_BAK; COMMIT; DROP TABLE DEM.DMA_DATABASE_SQL_COUNT_BAK; --关于DMA_DATABASE_SQL_COUNT_SQL_TEXT表,其中存放数据库执行过的sql,并且是经过去重的,如果是稳定运行的应用,一般执行的sql应该都是固定的 --创建定时作业,每天晚上执行如下脚本 BEGIN --定时作业中写如下内容 --删除七天以前的数据 DELETE FROM DEM.DMA_DATABASE_SQL_COUNT WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_DATABASE_SESSION WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_DATABASE_STAT WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_MAINFRAME_STAT WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_DATABASE_SQL_SLOW WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_MAINFRAME_DISK WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_DATABASE_EVENT WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_DATABASE_TS WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); COMMIT; --更新统计信息 EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.IDX_DMA_DATABASE_SQL_COUNT_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.IDX_DMA_DATABASE_SESSION_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.INDEX_DMA_DB_STAT_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.INDEX_DMA_MF_STAT_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.IDX_DMA_DATABASE_SQL_SLOW_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.IDX_DMA_MAINFRAME_DISK_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.INDEX_DMA_DB_EVENT_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.IDX_DMA_DATABASE_TS_TS'; END;
可在系统配置这里设置
没有的,需要手工清理。参考以下方式
DEM后台库中存放自DEM部署启动以来的所有历史数据,而一般DEM后台库分配的磁盘资源较少,之前在一个项目中遇到历史数据太多导致磁盘不够的情况,记录一下解决方法。 --首先,统计出DEM下数据量较大的表 select table_name,table_rowcount(owner,table_name) rowcount from dba_tables where owner='DEM' order by rowcount desc; --我这里找到的表有如下这些 DMA_DATABASE_SQL_COUNT --907613737 DMA_DATABASE_SESSION --144149266 DMA_DATABASE_STAT --51700243 DMA_MAINFRAME_STAT --38417622 DMA_DATABASE_SQL_SLOW --35776039 DMA_DATABASE_SQL_COUNT_SQL_TEXT --30675548 -- DMA_MAINFRAME_DISK --21668130 DMA_DATABASE_EVENT --19428960 DMA_DATABASE_TS --以上表,除了DMA_DATABASE_SQL_COUNT_SQL_TEXT外,其他表都有一个TS字段,记录的是MILLSECOND值,可以用该列来过滤数据 --在以上表中的TS列上建立索引(已经存在的就不需要建立了) --注意:在配置这些的时候,最好暂时把DEM停掉 CREATE INDEX IDX_DMA_DATABASE_SQL_COUNT_TS ON DEM.DMA_DATABASE_SQL_COUNT(TS); CREATE INDEX IDX_DMA_DATABASE_SESSION_TS ON DEM.DMA_DATABASE_SESSION(TS); --表DMA_DATABASE_STAT的TS列上已有索引INDEX_DMA_DB_STAT_TS --表DMA_MAINFRAME_STAT的TS列上已有索引INDEX_DMA_MF_STAT_TS CREATE INDEX IDX_DMA_DATABASE_SQL_SLOW_TS ON DEM.DMA_DATABASE_SQL_SLOW(TS); CREATE INDEX IDX_DMA_MAINFRAME_DISK_TS ON DEM.DMA_MAINFRAME_DISK(TS); --表DMA_DATABASE_EVENT的TS列上已有索引INDEX_DMA_DB_EVENT_TS CREATE INDEX IDX_DMA_DATABASE_TS_TS ON DEM.DMA_DATABASE_TS(TS); --若已经运行了一段时间,有很多历史数据了,可以先手动把这些数据清理一下 --数据量比较小的话,可以直接delete --数据量很大的话,可以先把符合的数据查询插入到一个BAK表,然后直接truncate原表,再将BAK表中的数据写回到原表 --下面只写一个例子,其他表的操作基本都是一样的,以DMA_DATABASE_SQL_COUNT为例 CREATE TABLE DEM.DMA_DATABASE_SQL_COUNT_BAK AS SELECT * FROM DEM.DMA_DATABASE_SQL_COUNT WHERE TS > TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); --上面这句的意思是把7天内的数据备份出来 COMMIT; TRUNCATE TABLE DEM.DMA_DATABASE_SQL_COUNT; INSERT INTO DEM.DMA_DATABASE_SQL_COUNT SELECT * FROM DEM.DMA_DATABASE_SQL_COUNT_BAK; COMMIT; DROP TABLE DEM.DMA_DATABASE_SQL_COUNT_BAK; --关于DMA_DATABASE_SQL_COUNT_SQL_TEXT表,其中存放数据库执行过的sql,并且是经过去重的,如果是稳定运行的应用,一般执行的sql应该都是固定的 --创建定时作业,每天晚上执行如下脚本 BEGIN --定时作业中写如下内容 --删除七天以前的数据 DELETE FROM DEM.DMA_DATABASE_SQL_COUNT WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_DATABASE_SESSION WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_DATABASE_STAT WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_MAINFRAME_STAT WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_DATABASE_SQL_SLOW WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_MAINFRAME_DISK WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_DATABASE_EVENT WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); DELETE FROM DEM.DMA_DATABASE_TS WHERE TS < TIMESTAMPDIFF(MS,'1970-01-01',SYSDATE - 7); COMMIT; --更新统计信息 EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.IDX_DMA_DATABASE_SQL_COUNT_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.IDX_DMA_DATABASE_SESSION_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.INDEX_DMA_DB_STAT_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.INDEX_DMA_MF_STAT_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.IDX_DMA_DATABASE_SQL_SLOW_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.IDX_DMA_MAINFRAME_DISK_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.INDEX_DMA_DB_EVENT_TS'; EXECUTE IMMEDIATE 'STAT 100 ON INDEX DEM.IDX_DMA_DATABASE_TS_TS'; END;