元数据升级失败怎么办?排查指南速看!
小编有话说
MC(租户管理中心)是管理苍穹系统不可或缺的工具,其中有一项重要功能是对苍穹系统的升级部署,从补丁官网下载标准补丁包后,运维人员可以使用它一键完成系统的更新升级,也可通过CI/CD流水线工具自动化部署升级。
苍穹系统的升级主要包括集群静态资源及微服务JAR包的更新、数据中心升级脚本及元数据的部署。每一个环节都必不可少,需要保证升级的准确性。
JAR包升级通常比较顺利,而元数据升级因其部署的复杂性,偶尔会遇到升级失败的情况。当JAR和元数据未同步升级时,会使系统环境中断,整体升级失败。
那遇到元数据升级失败的情况,该如何排查问题呢?本期文章就以小P为例,为大家演示这类问题的排查方法~
1 案例背景
小P在开发环境修改了一个元数据,调整了按钮区的高度后,预期效果应该如下图所示:
图1-调整了按钮区的适合高度
于是提交SVN或Git、启动构建更新测试环境,预览的效果却是下图,按钮区的高度明显大于预期...
图2-更新环境后的预览效果
为了查明具体原因,小P展开了一系列的排查。
2 排查步骤和方法
问题一:元数据没升级成功!升级工具有问题?
苍穹元数据分为设计时元数据和运行时元数据,升级包含设计时部署、运行时重建两个过程。
首先,我们来检查设计时元数据的效果,判断是哪个环节出错,先分别从开发环境和测试环境效果着手。
开发环境的内容区面板设置高度384px,测试环境的内容区面板无高度设置,可以判断,在部署设计时元数据时已发生异常。如下图:
图3-开发环境效果
图4-测试环境效果
接下来,需要找到对应的升级日志,检查这个元数据有没有被更新升级过。检查方法如下:
查找日志并搜索元数据文件
每个环境有独立的升级日志访问地址,找到对应的环境获取对应的升级包,点击进入查看日志,点击“查看详情”查看详细日志,并搜索有问题的元数据数据文件。
图5-查看日志详情并搜索元数据文件
查看是否有 finish字样,或者报错信息
1. 如果有报错,说明元数据没有部署成功,这时通常需要检查提交到SVN上的元数据是否规范完整。
2. 如果有finish字样说明元数据文件确实已经部署过了。
这里搜索的情况是元数据显示finish。日志显示finish代表文件成功升级了。
问题二:文件成功升级了,但是结果不对,是不是升级工具有问题?
苍穹的元数据升级基于元数据文件中的版本号差异,如果版本号和当前环境的元数据一致,则不会被升级。针对这个问题,需要检查元数据版本号的数据,可通过查看dm包中元数据的版本号与数据库中的元数据版本号进行比对,具体步骤如下:
首先,下载并查看dm包中元数据的版本号。
把日志详情中的滚动条拖到最上面,日志中有该dm包的下载地址,下载解压下来,找到问题元数据文件用文本编辑工具打开,找到标签内容。
图6-日志中的dm包的下载地址
然后,比对数据库中的元数据版本号。
在【系统管理】→【查询分析器】中选择元数据库(如果没有元数据库则选择系统库)查询当前环境数据库元数据的版本号进行比对。相关命令如下:
select fversion from t_meta_formdesign where fnumber ='元数据编';
图7-比对数据库中的元数据版本号
结果,发现版本不一致!而且数据库中元数据的创建时间还比较新,那应该确实更新过。出于对DB的信任,小P依然倔强。
问题三:会不会是多份ID相同的元数据先后升级互相覆盖了呢?
元数据的更新机制是通过元数据id进行内容替换,想到开发中常见的ABA问题,会不会是多份ID相同的元数据先后升级互相覆盖了呢?根据这个思考,小P进一步检查。
搜索整个补丁包发现,确实有两个一模一样的元数据文件分别在不同的应用下。一个在ide应用下,一个在frame应用下。进一步查看datamode.xml,发现ide在frame的后面,ide中的元数据覆盖了frame下的这个元数据。
图8-不同应用下的两个一样的元数据文件
图9-查看datamode.xml文件
问题四:“这咋提交了两个一样的元数据到SVN呢”
小P一看提交记录顿时懊悔不已,原来是之前自己ide提交错了这个文件,而这次新的修改放在了frame下,导致环境中元数据更新后被ide中旧的元数据覆盖了。
3 相关资料
关于更多元数据特性,可查看下方社区文章:
4 划重点
1. 当升级日志中出现“{元数据文件名称}+ 版本一致,不再更新!”的提示时,可以按照上面比较版本的方式进行版本检查:
1) 如果文件中的版本号和数据库中的版本号都是旧的,说明Appstore仓库中的dm包是旧的,元数据文件未更新;
2) 如果文件中的版本号和数据库中的版本号都是新的,则说明当前元数据已经更到最新,应该在上一次或者前几次升级中执行过了;
3) 如果文件中的版本号是新的,数据库中的版本号是旧的,Appstore的地址是固定的,但里面的内容随时都可能更新,可能是升级执行时,元数据文件是旧的并且跟数据库中的版本号一致没有执行更新,而现在Appstore里的dm包内容已经更新,这时只要再执行一次升级即可。
2. 排查是否多份元数据互相覆盖问题,可以按以下方式确认:
1) 可以在整个补丁包中进行元数据编码检索,是否有多份元数据文件;
2) 可以将补丁包解压用元数据ID进行全局检索,是否有多份元数据文件。这种方式是比较准确的,因为可能存在ID一致,而编码不一致的情况,直接搜索编码可能检索不到;
3) 可以在升级日志中逐个搜索dm中的日志,检索元数据编码,是否有多次元数据的finish。
3. 同一个dm包中的应用升级是有顺序的,按dm包中datamodel目录下的datamodel.xml中配置的顺序执行。
4. 当升级日志显示元数据为finish时,仅代表当前元数据文件内容已成功写入库中(设计时元数据表),如果同一个元数据有多次更新,最后那次更新将覆盖之前的更新内容,环境运行的内容以最后修改更新的元数据内容为准。
5. 类似问题:升级日志中明明显示finish了,系统运行时却报错“xxx元数据不存在”,这种情况通常是有一份ID跟当前元数据一致,而编码不一致的元数据存在。可以用当前报错的元数据ID去查库验证一下,选择【元数据库】,执行以下SQL:检查元数据的编码是否跟当前报错的元数据编码一致。
SELECT FID,FNUMBER FROM T_META_FORMDESIGN WHERE FID = 'xxx元数据的ID';
#往期推荐#
更多精彩内容,“码”上了解!↓
元数据升级失败怎么办?排查指南速看!
本文2024-09-23 01:14:22发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144671.html