• mnesia数据库学习笔记二


      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表, 没有附加索引和属性。

  • 相关阅读:
    [可能没有默认的字体]Warning: imagettfbbox() [function.imagettfbbox]: Invalid font filename...
    <yii 框架学习> yii 框架改为中文提示
    Yii 语言设置 中文提示信息
    yii新手在实例化models(controller调用models实化化)php warning错误
    yii CFormModel中的rules验证机制
    神舟优雅系列和神舟精盾系列哪个好?
    response.sendRedirect跳转 jsp:forward跳转
    jsp post/get中接处理
    jsp动作之 forward
    JDK eclipse selenium的安装以及环境变量的配置
  • 原文地址:https://www.cnblogs.com/freebird92/p/2295793.html
Copyright © 2020-2023  润新知