我有一个Mnesia数据库,当我重新启动我的应用程序时,我会在挂起的事务中得到一个错误(badarg)。我认为一个无效的值即将被插入。如何检查挂起的事务以查找坏值是什么,以及如何在不删除整个数据库的情况下从挂起的事务中删除该值。
更新:
坠机报告如下:
{badarg, [{ets, insert, [{image_db...}, {image_db...}...]其中image_db是我的结构,被插入到数据库中。不巧的是,要插入的项目列表太长了,所以我没有看到损坏的值。
命令mnesia:info()在启动时向我显示了一个中止的事务。
更新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() }).这个问题不时地出现,我认为在一个无效的记录被插入到数据库之后。为了避免这种情况,我现在添加了一个记录验证函数,但问题仍然存在,如何通过删除存储事务中的无效值来恢复数据库?
发布于 2012-12-15 00:57:31
我想知道您的mnesia是否是一个多节点环境,如果是的话,您是否在等待表在线(可以说是这样)并在开始插入它们之前进行同步?你能给我们更多关于你的配置的信息吗?而且,这种情况是经常发生的还是偶尔发生的?
https://stackoverflow.com/questions/13817288
复制相似问题