我有一个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() }).
问题不时出现,我认为在将无效记录插入数据库之后。我现在添加了一个记录验证函数来避免这种情况,但问题仍然存在,如何通过删除存储的事务中的无效值来恢复数据库?
答案 0 :(得分:2)
我想知道您的mnesia是否是一个多节点环境,如果是这样,您是否在等待表格上线(可以这么说)并在开始插入之前获得同步?您能否提供有关您的配置的更多信息?此外,这是一直发生还是偶尔发生?