警告:背景情報はかなり長いです。背景情報の前に質問が必要だと思われる場合は、一番下までスキップしてください。これにかかる時間を感謝します!
私はウェブのいたるところにいて(グーグルを読んで)、良い答えを見つけられませんでした。はい、erlang.orgサイトにはMnesiaのドキュメントへのリンクや参照がたくさんありますが、それらのリンクでさえバージョン炎に悩まされています。
したがって、現在接続しているnode()がテーブルセットの所有者と同じである最も単純なケースでは、バックアップ/復元が機能します。例えば:
$ erl -sname mydatabase
> mnesia:start().
> mnesia:create_schema(...).
> mnesia:create_table(...).
> mnesia:backup("/tmp/backup.bup").
> mnesia:restore("/tmp/backup.bup", [{default_op, recreate_tables}]).
ねえ、これはうまくいきます!
ただし、データベースが実際にリモートノード()またはリモートメイティングのリモートノード()で実行されている場合は、次の方法でバックアップを開始する必要があります。
$ erl -sname mydbadmin
> rpc:call(mydatabase@host, mnesia, backup, ["/tmp/backup.bup"]).
> rpc:call(mydatabase@host, mnesia, restore, ["/tmp/backup.bup", [{default_op, recreate_tables}]]).
もちろん、これも簡単でした。今ここにトリッキーなものがあります....
- 毎日バックアップを取っているとしましょう。そして、mnesiaデータベースサーバーが停止し、ハードウェアの交換を余儀なくされます。DBをそのまま復元する場合は、新しいハードウェアに以前と同じ名前を付ける必要があります。また、ノードにも同じ名前を付ける必要があります。
- ハードウェアやnode()の名前を変更したい場合、または別のマシンで復元したい場合は、node_changeプロセスを実行する必要があります。(こことmnesiaドキュメントで説明されています)
しかし、ここで物事は複雑になります。erlangとmnesiaの専門家である私の知人は、mnesiaの複製には重大な欠陥があり、使用すべきではないと示唆しています(現在、私が知っている代替手段はなく、より良いバージョンを実装する可能性はありますが、そうではありません。おそらく)
したがって、RAMおよびディスクベースのテーブルを複製している2つのnodes()があります。デフォルトのBackupModを使用して、データベースを標準バックアップで定期的にバックアップするというポリシーを維持しています。そしてある日、マネージャーがバックアップを確認するように依頼します。データベースを復元しようとした場合にのみ、次のようになります。
{atomic,[]}
そして、ドキュメントによると、これはエラーがなかったことを意味します...それでもテーブルは復元されませんでした。
change_nodeプロシージャを実行したくない場合は、node()とホスト名が一致する必要があるため、データがバックアップされたマシンと一致するようにホスト名と-snameパラメータを変更することを覚えておいてください。ただし、今回は奇妙なエラーが発生します。
{aborted,{'EXIT',{aborted,{bad_commit,{missing_lock,mydatabase@otherhost}}}}}
それでもchange_nodeプロシージャを実行したくないので、サーバーをすばやくクローン復元して、2台の同様のマシンを使用します。次に、本番サーバーに合わせて適切な名前を付けます。そして、復元プロセスを開始します。ユーレカ!これで、復元サーバーに実際の作業データがあります。
これで道のりは終わりだと言いたいのですが…まだ質問はしていませんし、SOのポイントは……だからここにあるのでしょうか?
質問:複製されたMnesiaノードのクラスターから取得したバックアップを復元する場合、他のノードが無視されるかバックアップから削除されるようにファイルを変更するにはどうすればよいですか(change_nodeプロシージャと同様)。
少し違った質問:単一のnode()でレプリケートされたmulti-node()mnesiaデータベースを復元するにはどうすればよいですか?