24

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

Luca Martinetti
  • 3,396
  • 6
  • 34
  • 49

1 Answers1

49

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.

Lyn Headley
  • 11,368
  • 3
  • 33
  • 35
archaelus
  • 7,109
  • 26
  • 37
  • maybe you known answer for this question http://stackoverflow.com/questions/3702201/remove-not-exist-already-node-from-mnesia-clusterscheme – vinnitu Sep 13 '10 at 19:27
  • Don't suppose you know the answer to this similarly-related question? http://stackoverflow.com/questions/13398632/creating-mnesia-disk-copies-of-existing-ram-table – intrigued_66 Nov 16 '12 at 09:25