手动上树对象所有持久化类属性全被持久化

// 此模板仅供参考,如果不适用可以修改

问题描述

最新代码没有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、内存等]

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

删除数据库表后,重启BMC,查询表无任何数据

[您希望实现什么]

实际结果

删除表后重启,所有持久化类属性全被持久化

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

分析结论

[详细总结您对此问题的分析结论]

答案内容由AI生成,仅供参考:

结论与建议

核心原因:您删除持久化数据库表后重启 BMC,数据重新出现是由以下因素之一(或组合)导致:

  • 系统自动从备份数据库恢复了数据(主数据库丢失触发备份恢复);
  • 持久化类型配置为 PoweroffPerRetain,其数据在对象删除后仍被保留;
  • ORM 对象管理器在初始化时自动从持久化存储加载了数据并重建表。

期望结果(删除表后重启无数据)未能达到,是因为持久化机制设计了多重数据保护(备份、永久保留型持久化、自动填充),单纯删除主数据库表不足以彻底清除数据。

建议的排查方向(基于 Context 信息):

  1. 检查 usagetableType 字段是否包含 PoweroffPerRetain,如果是,请改用 PoweroffPer(不保留对象删除后的数据)或根据需求调整;
  2. 检查备份数据库路径(通常 /data/trust/persistence/ 下有 .backupbackup/ 目录),确认数据是否从此处恢复;
  3. 若使用 mc.orm.object_manage.new(db, bus, true),可尝试将第三个参数改为 false,观察是否仍会自动持久化;
  4. 如需完全清除数据,建议同时删除主数据库和备份数据库文件,或使用持久化服务提供的接口(如 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 是一种持久化类型,在掉电和对象删除后都保持数据。”

如果您的属性或表的 usagetableType 字段被配置为 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 信息):

  1. 检查 usagetableType 字段是否包含 PoweroffPerRetain,如果是,请改用 PoweroffPer(不保留对象删除后的数据)或根据需求调整;
  2. 检查备份数据库路径(通常 /data/trust/persistence/ 下有 .backupbackup/ 目录),确认数据是否从此处恢复;
  3. 若使用 mc.orm.object_manage.new(db, bus, true),可尝试将第三个参数改为 false,观察是否仍会自动持久化;
  4. 如需完全清除数据,建议同时删除主数据库和备份数据库文件,或使用持久化服务提供的接口(如 mdbctl)进行数据清理,而非直接操作 SQLite 文件。