tags:

views:

666

answers:

2

Hello,

I'm an erlang and mnesia newbie..

How do I add a new disc_only_copies node to an mnesia database that already has a schema?

Thanks

+10  A: 

Start your new node (b@node) erl -sname b -mnesia dir '"/path/to/storage"' -s mnesia. This starts a new ram_copes node called b@node.

On your original node (a@node), at the erlang prompt execute mnesia:change_config(extra_db_nodes, ['b@node']). This will cause the original node to connect b to the mnesia cluster. At this point, b@node has joined the cluster but only has a copy of the schema.

To make new the node b@node capable of storing disc copies, we need to change the schema table type on b@node from ram_copies to disc_copies. Run mnesia:change_table_copy_type(schema, 'b@node', disc_copies). on any node.

b@node only has a copy of the schema at this point. To copy all the tables from a@node to b@node and maintain table types, you can run:

[{Tb, mnesia:add_table_copy(Tb, node(), Type)}
 || {Tb, [{'a@node', Type}]} <- [{T, mnesia:table_info(T, where_to_commit)}
                               || T <- mnesia:system_info(tables)]].

This command may take a while to execute as it will copy the contents of each table over the network.

b@node is now an exact replica of a@node. You could modify that statement - replace the Type variable with disc_only_copies in the call to mnesia:add_table_copy/3 in order to copy the tables but ensure they're on disc only.

The mnesia documentation explains how to use the functions I've shown here.

archaelus
maybe you known answer for this question http://stackoverflow.com/questions/3702201/remove-not-exist-already-node-from-mnesia-clusterscheme
vinnitu