Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add a node to an mnesia cluster?

Tags:

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

like image 819
Luca Martinetti Avatar asked Apr 24 '09 22:04

Luca Martinetti


1 Answers

Start your new node (b@node) erl -sname b -mnesia dir '"/path/to/storage"' -s mnesia. This starts a new ram_copies 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.

like image 86
archaelus Avatar answered Sep 30 '22 12:09

archaelus