私はrebar3を使用してリリースを作成していますが、運用時にmnesiaを初期化するにはどうすればよいですか?生産上のmnesiaをどのように初期化しますか?
mnesia:create_schema([node()])
を実行する「インストール」エスケープを書くと、リリースで使用されているノード名とは全く異なるノード名が使用されます。
私はで私のアプリケーションを起動するときに生産mnesiaが "myapp @ localhost"ノードにアクセスしようとしている間、 "nonode @ nonode"のスキーマを作成することになります。
また、それは鶏と卵の問題のようなものがある:私は
- (アプリと同じ名前の
node()
が使用されます)。
これを処理する良い方法がある場合は、単に放浪していますか?
#!/usr/bin/env escript
%% -*- erlang -*-
%%! -smp enable ls-mnesia debug verbose
-include("../include/rr.hrl").
main(_) ->
application:set_env(mnesia, dir, "/usr/local/src/db/mnesia"),
application:stop(mnesia),
install([node()|nodes()]).
install(Nodes) ->
case mnesia:create_schema(Nodes) of
ok ->
rpc:multicall(Nodes, application, start, [mnesia]),
read_store_create_tables(Nodes),
event_store_create_tables(Nodes),
rpc:multicall(Nodes, application, stop, [mnesia]);
Err ->
error_logger:warning_msg("Could not create schema: ~p~n", [Err]),
Err
end.
event_store_create_tables(Nodes) ->
{_, ok} = mnesia:create_table(rr_events,
[{attributes, record_info(fields, rr_events)},
{disc_copies, Nodes},
{type, bag}]).
read_store_create_tables(Nodes) ->
% Initialize the actual data-tables for the projections
{_, ok} = mnesia:create_table(rr_competencies,
[{attributes, record_info(fields, rr_competencies)},
{disc_copies, Nodes}]).
がP.S:私はリリースを構築するためにrelx
を使用していますrebar3
を使用しています:ここで
は私の私が独立して実行escriptをインストールしています。
しかし、このすべての自動化ビルドスクリプト(つまり、有能なもの)をどのように扱うのですか?問題は、開始されるとアプリがスクリプトのようではなく、サービスとして実行されるため、アプリはいつアプリケーションがデータベースを初期化するかを知らないということです。 (うわー、これは想像以上に複雑です) – drozzy
この答えをチェックしてください( 'init:stop()'を検索してください):http://stackoverflow.com/questions/36359040/idiomatic-way-to-ship-コマンドラインツールで書かれたerlang/36362156#36362156次にこの関数:https://github.com/yoonka/builderl/blob/master/src/bld_init.erl#L902基本的に2つのErlangインスタンスがあります。 '。/ bin/init.esh'を実行すると、' builderl'はそれ自身のVMで動作します。その後、 'cmd'リリースを使ってインストールされたVMを起動し、それを設定してからシャットダウンします。何か問題が生じた場合は、コード '1'を返します。 'builderl'が終了すると、戻りコードは' make'や他のスクリプトによって検査されます。 – Amiramix