1. 为什么先做数据资产清查,而不是先上模型
聊到轻型AI中台,很多人第一反应是模型、算法、推理框架,结果真正落地的时候,最先卡住的往往不是模型精度,而是数据层面的一笔糊涂账。数据资产底数不清、元数据缺失、字段口径混乱,这些问题不解决,后面的数据接入、特征工程、模型训练全都得在流沙上打地基。
我去年帮一家企业搭过一套轻量化的AI中台底座,系统倒是很快跑起来了,但真正开始做数据对接时才发现,生产库里的表比预想中多了一倍不止。有些是历史项目遗留的临时表,有些是业务方自己建的报表中间表,还有几个数据源连负责人都不清楚了。当时就意识到,如果不先把数据资产盘清楚,这个中台就只是个空壳子。
这个附录讲的就是那套配套落地的数据资产智能清查指令集和核验模板。简单说,它不是为了展示数据目录有多漂亮,而是用一套半自动化的指令脚本加人工复核模板,把散落在各业务系统里的数据表、字段、存储过程、调度任务全部摸一遍,形成一份有实际参考价值的资产清单。整个过程不动业务数据、不侵入生产环境、不需要业务方深度配合,适合在项目初期快速摸底,也适合数据团队定期做资产体检。
适合谁看?如果你正准备搭中台、数据仓库或数据湖,需要先搞清楚手里到底有什么数据;或者你的老系统已经被迭代了很多年,连DBA都说不全库里有哪些表;又或者领导突然让你"三天内出一份数据资产盘点报告",那你在这个附录里能找到可以直接套用的模板和思考路径。
2. 清查方案的整体设计与指令拆解
2.1 核心思路:不要让业务方填写Excel来实现清查
先说一个常见的弯路。很多人一想到数据资产盘点,第一反应是拉上各业务线的负责人,开个启动会,发一张Excel表下去,让大家填"你这边有哪些数据表、哪些字段"。结果往往是:业务方本来就不清楚自己的数据落在哪张表里,填出来的东西主观且不可验证;等了两周收回来的表,格式五花八门;最后这些Excel还很快变成静态文件,没人维护。
正确的思路是反过来的:先让机器把客观存在的物理资产扫出来,再让业务方在已有的客观清单上做标注和确认。这里的"客观清单",就是通过指令脚本直接连到元数据库、系统表或日志接口,把表名、字段名、记录数、最后写入时间、依赖关系这类硬信息全部抓出来。业务方要做的,只是在清单上补充业务含义、口径说明和数据负责人,而不是凭记忆去"发明"数据资产。
这套方案的核心价值就在于把"资产建档"这个动作,从人肉盘点变成了"机器扫描+人工补充"的协作模式。机器负责客观存在性,人负责业务语义,各干各擅长的部分。
2.2 指令集的功能分类与覆盖范围
在实际设计清查指令时,我把指令分成了五个组,每个组解决一个维度的信息采集问题:
- 连接探测与访问审计:确认数据源的连通性、账户权限边界、只读账号能否满足清查需求。这一组通常最先执行,用于验证清查环境本身是否可用。
- 元数据采集:抓取表清单、字段清单、字段类型、默认值、约束条件、注释信息。这是后续一切分析和分级的基础。
- 存储与增长分析:统计每张表的空间占用、近一段时间的数据增量、生命周期状态,区分活跃表、静默表与僵尸表。
- 血缘与依赖分析:解析存储过程、视图、任务调度逻辑,找出表与表之间的上下游关系。
- 质量探针:通过采样计算空值率、重复率、值分布特征,用低成本方式快速评估数据质量水位。
这五组指令不是一次全跑的,而是按阶段拆分。先跑前两组做出基础清单,确认结果可靠后再跑存储和血缘分析,最后才做质量探针。一上来全量跑,容易因为个别数据源的权限问题导致整个流程中断。
2.3 单个指令的通用模板设计
这套指令集在工程上其实没什么高深技巧,关键是标准化。每一类指令都定义了统一的输入参数、执行输出、耗时预估和异常退出码,方便后续统一调度和日志归集。下面是一个标准的指令参数定义示意:
task_name: scan_table_meta target_datasource: mysql://10.10.10.24:3306/reporting scan_scope: schema_list:%reporting%,%temp_% output_path: ./out/scan_table_meta_20240601.csv timeout_secs: 1800 strategy: infer_comment: true calc_row_count: estimate sample_size: 5000这个模板的含义是:定义了一个扫描任务,目标数据源指向线上报表库,只扫描以reporting或temp_开头的schema;输出落到本地CSV文件;半小时内跑不完就自动终止;表注释尽可能从建表语句里推断;行数不精确统计,用估算值;超大数据集只采样五千行做质量探针。
所有指令都统一这个格式,好处是后续加新数据源只需要复制一份改参数,不用重写脚本逻辑。这套清查指令在某公司部署时覆盖了4套数据源、两千多张业务表,全部跑完用了四十分钟左右,时间主要集中在跨内网的元数据抓取和存储过程血缘解析上。
2.4 为什么计算行数要做估算而不是精确统计
新手最容易踩的坑是习惯性对每张表执行count(*)来拿行数。小表没问题,但一旦遇到几千万行的大表——尤其是生产环境的订单表、流水表——一次全表扫描会对线上库造成明显的IO压力,严重时还可能拖慢业务。而且中台清查阶段根本不需要精确行数,误差在百分之五以内完全够用。
我的做法是优先读取数据库自带的统计信息。MySQL可以查information_schema.tables里的table_rows字段,PostgreSQL有reltuples,大多数数据库都提供了类似的估算入口。只有在统计分析信息不可信或者找不到入口的少数场景,才做条件收敛的抽样估算,比如按主键范围等距采样后再折算。
这里就牵扯到企业数据治理的根本矛盾:治理动作不能影响业务运行。做清查不是做压测,能用一行SQL解决的事绝不扫全表,这是清查指令集设计的第一原则。
3. 核验模板背后的设计逻辑与字段体系
3.1 核验模板要解决什么问题
指令集扫描出来的是一堆机器视角的信息,表名、字段名、类型、大小这些都有了,但远远不够。真正的问题是:这张表是干什么用的?里面的数据是谁在维护?质量到底能不能支撑AI模型训练?这些信息机器拿不到,必须靠人来补。
核验模板就是把机器生成的基础清单转化为一份"人机协作填写表"。我会在机器输出表的每一行后面追加一批待人工确认的列,比如:业务域分类、数据敏感级别、业务负责人、质量问题标记、生命周期建议。整个过程是用机器信息锁定范围,用人工知识补充语义,避免业务方凭记忆编造表格。
3.2 目录命名与格式定义
文件命名这个细节看起来不起眼,实际影响很大。最开始我直接用了"数据资产盘点表.xlsx",结果发给不同团队之后,返回来的文件叫各种名字——"数据字典终版.xlsx""XXX库表清单V3(最终版).xlsx""改改改最终版.xlsx"——最后汇总的时候光是统一文件名就花了不少时间。
后来我养成了一个习惯,把命名规范直接写进模板说明:数据资产清查-{数据源}-{部门}-{日期}.xlsx,并在开头就写明版本记录、填写人、复核人、主要变更说明。这种细节从源头上避免了文件管理混乱。另外,模板必须保留机器输出的原始CSV作为附带文件,任何人在后面对账时都能找到一手依据。
3.3 关键字段的设计与完整定义
核验模板的核心字段,需要从数据资产标签、质量评估、生命周期建议、业务关系扩展四个维度来设计。先说字段清单,分核心字段、管理字段、质量字段和扩展字段四类,列几个比较关键的:
- 资产编号:全局唯一标识,格式为
DS[数据源缩写]-[schema标识]-[四位序号],例如DS-MYSQL01-REPORT-0023。这个编号贯穿清查、核验、后续追踪全流程,相当于每张表的身份证号。 - 数据源实例:记录所属系统、连接串别名、环境类型。很多企业里有多个库的命名习惯相近,比如"临时库"在每个数据源里都有一套,光靠这个环境类型字段就能筛掉一半的干扰项。
- 资产类型:表、视图、存储过程、定时任务、消息Topic。
- schema归属与物理位置:这个决定了数据流转路径上的物理坐标。
- 业务域:由数据负责人选填,包括客户域、订单域、日志域、公共维度等。机器能扫出表,但"属于什么业务域"需要人来判断。
- 数据敏感级别:内部公开、敏感、机密、高敏。这个字段直接决定数据能否出域。
- 质量水位:分为A\B\C\D四档,A是结构完整、无空值异常;D是严重缺失或大量重复,不建议直接入特征宽表。
- 治理建议:保留归档、定期清理、需要补录、纳入中台贴源层等。
实体关系扩展字段的设计更有意思。虽然不是每张表都有完整的血缘关系,但哪怕只填了上游来源和下游应用两个单元格,也能拼出一条相对完整的数据链路。有的现场人员反馈看不懂"下游应用"该填什么,后来我在表头加了填写提示示例,用下拉选项加自由文本组合的方式,既约束了格式又保留了灵活性。
我还会在核验模板中增加一个专门的"口径备注"列。很多表看上去字段名一样——比如"订单金额"——但有的单子含税,有的不含税,有的包含退款剔除,有的不包含。不把这些口径差异标出来,后续做数据集成时必然返工。
3.4 核验模板配合双人复核制
清查数据的真实性问题绕不开"谁说了算"。某数据库团队曾经出现过一次典型场景:一个数据负责人把十几张废弃临时表标记为"在用",理由是"可能以后还要用"。这种"舍不得删"的心理在企业里太常见了。
解决思路是双人复核制。第一轮由业务方填写,第二轮由数据平台团队的专职人员对照最近三十天的实际访问日志、调度日志做交叉核验。如果模板里标着"活跃",但是调度和访问记录里完全看不到任何引用,就必须退回重新说明理由。实测下来,这个复核环节能把清单准确率从大概七成拉到接近九成五,而且能明确找出真正需要删的僵尸资产。
4. 清查指令与核验模板如何配合作业
4.1 端到端执行流程
整个清查动作建议拆成六个阶段去推进,一步步来,每一阶段明确责任人:
第一阶段是准备与预沟通。提前拉出数据源清单、连接账号和预期范围,邮件通知各业务线接口人,说明清查目的不是追责而是掌握现状。同时确认只读账号权限,避免清查跑一半才发现权限不足。
第二阶段是基础设施扫描。对目标数据源执行连接探测指令,确认清单里的每个连接串都能通。同时检查数据源本身的版本、字符集、时区设置,这些元数据会影响后续解析。
第三阶段是元数据批量抽取。核心指令就是前面标准模板里的那个scan_table_meta,批量抓取表清单和字段清单。输出为CSV或Parquet,不直接写入中台存储,防止污染目标环境。
第四阶段是存储、血缘与质量探针。等前一步结果稳定后,集中执行存储分析脚本、存储过程依赖扫描脚本和采样质量脚本。三类结果通过"数据源+schema+表名"拼接关联,形成宽表形式的物理资产明细表。
第五阶段是人工核验。把明细表转成Excel核验模板,分发给各业务线接口人,逐表补充业务域、敏感级别、生命周期建议等业务属性。数据平台团队同步启动双人复核,按访问日志与调度日志交叉验证。
第六阶段是分级评审与入库。汇总所有结果生成正式的数据资产盘点报告,划分核心资产、普通资产、待清理资产、待补录资产四个级别,由数据治理委员会确认后,正式录入中台元数据中心。
4.2 排查与风险规避要点
清查工作最怕的不是数据量大,而是现场环境跟模板假设不一致。最常见的四类问题:
- 连接探测失败:最常见的是数据库白名单或防火墙限制了跳板机IP,其次是账号密码到期没通知。建议先人工在命令行测一次连接,成功后再批量执行。
- 视图与存储过程解析不全:不同数据库对依赖的解析方式差别很大,有的只能解析一层。比如A视图引用了B视图,B又引用了C表,部分工具只抓到A→B,B→C断了。需在血缘解析后跑一遍闭合性校验,专门找"有上游关系的孤立节点"。
- 大表统计信息不准:前面说过生产大表不宜全表count,但当表的统计信息严重滞后时(比如很长时间未ANALYZE),估算行数和实际行数可能差出几倍。解决办法是只对统计信息异常的库单独执行采样分析,限定在低峰时段执行。
- 中文注释乱码:老系统的建表注释很多是GBK编码,直接读取会乱。在元数据抓取脚本里统一加字符集转换规则,或者在导出后用Python的encoding_errors参数做兜底修复。
4.3 不同规模系统的参数调整经验
我实测过几类系统,指令集参数需要跟着数据源规模做调整。对数据量可控的传统数仓,百来张表,全量直查没问题。对数据湖或CDP这类平台,表多、文件多、分区多,由于底层元数据的获取方式不一样,需要走文件扫描加目录结构解析的方式,参数重点是并行度和扫描深度。对消息队列类的Topic清查,其实是统计每个Topic的分区数、消息保留时间、最近写入时间,侧重点又不一样。
关键经验是清查工作不要追求一次跑完,分批次按数据源逐个验证,每完成一个再做下一个,能有效降低整体失败风险。某公司在做基于HDFS的数据中台底层架构时,能通过定时调度让批次间互不干扰,这个思路完全可以借鉴到清查流程中来。
5. 实际推行中的常见问题与排查技巧
5.1 问题速查表
下面这个表是我在实际推行中整理出来的,可以直接作为执行参考资料:
| 故障现象 | 可能原因 | 快速验证方法 | 解决方案 |
|---|---|---|---|
| 某些schema扫描为空 | 账号权限只到指定库 | 用账号手工执行show databases,看可见范围 | 向DBA申请只读权限,或在配置文件中显式声明目标schema |
| 表注释大量为空 | 老系统建表时漏了注释 | 抽查最近30天新建的表是否同样没注释 | 以字段命名为线索映射业务含义,在核验模板中做人工标注;后续上线统一约束建表sql要求带comment |
| 存储过程血缘断裂 | 存储过程中动态拼接SQL | 在血缘文件里搜索关键表名出现次数 | 人工按关键字二次检索,补录依赖关系 |
| 记录数估算偏差过大 | 统计信息长期未更新 | 抽查若干表的近似行数与真实抽样行数对比 | 对偏差大的表单独执行低峰期更新统计信息,或缩小采样步长 |
| 质量探针运行超时 | 库上临时负载升高 | 查看数据源侧慢查询日志,确认本任务是否占IO | 调低并行度,错峰执行,每批数据源串行跑 |
| 核验模板填写率低 | 业务方不清楚表中字段含义 | 随机抽几张表,访谈确认是否真的无人认领 | 组织专项答疑会,让DBA演示常用查询方法,并设定业务侧接口人 |
5.2 数据血缘解析的独家经验
血缘解析是最容易出问题也最能体现功力的模块。我踩过比较大的一个坑:老系统里大量存储过程用动态SQL拼接表名——表名是变量,不是字符串常量——导致解析器抓不到依赖。后来加了层模糊匹配,把"疑似依赖"也输出到清单里,哪怕不能百分百确定,至少能触发人工复核。另外,很多ETL任务有历史版本,调度系统只保留了最新版本,解析时只看当前版本就够了。但要注意清理掉已下线或已废弃任务的残留定义,否则血缘图里会混进大量不存在的"幽灵依赖"。
5.3 清查完成后如何保障结果不被冷落
清查成果最大的价值在于后续维护。如果盘完就束之高阁,半年后又回到糊涂账状态。我有两点经验比较实用:一是把清查产物和现有开发流程绑定在一起,比如新表上线时必须过一道"资产登记检查",没填资产编号和业务域就不让进发布流程,从源头保证新资产不缺档;二是设定季度巡检定期执行,重点比对存量清单和当前实际表的差异,把增量、变化量和废弃量分别展示,保持清单的"活水"属性。
另外,清查结果必须纳入元数据中心的统一管理,让后续所有中台组件都从元数据中心读取资产信息,而不是各看各的Excel。这样权限、质量、血缘、生命周期管理才能在一张图上闭环。
6. 实际使用的体会
我现在做中台项目,第一步永远是清查指令加核验模板这套组合拳,比任何开源元数据工具的落地成本都低。进可攻退可守,项目预算充足时能无缝对接商业化产品,紧张时用脚本加表格也能撑起来。一开始做数据仓库规划也是从没梳理过数据资产的混乱状态起步,后来一步步摸索出这套方法论,一句最深的体会就是:宁可清查时多做一次交叉验证,也不要等模型上线前再来返工底层数据问题。顺便说个细节:清查过程中产生的临时文件和过程日志,全部压缩带上日期归档到一个指定目录,半年后你要回溯某个字段当初是怎么确认口径的,翻这个目录比问任何同事都快。