展示型商城订单网站建设,惠州市建设工程交易中心网站,个人建立一个网站要多少钱,dnf做任务解制裁的网站数据处理的规范中#xff0c;第一个层次是ODS#xff0c;一般成为贴元层#xff0c;最靠近业务库的数据。需要统计ODS中有数据表的行数#xff0c;及更新频率。#xff08;假设在ODS中是Mysql数据库#xff09;
需求描述
有多个mysql的实例#xff0c;每个实例中有多个…数据处理的规范中第一个层次是ODS一般成为贴元层最靠近业务库的数据。需要统计ODS中有数据表的行数及更新频率。假设在ODS中是Mysql数据库
需求描述
有多个mysql的实例每个实例中有多个数据库schema每个shema有多个数据表。原始的数据定时增量同步或全量同步到ODS中ODS中不包含数据的历史版本。是同步的最新版本。
根据当前的现状需要统计
每个表有多少行
每个表更新的频率
每个表的字段详细 实现思路
分析需求
通过读取myql的元数据获取到每个数据表的行数。然后持续保存一定的周期如60天可以观察一下它的趋势如果在60天之后都没有更新基本上不是高频数据。
通过读取mysql的元数据获取每个表的字段信息可以获取到每个表的字段详细信息这个不需要保留历史版本仅仅保留最新的一个版本
技术方案
使用SpringBootjpa的方式来进行实现
表元数据获取
解析config.xml文件形成一个类。然后采用jdbc的原始方式进行循环连接各url。获取到数据之后转入到相应的类中。使用jpa的entity的方式将数据保存到数据库中
列元数据获取
解析config.xml文件形成一个类。然后采用jdbc的原始方式进行循环连接各url。获取到列的数据之后转入到相应的类中。使用jpa的entity的方式将数据 分批 保存到数据库中
非功能性
为保障程序的稳健性运行需要考虑 日志异常可配置性
日志
logback:rolling policy:file-name-pattern: datemeta.%d{yyyy-MM-dd}.%i.logmax-history: 10max-file-size: 1000KBtotal-size-cap: 20000KB
异常
自定义异常及枚举异常的类型
public enum DbMetaErrorCode {// 文件相关错误CONFIG_FILE_NOT_FOUND(1001, 配置文件未找到: {0}),CONFIG_PARSE_ERROR(1002, 配置文件解析失败: {0}),// 配置验证错误DUPLICATE_DATA_INSTANCE(2001, 发现重复的数据源实例名称: {0}),MISSING_DATA_INSTANCE_NAME(2002, 数据源实例缺少有效的 dbinstancename),INVALID_DATASOURCE_URL(2003, {0}: URL无效),MISSING_DRIVER_CLASS(2004, {0}: 缺少驱动类名),INVALID_KEEPDAYS(2005, 保留天数无效, 必须在{0}-{1}之间, 当前值: {2}),MISSING_DEST_DATASOURCE(2006, 目标数据源配置缺失),MISSING_DEST_URL(2007, 目标数据源URL缺失),MISSING_DEST_DRIVER(2008, 目标数据源驱动类名缺失),// 系统错误SYSTEM_STARTUP_FAILED(5001, 系统启动失败),DATABASE_CONNECTION_FAILED(5002, 数据库连接失败: {0}),// 通用错误INVALID_CONFIG(6001, 配置无效: {0});private final int code;private final String messageTemplate;DbMetaErrorCode(int code, String messageTemplate) {this.code code;this.messageTemplate messageTemplate;}public int getCode() {return code;}public String getMessage(Object... params) {return MessageFormat.format(messageTemplate, params);}
} 配置化
原始数据库的连接配置化
目标数据库的连接配置化 用户的使用方式
本机具有jdk8以上环境
有3个文件将这3个文件复制到同一个目录下。该目录不要使用中文。 数据源配置config.xml 字段解释
keepdays在数据库中保留的表的元数据历史版本天数
sourcedatasource 是针对原始的数据库实例的目录 datainstance是数据库的实例可以有多个实例如ABC等 数据库实例中有多个数据库仅选择任意一个数据库配置数据库连接。这样就可以访问该实例中所有的元数据。 如数据库有5个实例ABCDE每个实例下有100个库。 那么在 需要配置 datainstance 5个。 每个里面的原始选择该 datainstance下任意一个数据库的driveclass urlpassword
destinationdatasource
这个是将结果的元数据存入的数据库统计的数据会被执行到该数据库中 注意在xml中配置连接的时候如果出现特殊字符需要进行转义。如 字符需要转换为amp,
destinationdatasourcedriverclassnamecom.mysql.cj.jdbc.Driver/driverclassnameurljdbc:mysql://localhost:3306/speed?useUnicodetrueamp;characterEncodingutf-8amp;useSSLfalseamp;serverTimezoneAsia/Shanghai/urlusernameroot/usernamepasswordSteven123/passwordnote目标数据库/note/destinationdatasource 目标数据库下sql语句执行
CREATE TABLE tablemetainfo (id bigint NOT NULL,codecreateUserId varchar(255) DEFAULT NULL,codecreateTime datetime(6) DEFAULT NULL,codelastModifiedUserId varchar(255) DEFAULT NULL,codelastModifiedTime datetime(6) DEFAULT NULL,codeversion int DEFAULT NULL,dbinstancename varchar(255) DEFAULT NULL,note varchar(255) DEFAULT NULL,tableCatalog varchar(255) DEFAULT NULL,tableSchema varchar(255) DEFAULT NULL,tableName varchar(255) DEFAULT NULL,tableType varchar(255) DEFAULT NULL,engine varchar(255) DEFAULT NULL,version int DEFAULT NULL,rowFormat varchar(255) DEFAULT NULL,tableRows bigint DEFAULT NULL,avgRowLength bigint DEFAULT NULL,dataLength bigint DEFAULT NULL,maxDataLength bigint DEFAULT NULL,indexLength bigint DEFAULT NULL,dataFree bigint DEFAULT NULL,autoIncrement bigint DEFAULT NULL,createTime datetime(6) DEFAULT NULL,updateTime datetime(6) DEFAULT NULL,checkTime datetime(6) DEFAULT NULL,tableCollation varchar(255) DEFAULT NULL,checksum varchar(255) DEFAULT NULL,createOptions varchar(255) DEFAULT NULL,tableComment varchar(255) DEFAULT NULL,PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;CREATE TABLE columnmetainfo (id bigint NOT NULL,codecreateUserId varchar(255) DEFAULT NULL,codecreateTime datetime(6) DEFAULT NULL,codelastModifiedUserId varchar(255) DEFAULT NULL,codelastModifiedTime datetime(6) DEFAULT NULL,codeversion int DEFAULT NULL,dbname varchar(255) DEFAULT NULL,note varchar(255) DEFAULT NULL,tableCatalog varchar(255) DEFAULT NULL,tableSchema varchar(255) DEFAULT NULL,tableName varchar(255) DEFAULT NULL,columnName varchar(255) DEFAULT NULL,ordinalPosition int NOT NULL,columnDefault varchar(255) DEFAULT NULL,isNullable varchar(255) DEFAULT NULL,dataType varchar(255) DEFAULT NULL,numericPrecision int DEFAULT NULL,numericScale int DEFAULT NULL,datetimePrecision int DEFAULT NULL,characterSetName varchar(255) DEFAULT NULL,collationName varchar(255) DEFAULT NULL,columnType varchar(255) DEFAULT NULL,columnKey varchar(255) DEFAULT NULL,extra varchar(255) DEFAULT NULL,privileges varchar(255) DEFAULT NULL,columnComment varchar(255) DEFAULT NULL,generationExpression varchar(255) DEFAULT NULL,srsId varchar(255) DEFAULT NULL,PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;CREATE TABLE logdto (id bigint NOT NULL,codecreateUserId varchar(255) DEFAULT NULL,codecreateTime datetime(6) DEFAULT NULL,codelastModifiedUserId varchar(255) DEFAULT NULL,codelastModifiedTime datetime(6) DEFAULT NULL,codeversion int DEFAULT NULL,logContent varchar(255) DEFAULT NULL,logType int DEFAULT NULL,operateType int DEFAULT NULL,createBy varchar(255) DEFAULT NULL,createTime datetime(6) DEFAULT NULL,costTime bigint DEFAULT NULL,ip varchar(255) DEFAULT NULL,requestParam varchar(255) DEFAULT NULL,requestType varchar(255) DEFAULT NULL,requestUrl varchar(255) DEFAULT NULL,method varchar(255) DEFAULT NULL,username varchar(255) DEFAULT NULL,userid varchar(255) DEFAULT NULL,tenantId int DEFAULT NULL,clientType varchar(255) DEFAULT NULL,PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;
运行程序
在3个文件的目录下进入dos的界面执行
java -jar .\dbmeta-1.0.1.jar将自动部署一个web服务程序
获取表的元数据
用户手动触发访问
这个是获取到最新的表的元数据。
http://127.0.0.1:8066/tabledatainfo 自动定时任务
// 每天凌晨5点执行cron 表达式0 0 5 * * ?
Scheduled(cron 0 0 5 * * ?)每次执行的时候把今天的数据先进行删除然后把60天的数据删除然后在插入本次获取的数据。 获取列的元数据 这个是获取到最新的列的元数据
http://127.0.0.1:8066/columndatainfo
列每次手动更新没有必要定时任务 数据分析
SELECT dbinstancename, tableSchema, tablename,( max( tablerows )- min( tablerows )) maxmindiff FROM tableinfo GROUP BY dbinstancename, tableSchema, tablename HAVING max( tablerows )- min( tablerows )10
假设 最大值-最小值10为更新频率高的标记。
从这个结果集中可以初步评估有哪些是高频更新哪些是低频更新。 这种评估方法对于在ods中没有更新时间的来看是可参考的。
最理想的方式是在ODS的同步时候同时需要同步 updatetime的时间 开源的代码地址
https://gitee.com/stevenworkshop_admin/dbmeta