分布式rebar3应用Mnesia同步遇inconsistent_database错误求助
解决Mnesia节点同步的
inconsistent_database错误 第一步:彻底统一节点Cookie
Cookie是Erlang节点通信的核心验证机制,细微差异会直接导致节点无法正常协作:
- 在两个节点的Erlang shell中执行
erlang:get_cookie().,输出的原子值必须完全一致(包括大小写、特殊字符、无多余空格) - 临时修正:在不一致的节点执行
erlang:set_cookie(node(), '你的目标Cookie').(注意Cookie是原子类型,需用单引号包裹) - 永久生效:在rebar3应用的
vm.args文件中添加-setcookie 你的目标Cookie,确保两个节点启动参数完全相同
第二步:修复网络分区并重新同步Mnesia
- 先停止从节点(node2@pc2)的Mnesia服务:
mnesia:stop(). - 验证节点连通性:在主节点(node1@pc1)执行
net_adm:ping('node2@pc2').,必须返回pong(若返回pang,先排查防火墙、hostname解析问题) - 启动从节点Mnesia并同步:
- 在主节点执行,将从节点加入集群:
mnesia:change_config(extra_db_nodes, ['node2@pc2']). - 在从节点执行,设置schema的副本类型(按需选择
disc_copies磁盘备份或ram_copies内存备份):mnesia:change_table_copy_type(schema, node(), disc_copies). - 等待所有表同步完成:
mnesia:wait_for_tables(mnesia:system_info(tables), 30000).
- 在主节点执行,将从节点加入集群:
第三步:验证同步效果
- 在从节点执行
mnesia:table_info(你的表名, disc_copies).,确认当前节点已被列为副本节点 - 在主节点插入测试数据,从节点查询验证是否同步成功
注意事项
- 确保两个节点的Mnesia表结构、schema完全一致,无任何差异
- 若之前出现过多次分区错误,建议清理节点的Mnesia数据目录(默认路径
_build/default/rel/你的应用/data/mnesia)后重新同步
内容的提问来源于stack exchange,提问作者halfway258
相关产品推荐
相关产品推荐

