mnesia数据库学习笔记二

创建一个mnesia数据库

  • 定义方案
  • 数据模型
  • 启动Mnesia
  • 创建新表

1、定义方案(schema)

Mnesia 系统配置是在Schema中描述的。Schema数据表中的数据只能通过其相关函数进行访问和修改。Mnesia允许动态配置其内容。

方案函数

mnesia:create_schema(NodeList)该函数用于初始化新的空方案,在mnesia启动之前,mnesia是一个真正分布式DBMS,schema是基于mnesia所有节点的一个系统表。NodeList节点必须都没有schema,并且都没有启动mnesia.

mnesia:delete_schema(DiscNodeList)删除列表节点上的旧方案。同时也移出所有旧表和数据,该函数需要Mnesia停止所有节点。

mnesia:delete_table(Tab).该函数删除所有Tab的复制表。

mnesia:clear_table(Tab).该函数表Tab的所有记录。

mnesia:move_table_copy(Tab, From, To).该函数移动Tab的copy从From节点到To节点。表类型保留。但是仍可能其它事务在被移出表上进行读写操作。

mnesia:add_table_copy(Tab, Node,  Type).创建一个复件表在Node节点上。Type只能是原子ram_copies,disc_copies, disc_only_copies之一。假如我们添一个schema系统表复件到一个节点, 这样就扩展了mnesia系统的节点数。

mnesia:transform_table(Tab, Fun, NewAttributeList, NewRecordName).该函数改变Tab表中所有记录的格式。

-record(old, {key, val}).
-record(new, {key, val, extra}).
Transformer =

   fun(X) when record(X, old) ->
      #new{key = X#old.key,
           val = X#old.val,
           extra = 42}
   end,
{atomic, ok} = mnesia:transform_table(foo, Transformer,
                                      record_info(fields, new),
                                      new),
change_table_copy_type(Tab, Node, ToType). 该函数变更表的存储类型,如把RAM表变成disc_table.

2、数据模型

所有数据被组织成一系列的表, 数据间的关系映射在附加表,用来描述关系。数据记录且元组进行表示。

对象ID 由表名和Key组成。如记录{employee, 10347, klacke, 7, male, 9810, {221, 015}}的Oid就是{employee, 10347}.

3、启动Mnesia

在启动Mnesia前,我们必需在所有参与节点上启动一空的schema, 当运行一个分布式系统中,存在两个或者多个节点,mnesia:start()就必须在每个节点上调用启动。

3.1 初始化Schema并启动Mnesia

在启动Mnesia前,必须创建启动路径相应的文件夹。

然后启动下面的命令行

第一个节点gin上输入:

命令行 erl -sname a -mnesia dir '"/ldisc“‘

第二个节点skeppet输入:

erl -sname b -mnesia dir '"/lidisc"'

然后在其中一个节点上输入:

(mailto:a@gin)1%20%3E%20Emnesia:create_schema([a@gin, b@skeppet]).

在两个节点上都调用mnesia:start().启动。

这样这配置地两个erlang节点运行数据库。这样配置一次,下次只需要在两个节点上调用mnesia:start()启动即可。就能从磁盘进行系统初始化。

在任一Mnesia节点系统中,每个节点都知道所有表的的当前位置。

mnesia:stop()和start()/0一样,只能单节点操作。

3.2 启动过程

mnesia:start()返回atom ok,紧接着开始异步初始化不同的数据表。根据尺寸可能需要花点时间。

mnesia:wait_for_tables(TabList, Timeout),该函数阻塞调用者直到指定表列表初始化完成。

mnesia:forece_load_table(Tab).该函数强制表从磁盘中加载,而不关心网络情况。

      case mnesia:wait_for_tables([a, b], 20000) of
        {timeout,   RemainingTabs} ->
          panic(RemainingTabs);
        ok ->
          synced
      end.
 

4、创建表

mnesia:create_table(Name, ArgList). 该函数创建表

Name:是atom值

Arglist:是一个{Key,Value}元组列表

{type, Type},类型为set, ordered_set ,bag之一, 缺省值为set.当前'ordered_set'不支持’disc_only_copies'表。

{disc_copies, NodeList}, Nodelist是包含磁盘表的节点列表。

缺省值为[],

  • 读操作非常快,在RAM中处理
  • 所有写操作必须持久化

在一个disc_copies复制表上的写操作分为两小步,首先添加日志,然后在RAM中操作。

{ram_copies, NodeList},NodeList缺省为[node()].缺省值创建一个新表位于本地节点。

其复制表可以通过mnesia:dump_table(TabList)dump到磁盘上。

{disc_only_copies, NodeList},复制表只保存在磁盘上,访问比较缓慢。但消耗较少内存。

{index, AttributeNameList}, AttributenameList是一个atom列表。会对每个列表中的元素创建一个索引表。

{snmp, SnmpStruct}, 详见简单网络管理协议。

{local_content, true},指定为仅本地节点唯一使用。每个节点都是独立的。
{attributes, AtomList}

{record_name, Atom}指定记录名

例子如下:

-record(funky, {x, y}).  %定义了记录

下面创建了一个表,并复制都所有节点上,在y属性上创建了索引, 表类型为bag.

mnesia:create_table(funky, [{disc_copies, [N1,N2]}, {index, [y]}, {type, bag}, {attributes, record_info(fields, funky)}).

如下是创建一个缺省表:

mnesia:create_table(stuff, []).

在本地节点上创建了下RAM copy表, 没有附加索引和属性。

 

posted on 2011-12-21 15:48  陈峰  阅读(2523)  评论(0编辑  收藏  举报