Q: Adding nodes to an Mnesia db - the best way?

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Q: Adding nodes to an Mnesia db - the best way?

Bruce Fitzsimons-2
Hi,

I have been playing with adding and deleting nodes on an Mnesia db. Every
single time I manage to stuff it up in some way and have Mnesia dump on me.

All I want to be able to do is to extend the schema onto a remote db, and
then add the tables to the remote db.

There appears to be some omissions from the current docs about the schema -
the R7B-3 code explicitly limits mnesia:add_table_copy to ram_copies for the
schema table. I'm not sure why. Any explanation would be welcome, I am
presuming that there is some dependency issue that caused this design.

Anyway, the code:

rpc:call(Node, mnesia, stop, []),
mnesia:add_table_copy(schema, Node, ram_copies),
io:format("Created Schema (ram copy)"),
    rpc:call(Node, mnesia, start, []),
%% Wait for Mnesia to start up
receive
     _ ->
         true
after 3000 ->
     ok
end,
io:format("Changing schema to disc_copies~n~n"),
mnesia:change_table_copy_type(schema, Node, disc_copies),
io:format("schema changed - adding tables~n"),
mnesia:add_table_copy(worker, Node, disc_copies).

I have a local node with everything and a remote node with nothing. There is
another node, but that was turned off.

I have many weird errors with this code (eg "table schema does not exist"
from the change_table_copy_type), but the final situation I got myself into
was the local node believing that the remote node was sharing the schema,
but the remote node thought that it just had a ram_copies schema of its own.
Very weird. I could not delete the table copy because the remote node
"wasn't active", and I couldn't get the remote node to realise its place in
the world and get the schema copy. A third node that was previously sharing
the schema crashed when I started it because the schemas could not be
merged.

I ended up removing all copies of the database and starting afresh
(create_schema(all_three_nodes)). Its not too big a deal at this stage, but
it would be nice to know the definitive way of doing this - I am envisaging
building a nice screen or two that will let me add/delete nodes at will.

Any hints or suggestions about the correct way to add and remove new nodes
would be appreciated.

Cheers,
Bruce




Reply | Threaded
Open this post in threaded view
|

Q: Adding nodes to an Mnesia db - the best way?

Niclas Eklund-2

Hello!

You do not mention that you start the new node (the one you intend to add)
using extra_db_nodes:

shell> erl -mnesia extra_db_nodes NodeList -name/-sname XX

Might this be your problem?!

/Nick

Example (you can run this from any node in the mnesia-domain):

-define(MyTableList, [person, company, ..]).

add_node(Node, StorageType) when atom(Node), atom(StorageType)  ->
    case rpc:call(Node, mnesia, system_info, [is_running]) of
        {badrpc, Reason} ->
            %% To avoid users doing something they shouldn't ;-)
            exit("Target node not available");
        yes ->
            copy_tables(?MyTableList, Node, StorageType);
        no ->
            exit("Mnesia not started on target node")
    end.

copy_tables([], _, _) ->
    ok;
copy_tables([T|Trest], Node, StorageType) ->
    case mnesia:add_table_copy(T, Node, StorageType) of
        {atomic, ok} ->
            copy_tables(Trest, Node, StorageType);
        _ ->
            exit("Unable to copy table(s).")
    end.




On Fri, 13 Jul 2001, Bruce Fitzsimons wrote:

> Hi,
>
> I have been playing with adding and deleting nodes on an Mnesia db. Every
> single time I manage to stuff it up in some way and have Mnesia dump on me.
>
> All I want to be able to do is to extend the schema onto a remote db, and
> then add the tables to the remote db.
>
> There appears to be some omissions from the current docs about the schema -
> the R7B-3 code explicitly limits mnesia:add_table_copy to ram_copies for the
> schema table. I'm not sure why. Any explanation would be welcome, I am
> presuming that there is some dependency issue that caused this design.
>
> Anyway, the code:
>
> rpc:call(Node, mnesia, stop, []),
> mnesia:add_table_copy(schema, Node, ram_copies),
> io:format("Created Schema (ram copy)"),
>     rpc:call(Node, mnesia, start, []),
> %% Wait for Mnesia to start up
> receive
>      _ ->
>          true
> after 3000 ->
>      ok
> end,
> io:format("Changing schema to disc_copies~n~n"),
> mnesia:change_table_copy_type(schema, Node, disc_copies),
> io:format("schema changed - adding tables~n"),
> mnesia:add_table_copy(worker, Node, disc_copies).
>
> I have a local node with everything and a remote node with nothing. There is
> another node, but that was turned off.
>
> I have many weird errors with this code (eg "table schema does not exist"
> from the change_table_copy_type), but the final situation I got myself into
> was the local node believing that the remote node was sharing the schema,
> but the remote node thought that it just had a ram_copies schema of its own.
> Very weird. I could not delete the table copy because the remote node
> "wasn't active", and I couldn't get the remote node to realise its place in
> the world and get the schema copy. A third node that was previously sharing
> the schema crashed when I started it because the schemas could not be
> merged.
>
> I ended up removing all copies of the database and starting afresh
> (create_schema(all_three_nodes)). Its not too big a deal at this stage, but
> it would be nice to know the definitive way of doing this - I am envisaging
> building a nice screen or two that will let me add/delete nodes at will.
>
> Any hints or suggestions about the correct way to add and remove new nodes
> would be appreciated.
>
> Cheers,
> Bruce
>