You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elixir中Mnesia disc_copies配置失效,如何将表存储到磁盘?

解决Elixir中Mnesia disc_copies配置无效的问题

这个问题我之前踩过坑,核心原因是你启动Erlang节点的方式不对——默认不带名称的:nonode@nohost节点不支持磁盘存储,Mnesia没法为它关联有效的磁盘目录,所以才会抛出{:bad_type, :mail, :disc_copies, :nonode@nohost}的错误。

下面是一步步的解决办法:

1. 启动带名称的Erlang节点

关闭当前的iex会话,在终端用带节点名的方式启动iex:

# 用短名称(适合本地测试)
iex --sname mailnode
# 或者用完整名称(适合网络环境)
iex --name mailnode@localhost

这样你的节点就有了一个合法的标识符,Mnesia可以基于这个名称创建磁盘上的schema目录。

2. 重新创建磁盘Schema

进入新的iex会话后,先创建支持磁盘的schema:

alias :mnesia, as: Mnesia
# 创建schema到当前节点的磁盘上
Mnesia.create_schema([node()])
# 启动Mnesia(create_schema后可能自动启动,但手动启动更稳妥)
Mnesia.start()

3. 创建带disc_copies的表

现在再创建表就能成功写入磁盘了:

fields = [:id, :to, :from, :body, :format, :metadata]
Mnesia.create_table(:mail, [attributes: fields, disc_copies: [node()]] )

执行后应该返回{:atomic, :ok}。

4. 验证存储类型

你可以用下面的命令确认表确实存储在磁盘上:

Mnesia.table_info(:mail, :storage_type)

返回值应该是:disc_copies,而不是默认的:ram_copies。

额外注意事项

  • 如果之前在:nonode@nohost下创建过schema,记得清理对应的Mnesia目录(默认在当前工作目录下的Mnesia.nonode@nohost文件夹),避免残留数据干扰。
  • 如果你需要重启节点,只要节点名称一致,Mnesia会自动加载磁盘上的schema和表数据。

内容的提问来源于stack exchange,提问作者Mr H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:04:32