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
相关产品推荐
相关产品推荐

