4

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() }).

問題が時々発生します。無効なレコードがデータベースに挿入された後だと思います。これを回避するためにレコード検証機能を追加しましたが、保存されたトランザクションの無効な値を削除してデータベースを回復する方法はまだ残っています。

4

1 に答える 1

2

あなたの mnesia がマルチノード環境であるかどうか疑問に思っていました。もしそうなら、テーブルがオンラインになり (いわば)、テーブルを挿入する前に同期されるのを待っていますか? 構成について詳しく教えてください。また、これは常に発生しますか、それともたまにしか発生しませんか?

于 2012-12-15T00:57:31.830 に答える