2010-09-14 15 views
13

Tengo algunas tablas grandes con disc_only_copies tipo. Ahora necesito cambiar el nombre del nodo corto a largo pero no puedo hacerlo con limitación de RAM ...cómo hacer una copia de seguridad/restaurar solo una sola tabla de/a mnesia?

¿Puedo usar la base de datos de respaldo/restauración parcialmente (tabla por tabla)?

+0

He resuelto mi problema mediante la manipulación de schema.DAT. Lo abro con el módulo dets y hago algún reemplazo. Es la forma más rápida de migrar de un nodo a otro. – vinnitu

+2

¿Puedes publicar una respuesta y aceptarla? Esta pregunta tiene suficientes votos ascendentes que no quiero eliminar, pero probablemente tampoco debería aparecer en la lista Sin respuesta. Gracias. –

Respuesta

0
-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('[email protected]') -> 
      '[email protected]'; 
    change_node('[email protected]') -> 
      '[email protected]'; 
    change_node(Node) -> 
      Node. 

    handle_nodes(Nodes) -> 
      lists:map(fun(Node) -> 
        change_node(Node) 
      end, Nodes -- [[email protected], [email protected]]). 

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

    handle_version_value([]) -> 
      []; 
    handle_version_value({'[email protected]', _}) -> 
      []; 
    handle_version_value({'[email protected]', _}) -> 
      []; 
    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)). 
+0

me ayuda en mi caso – vinnitu

Cuestiones relacionadas