AweiHe
(Hkzy_hewei)
1
// 此模板仅供参考,如果不适用可以修改
问题描述
最新代码没有mc:add_object,然后发现设置持久化属性后,数据表未创建
所以按照以下写法,发现所有持久化类属性全被持久化了
掉电持久化属性一共有5个,删除表后重启,再查还是5个
local c_object_manage = require ‘mc.orm.object_manage’
self.object_manage = c_object_manage.new(self.db, self.bus, true)
[在这里详细描述您遇到的问题]
环境信息
-
操作系统:如 Ubuntu 24.04
-
软件版本:OpenUBMC2606
-
硬件配置:[如 CPU、内存等]
重现步骤
-
[第一步]
-
[第二步]
-
[第三步]
期望结果
删除数据库表后,重启BMC,查询表无任何数据
[您希望实现什么]
实际结果
删除表后重启,所有持久化类属性全被持久化
[实际发生了什么,包含错误信息]
尝试过的解决方案
[列出您已经尝试过的解决方案及结果]
分析结论
[详细总结您对此问题的分析结论]
答案内容由AI生成,仅供参考:
结论与建议
核心原因:您删除持久化数据库表后重启 BMC,数据重新出现是由以下因素之一(或组合)导致:
- 系统自动从备份数据库恢复了数据(主数据库丢失触发备份恢复);
- 持久化类型配置为
PoweroffPerRetain,其数据在对象删除后仍被保留;
- ORM 对象管理器在初始化时自动从持久化存储加载了数据并重建表。
期望结果(删除表后重启无数据)未能达到,是因为持久化机制设计了多重数据保护(备份、永久保留型持久化、自动填充),单纯删除主数据库表不足以彻底清除数据。
建议的排查方向(基于 Context 信息):
- 检查
usage 或 tableType 字段是否包含 PoweroffPerRetain,如果是,请改用 PoweroffPer(不保留对象删除后的数据)或根据需求调整;
- 检查备份数据库路径(通常
/data/trust/persistence/ 下有 .backup 或 backup/ 目录),确认数据是否从此处恢复;
- 若使用
mc.orm.object_manage.new(db, bus, true),可尝试将第三个参数改为 false,观察是否仍会自动持久化;
- 如需完全清除数据,建议同时删除主数据库和备份数据库文件,或使用持久化服务提供的接口(如
mdbctl)进行数据清理,而非直接操作 SQLite 文件。
点击此处查看详细分析解答
问题分析
根据您描述的问题(手动上树对象后,删除持久化数据库表并重启 BMC,所有掉电持久化类属性仍然存在),结合提供的 Context 信息,可以分析出以下可能原因:
1. 主数据库删除后触发了备份恢复机制
在持久化服务的设计中,当主数据库损坏或丢失时,系统会自动从备份数据库中恢复数据。这是保证数据可靠性的核心机制。
相关上下文(来自文档块 2):
“在持久化服务侧,只有一种场景会导致业务持久化数据发生变化:主数据库损坏或者丢失时,从备份数据库恢复。”
您使用 SQLite 命令直接删除持久化数据库表(例如 per_poweroff.db),系统在重启时可能将该操作视为主数据库丢失,进而自动从备份数据库(如 /data/trust/persistence/backup/ 下的文件)恢复原始数据。因此,即使您删除了表,重启后持久化服务仍会将备份数据重新写入,导致所有掉电持久化属性再次出现。
2. 持久化类型为 PoweroffPerRetain 导致数据在对象删除后依然保留
PoweroffPerRetain 是一种特殊的持久化类型,它不仅保证数据在掉电后不丢失,还确保数据在对象被删除后仍然保留,直到显式清除。
相关上下文(来自知识图谱):
- “PoweroffPerRetain ensures data survives power-off and object deletion.”
- “PoweroffPerRetain 是一种持久化类型,在掉电和对象删除后都保持数据。”
如果您的属性或表的 usage 或 tableType 字段被配置为 PoweroffPerRetain,那么即使您通过 ORM 对象管理机制卸载或删除对象,持久化数据仍然存在于数据库文件中。您删除表后重启,由于该类型数据不被对象生命周期影响,框架会重新创建表并从持久化存储中加载数据,导致 5 个属性依然存在。
3. 使用 mc.orm.object_manage.new(db, bus, true) 的第三个参数可能启用了自动持久化
您提供的代码中 .new(self.db, self.bus, true) 的第三个参数为 true。虽然 Context 中没有直接说明该参数的具体含义,但结合 ORM 机制的常见设计,该参数可能用于开启自动创建表、自动持久化属性等行为。这可能会导致框架在对象手动上树时,自动将类定义中的所有持久化类属性写入数据库,即使您没有主动调用 save 操作。
相关上下文(来自搜索结果 4):
“CSR自动上树,通过 mc.mdb.object_manage 进行管理,整表本地或远程掉电持久化,数据库中的第一份数据是需要组件save去填充,还是框架自动会填充进去。”
这说明框架有能力自动填充持久化数据。
结论与建议
核心原因:您删除持久化数据库表后重启 BMC,数据重新出现是由以下因素之一(或组合)导致:
- 系统自动从备份数据库恢复了数据(主数据库丢失触发备份恢复);
- 持久化类型配置为
PoweroffPerRetain,其数据在对象删除后仍被保留;
- ORM 对象管理器在初始化时自动从持久化存储加载了数据并重建表。
期望结果(删除表后重启无数据)未能达到,是因为持久化机制设计了多重数据保护(备份、永久保留型持久化、自动填充),单纯删除主数据库表不足以彻底清除数据。
建议的排查方向(基于 Context 信息):
- 检查
usage 或 tableType 字段是否包含 PoweroffPerRetain,如果是,请改用 PoweroffPer(不保留对象删除后的数据)或根据需求调整;
- 检查备份数据库路径(通常
/data/trust/persistence/ 下有 .backup 或 backup/ 目录),确认数据是否从此处恢复;
- 若使用
mc.orm.object_manage.new(db, bus, true),可尝试将第三个参数改为 false,观察是否仍会自动持久化;
- 如需完全清除数据,建议同时删除主数据库和备份数据库文件,或使用持久化服务提供的接口(如
mdbctl)进行数据清理,而非直接操作 SQLite 文件。