设为首页收藏本站

Erlang中文论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5344|回复: 5

mnesia:start()启动数据库

[复制链接]
发表于 2018-8-7 19:42:03 | 显示全部楼层 |阅读模式
本帖最后由 茶叶feng 于 2018-8-7 20:00 编辑

mnesia:start()启动数据库的时候,必定会创建一个名为schema的表在erlang OTP并发编程实战中有个例子,代码如下:

%% 前面调用了mnesia:start().
add_extra_nodes([Node | Tail]) ->
    case mnesia:change_config(extra_db_nodes, [Node]) of
        {ok, [Node]} ->
            {atomic, ok} = mnesia:add_table_copy(schema, node(), ram_copies),%% 这里报错了

            {atomic, ok} = mnesia:add_table_copy(key_to_pid, node(), ram_copies),

            Tables = mnesia:system_info(tables),
            mnesia:wait_for_tables(Tables, ?WAIT_FOR_TABLES);
        _ ->
            add_extra_nodes(Tail)
    end.

这样做的话,新加入分布式mnesia的节点本地数据库就回重复创建schema而报错,具体原因不知道是不是otp版本问题还是我代码存在问题,希望有大神指点

补充一下:
我把红色的那句注释了之后,代码就能正常运行了
回复

使用道具 举报

发表于 2018-8-31 20:47:55 | 显示全部楼层
  1. Rs  = mnesia:add_table_copy(schema, node(), ram_copies),
复制代码


把 Rs 打印出来 看是什么嘛

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-3 14:58:17 | 显示全部楼层
dreamxyp 发表于 2018-8-31 20:47
把 Rs 打印出来 看是什么嘛
  1. (test@localhost)1> mnesia:start().
  2. ok
  3. (test@localhost)2> mnesia:change_config(extra_db_nodes, ['contact1@localhost']).
  4. {ok,[contact1@localhost]}
  5. (test@localhost)3> mnesia:add_table_copy(schema, node(), ram_copies).
  6. {aborted,{already_exists,schema,test@localhost}}
  7. (test@localhost)4> mnesia:system_info().
  8. ===> System info in version "4.14.3", debug level = none <===
  9. opt_disc. Directory "/data/opensource/my_try/Mnesia.test@localhost" is NOT used.
  10. use fallback at restart = false
  11. running db nodes   = [contact1@localhost,contact2@localhost,test@localhost]
  12. stopped db nodes   = []
  13. master node tables = []
  14. remote             = []
  15. ram_copies         = [schema]
  16. disc_copies        = []
  17. disc_only_copies   = []
  18. [{contact1@localhost,ram_copies},
  19. {contact2@localhost,ram_copies},
  20. {test@localhost,ram_copies}] = [schema]
  21. 4 transactions committed, 1 aborted, 0 restarted, 0 logged to disc
  22. 0 held locks, 0 in queue; 0 local transactions, 0 remote
  23. 0 transactions waits for other nodes: []
复制代码

它会提示我已经创建了结构,的确他也有这个结构存在,不知道是不是默认会自动创建的
回复 支持 反对

使用道具 举报

发表于 2018-9-5 22:23:29 | 显示全部楼层
那就对了嘛
   
  1. {atomic, ok} = mnesia:add_table_copy(schema, node(), ram_copies),%% 这里报错了
复制代码
    你这样写  要是返回 不是 {atomic, ok}   不就 报错了  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-6 09:51:36 | 显示全部楼层
dreamxyp 发表于 2018-9-5 22:23
那就对了嘛
         你这样写  要是返回 不是 {atomic, ok}   不就 报错了

理论上这步应该不会出问题的吧?我就是想确保这步能成功执行,为啥跟书上讲的结果不同。。。
回复 支持 反对

使用道具 举报

发表于 2018-9-6 18:34:22 | 显示全部楼层
太旧了,书上的也有bug  可能第一次 不会出错
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Erldoc.com  

GMT+8, 2019-10-22 16:41 , Processed in 0.025916 second(s), 9 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表