【问题标题】:how to backup/restore only single table from/to mnesia?如何仅从/向 mnesia 备份/恢复单个表?
【发布时间】:2011-04-12 03:56:08
【问题描述】:

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

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

【问题讨论】:

  • 我通过操作 schema.DAT 解决了我的问题。我用 dets 模块打开它并进行一些替换。这是从节点迁移到节点的最快方法。
  • 你能发布一个答案并接受它吗?这个问题有足够多的赞成票,我不想删除它,但它可能也不应该出现在未回答列表中。谢谢。

标签: erlang mnesia


【解决方案1】:
    -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)).

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多