GBase 8a MPP Cluster基于审计日志的冷温热数据分析

原文链接: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.开创了通过审计日志分析数据使用热度的先河,为客户的数据生命周期管理提供了可行的参考方案。

解决方案

  1. 新建表test.splist_bryan,作为自建笛卡尔积cross join时的伪参数表。
sql 复制代码
CREATE TABLE test.splist_bryan (  
  `id` int(19) NOT NULL,  
  `num` int(19) DEFAULT NULL
);
  1. 新建存储过程,对伪参数表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() ;
  1. 新建表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)
  1. 新建表test2,通过corssjoin自建笛卡尔积实现一行变多行;

    通过substring_index函数实现对串的不同部分按照行号进行截取,进而统计出每张表最近的访问时间;

    结果需要过滤掉系统库的表。

    vbnet 复制代码
    create 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')
  2. 以下结果显示,test2表中,每张表最近的使用日期。每张表占用一行,无重复表名。这样就可以根据这个日期,针对表进行使用热度分析。

冷温热数据分析

  1. 冷温热数据总量及明细

    以移动通讯行业举例,一般1年内为热数据,1-3年内为温数据,3+为冷数据。可以对冷温热数据的不同定义进行分析。也可根据数据实际分布情况定义冷温热数据。

    示例:

    sql 复制代码
    create 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; 

三种表的明细(查看部分数据)

三种表的总量:

  1. 分库分析冷温热数据

有时会需要弄清楚哪些库下的冷数据较多,需要先行清理,哪些可以后续清理,可以参考如下方式分析:

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技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

相关推荐
cui_win7 分钟前
Redis高可用-Cluster(集群)
数据库·redis·bootstrap
小五Z11 分钟前
MySql--增删改查表设计总结
数据结构·数据库·mysql
锐策1 小时前
〔 MySQL 〕数据类型
数据库·mysql
天天要nx1 小时前
D68【python 接口自动化学习】- python基础之数据库
数据库·python
Allen Bright1 小时前
Redis安装
数据库·redis·缓存
门牙咬脆骨1 小时前
【MYSQL】数据库日志 (了解即可)
数据库·mysql
ModelBulider1 小时前
十三、注解配置SpringMVC
java·开发语言·数据库·sql·mysql
豆 腐2 小时前
MySQL【四】
android·数据库·笔记·mysql
熊明才2 小时前
Ubuntu 22.04.4 LTS + certbot 做自动续签SSL证书(2024-11-14亲测)
数据库·网络协议·ssl