删除挂起的Mnesia交易



我有一个Mnesia数据库,当我重新启动应用程序时,我在挂起的事务中收到一个错误(badarg)。我认为即将插入一个无效值。如何检查挂起的事务以查找坏值,以及如何在不删除整个数据库的情况下从挂起的交易中删除该值。

更新:

故障报告如下:

{badarg, [{ets, insert, [{image_db...}, {image_db...}...]

其中image_db是插入数据库的结构体。不幸的是,要插入的项目列表太长了,以至于我看不到损坏的值。

命令mnesia:info()在启动时显示1个中止的事务。

更新2:

如何读取mnesia db目录中的二进制日志文件?

更新3:

这是一个本地单节点Mnesia表。我这样初始化它:

mnesia:stop(),
catch(mnesia:create_schema([node()])),
mnesia:start(),
timer:sleep(1000), % vital but ugly as hell
mnesia:create_table(?DBNAME, [{disc_copies, [node()]}, {type, ordered_set},
{attributes, record_info(fields, image_db)}]),
mnesia:wait_for_tables(?DBNAME, 1000),

其中image_db记录如下所示:

-type now_time() :: {integer(), integer(), integer() }.
-record(image_db, {time :: now_time(),
path :: string(),
size :: integer() }).

我认为,在数据库中插入一条无效记录后,问题会不时出现。我现在添加了一个记录验证功能来避免这种情况,但问题仍然存在,如何通过删除存储事务中的无效值来恢复数据库?

我想知道您的mnesia是否是一个多节点环境,如果是,您是否正在等待表上线(可以说)并同步后再开始插入它们?你能给我们更多关于你的配置的信息吗。此外,这种情况是一直发生还是偶尔发生?

最新更新