警告:背景信息相当长。如果您认为在背景信息之前需要该问题,请跳至底部。欣赏这将要花费的时间!什么是备份/恢复mnesia数据库的正确方法?
我一直在网络上(读谷歌),我还没有找到一个很好的答案。是的,在erlang.org网站上有很多链接和对Mnesia文档的参考,但即使这些链接也受版本限制。
因此,在最简单的情况下,您当前连接到的节点()与表集的所有者相同,则备份/恢复将工作。例如:
$ erl -sname mydatabase
> mnesia:start().
> mnesia:create_schema(...).
> mnesia:create_table(...).
> mnesia:backup("/tmp/backup.bup").
> mnesia:restore("/tmp/backup.bup", [{default_op, recreate_tables}]).
嘿,这个作品很棒!
但是,如果数据库实际上是一个远程节点()或远程节点()上的远程对接上运行,那么你必须启动备份这样:
$ erl -sname mydbadmin
> rpc:call([email protected], mnesia, backup, ["/tmp/backup.bup"]).
> rpc:call([email protected], mnesia, restore, ["/tmp/backup.bup", [{default_op, recreate_tables}]]).
当然,这很简单太。现在,这里是棘手的事情......
- 假设你正在采取每日备份。而你mnesia数据库服务器死亡,你不得不更换硬件。如果您想按原样还原数据库,则需要使用与之前相同的名称命名NEW硬件,并且还需要命名相同的节点。
- 如果要更改硬件和/或节点的名称()...或者要在其他计算机上恢复,则需要执行node_change过程。 (描述here和mnesia文档)
但是,这里是事情变得复杂的地方。虽然我的熟人,erlang和mnesia的专家建议mnesia的复制是严重的缺陷,并且你不应该使用它(目前我没有选择,我知道你有什么机会实现更好的版本;不是可能)
因此,您有两个节点()复制基于RAM和光盘的表。您一直在使用默认的BackupMod维护一个使用标准备份定期备份数据库的策略。有一天,一位经理要求您验证备份。只有当你试图恢复数据库您可以:
{atomic,[]}
而且根据文档,这意味着没有错误...,但没有表被恢复。
不想运行change_node过程,您应该记住node()和hostname必须匹配,以便更改主机名和-sname参数以匹配备份数据的计算机。而这一次你会得到一个奇怪的错误:
{aborted,{'EXIT',{aborted,{bad_commit,{missing_lock,[email protected]}}}}}
还没想运行change_node过程我很快恢复克隆我的服务器,这样我有两个类似的机器。然后我适当地命名以匹配生产服务器。我开始恢复过程。找到了!我现在在恢复服务器上有真实的工作数据。
我想说,这是路的尽头......但我还没有问过一个问题,所以......这么说呢?
问题:如果我要恢复这是从复制的Mnesia节点的集群进行的备份,我怎么修改文件(类似于change_node程序),从而使其它节点要么被忽略或删除备份?
问略有不同:如何还原复制的多节点()Mnesia的数据库中的单个节点上()?
也应该看到http://stackoverflow.com/questions/463400/how-to-rename-the-node-running-a-mnesia-database。 – 2013-10-09 17:32:31