绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
mnesia数据库学习
2022-04-11 15:31:49

Q: 加入一个新节点到Mnesia System

 

> mnesia:start().

> mnesia:change_config(extra_db_nodes, [some_existing_node]).               %% disk-less node now

> mnesia:change_table_copy_type(schema, node(), disc_copies).

 

> mnesia:create_schema

> mneisa:delete_schema

 

> mnesia:add_table_copy

> mnesia:del_table_copy

 

 

1,在分布式系统中,获得共享表player的总记录数
直接使用table_info得到的size总是0,需要使用下面的方法
mnesia:activity(transaction,fun() -> 
                                             mnesia:table_info(player,size)
                                        end,mnesia_frag).
 
2,动态改变Mnesia表结构:
-record(old, {key, val}).
-record(new, {key, val, extra}).
Transformer =
             fun(X) ->
                      #new{key = X#old.key,
                      val = X#old.val,
                      extra = 42}
               end,
{atomic, ok} = mnesia: transform_table(foo, Transformer,
                                                                 record_info(fields, new)).
 
 
3,分布式系统中,管理共享数据库的方法:
假设一个线上的节点使用下面的命令行运行
/usr/local/erlang/bin/erl -boot game_server-1 -config sasl  -sname chatserver01  -mnesia dir '"/game/game_chat_server/gamedb"' -detached
 
如果要管理gamedb的数据,用 -sname chatserver01 -mnesia dir '...'  启动会提示错误,
我试了下,再开设个节点,使用相同的 mnesia dir 就可以访问这个数据库了,如果不设置新的节点(通过sname启动选项),也不行,能看到表,但无法操作,可能当设置了-sname 后,Erlang才对这个进程进行cookie判断,所以没指定-sname 节点名就无权限访问共享的数据库
 
/usr/local/erlang/bin/erl   -sname dbmaster  -mnesia dir  '"/game/game_chat_server/gamedb"'
 

更新:这种方式,不能使用更新表结构,更新表结构还是需要停止服务,更新程序代码中的record属性 

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Mnesia
创建时间:2022-04-11 15:30:34
Mnesia
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • LCR_
    专家
戳我,来吐槽~