原文链接:www.gbase.cn/community/p...
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
基于审计日志的冷温热数据分析
摘要
数据生命周期管理是项目中常见问题,一般解决方案为:
根据数据表创建时间和使用时间,计算出数据表的使用频率,从而将数据表分类为冷、温、热数据,以便客户进行数据清理或数据迁移。
但当表数据量较多时,该类信息无法快速或者直接从集群元数据中获取。
因此需要通过程序多维度地提取元数据中的信息,梳理出客户业务中常用、不常用的数据表,并经过加工整合归类分析,最终解决该类问题。
分析思路
数据库中audit_log表的table_list字段,表示每个SQL语句所使用到的表,所有表名存储在与SQL对应的每一行上,且用逗号分隔。如果需要时间和表名的明细数据,需要做单行转多行的操作,该操作似于group_concat函数的反操作。
审计日志如下图:
审计日志表内数据整理后,期望格式如下:
期望实现效果如下:
难点分析
-
需把每行涉及的多表字符串记录转为多行数据。
1.原方案曾尝试把table_list字段整列数据分成单表、多表两类。
对多表的数据导出库外,使用sed命令替换逗号为换行,再加载入库。
但该方案涉及库内库外操作,不如本方案仅在库内实现方便。
2.设计灵感来源于python语言的字符串分隔函数split()实现逻辑
借鉴使用substring_index函数对串进行必要的分割。
3.参考了通过cross join自建笛卡尔积,实现一行变多行的操作逻辑,从根本上解决问题。
4.开创了通过审计日志分析数据使用热度的先河,为客户的数据生命周期管理提供了可行的参考方案。
解决方案
- 新建表test.splist_bryan,作为自建笛卡尔积cross join时的伪参数表。
sql
CREATE TABLE test.splist_bryan (
`id` int(19) NOT NULL,
`num` int(19) DEFAULT NULL
);
- 新建存储过程,对伪参数表test.splist_bryan进行初始化操作。插入100行行号。
注: 这里假定每个sql 中涉及到的表不会超过100个(一般也不会超过)。如果有类似场景需要单行转多行,且拆分出的行数最大超过100个,在如下存储过程还可以再修改添加。
dart
delimiter //
create procedure test.splist_init()
begin
declare num int;
set num=1;
while num < 100 do
insert into test.splist_bryan(id, num) values(num, num);
set num=num+1;
end while;
end //
delimiter ;
call test.splist_init() ;
- 新建表test1 对audit_log表进行分类汇总统计。start_time是表最近访问时间,tbl是对应的表名(表名列表)。
注: 此处audit_log是根据集群中每个节点中的gbase.audit_log汇总而来的express引擎表,这里只为描述方便, 未作引用。
sql
跨引擎迁移表内数据需要打开\_gbase\_query\_path参数。
create table test.test1 (start_time timestamp,tbl varchar(5000));
set global _gbase_query_path=1;
insert into test.test1 as
select max(start_time) as start_time,
replace( trim(regexp_replace(table_list,';|`|WRITE:|READ:|OTHER:','')),' ',',' ) as tbl
from gbase.audit_log
where length(trim(regexp_replace(table_list,';|`|WRITE:|READ:|OTHER:','')))<>0
and not regexp_like(db, 'gbase|information_schema|performance_schema|gctmpdb|gclusterdb', 'i')
group by replace( trim(regexp_replace(table_list,';|`|WRITE:|READ:|OTHER:','')),' ',',' )
集群新audit_log表各字段含义:
- thread_id ,线程号,同processlist中的ID;
- taskid ,全局唯一的任务号
- start_time ,开始执行的时间
- end_time ,SQL执行结束的时间
- user_host ,登陆的用户名和host
- user ,用户名
- host_ip ,用户登录端IP地址;
- query_time ,执行的时间
- rows ,返回结果集行数
- db ,执行的当前数据库名
- table_list ,涉及表,格式:
<db>
.<tb>
[,...]; - sql_text ,sql 内容
- sql_type ,标识SQL类型,DDL,DML,DQL,OTHERS
- sql_command ,sql命令类型,如SELECT、UPDATE,INSERT,LOAD等;
- algorithms ,涉及的算子,比如JOIN、WHERE、GROUP、HAVING等;
- status ,标识SQL执行成功还是失败,SUCCESS,FAILED
- conn_type ,用户登陆方式(CAPI、ODBC、JDBC、ADO)
-
新建表test2,通过corssjoin自建笛卡尔积实现一行变多行;
通过substring_index函数实现对串的不同部分按照行号进行截取,进而统计出每张表最近的访问时间;
结果需要过滤掉系统库的表。
vbnetcreate table test.test2 as select * from ( select max(start_time) mydate,col as tblist from ( SELECT t.start_time, substring_index( substring_index( t.tbl, ',', b.num ), ',', - 1 ) as col FROM test.test1 as t cross JOIN test.splist_bryan as b on b.num <= LENGTH(t.tbl) - LENGTH(REPLACE(t.tbl, ',', '')) + 1 ) as m group by 2 ) as p where not regexp_like(tblist, 'gbase|information_schema|performance_schema|gctmpdb|gclusterdb', 'i')
-
以下结果显示,test2表中,每张表最近的使用日期。每张表占用一行,无重复表名。这样就可以根据这个日期,针对表进行使用热度分析。
冷温热数据分析
-
冷温热数据总量及明细
以移动通讯行业举例,一般1年内为热数据,1-3年内为温数据,3+为冷数据。可以对冷温热数据的不同定义进行分析。也可根据数据实际分布情况定义冷温热数据。
示例:
sqlcreate table test3 as select mydate,tblist,substring(tblist,1, INSTR(tblist, '.')-1) as dbname,substring(tblist,INSTR(tblist, '.')+1) as tbname, case when diff<=256 then 'hot' when diff>256 and diff<3*256 then 'warm' else 'cold' end as class from (select date(mydate) mydate,datediff(sysdate(),date(mydate)) as diff , tblist from test.test2 ) as p;
三种表的明细(查看部分数据)
三种表的总量:
- 分库分析冷温热数据
有时会需要弄清楚哪些库下的冷数据较多,需要先行清理,哪些可以后续清理,可以参考如下方式分析:
select class,dbname,count(tblist) from test.test3 group by class,dbname ;
示例:
python
select dbname,sum(decode(class,'cold',1,0)),
sum(decode(class,'warm',1,0)),
sum(decode(class,'hot',1,0))
from test.test3 group by dbname ;
可以看出gbaserpt、gbaseods、gbasedwd、gbasemsm这4个库下的冷数据最多,应先行迁移或清理数据。
原文链接:www.gbase.cn/community/p...
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。