erlang - 如何仅从/向 mnesia 备份/恢复单个表?

标签 erlang mnesia

我有一些带有 disc_only_copies 类型的大表。
现在我需要将短节点名称更改为长节点名称,但无法在 RAM 限制下进行...

我可以部分使用备份/恢复数据库吗(逐表)?

最佳答案

    -module(test).
    -compile(export_all).

    -record(tab, {first, second}).

    do() ->
            mnesia:create_schema([node()]),
            mnesia:start(),
            mnesia:create_table(tab, [{disc_copies, [node()]}, {attributes, record_info(fields, tab)}]),
            mnesia:dirty_write({tab, 1, 2}),
            mnesia:dirty_write({tab, a, b}),
            mnesia:stop().

    change_node('extra@localhost') ->
            'extra@example.com';
    change_node('ejabberd@localhost') ->
            'ejabberd@example.com';
    change_node(Node) ->
            Node.

    handle_nodes(Nodes) ->
            lists:map(fun(Node) ->
                    change_node(Node)
            end, Nodes -- [one@badhost, extra@badhost]).

    handle_cookie({TS, Node}) ->
            {TS, change_node(Node)}.

    handle_version_value([]) ->
            [];
    handle_version_value({'one@badhost', _}) ->
            [];
    handle_version_value({'extra@badhost', _}) ->
            [];
    handle_version_value({Node, TS}) ->
            {change_node(Node), TS}.

    handle_version({Key, Value}) ->
            {Key, handle_version_value(Value)}.

    handle_def(Def) ->
            lists:map(fun({Key, Value} = Property) ->
                    case Key of
                    ram_copies ->
                            {Key, handle_nodes(Value)};
                    disc_copies ->
                            {Key, handle_nodes(Value)};
                    disc_only_copies ->
                            {Key, handle_nodes(Value)};
                    cookie ->
                            {Key, handle_cookie(Value)};
                    version ->
                            {Key, handle_version(Value)};
                    _ ->
                            Property
                    end

        end, Def).

go() ->
        {ok, N} = dets:open_file(schema, [{file, "./schema.DAT"},{repair,false}, {keypos, 2}]),
        do2(N),
        dets:sync(N),
        dets:close(N).

do2(N) ->
        do2(N, dets:first(N)).

do2(_N, '$end_of_table') ->
        ok;
do2(N, Key) ->
        io:format("process: ~p~n", [Key]),
        [{N, Tab, Def}] = dets:lookup(N, Key),
        NewDef = handle_def(Def),
        dets:insert(N, {N, Tab, NewDef}),
%       file:write_file("schema.txt", io_lib:format("~p~n", [{N, Tab, NewDef}]), [append]),
        do2(N, dets:next(N, Key)).

关于erlang - 如何仅从/向 mnesia 备份/恢复单个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3709051/

相关文章:

null - 是否有 erlang null 语句

erlang - 使用 Erlang 解析 HTML

erlang - 从 mnesia 集群中删除 not_exist_already 节点(方案)

database - 应用程序启动时,Mnesia disc_copies 表如何存储在 ram 中?

select - Erlang Mnesia 是否在 ordered_set 上选择以 Erlang Term 顺序给出列表?

erlang - 运行 rebar eunit 时将运行时参数传递给 erlang

utf-8 - Erlang utf-8 十六进制转十进制

erlang - Erlang 示例中的安全使用

erlang - Mnesia - 指定存储策略时因 bad_type 中止

erlang - 使用 gen_server 封装一个 mnesia 表?