mnesia数据库学习笔记二

摘要:
Mnesia数据库学习注释2创建Mnesia定义方案数据模型开始Mnesia创建新表1。定义方案Mnesia系统配置在Schema中描述。Mnesia允许动态配置其内容。同时,所有旧表和数据都将被移出。此函数要求Mnesia停止所有节点。如果我们将模式系统表的副本添加到节点,我们将扩展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表, 没有附加索引和属性。

免责声明:文章转载自《mnesia数据库学习笔记二》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇outline:0与outline:none区别C#使用Quartz.NET详细讲解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

提高程序运行效率的10个简单方法(转)

对于每一个程序员来说,程序的运行效率都是一个值得重视,并为之付出努力的问题。但是程序性能的优化也是一门复杂的学问,需要很多的知识,然而并不是每个程序员都具备这样的知识,而且论述如何优化程序提高程序运行效率的书籍也很少。但是这并不等于我们可以忽略程序的运行效率,下面就介绍一下本人积累的一些简单实用的提高程序运行效率的方法,希望对大家有所帮助。 注:以C/C+...

把页面的Table直接输出到Excel文件中

有个需求是统计的时候,为生成的html表格提供导出功能,但是这样导出Excel不会显示自身的表格 影响美观,但是excel会显示html的css样式,这里可以通过处理行对象的方式进行导出,但是处理起纵向合并比较麻烦,这里待续! 1 String newStr = new String(name.getBytes(), "ISO8859_1"); 2 res...

文本超过长度后隐藏,显示省略号

table{   table-layout:fixed; } td{    white-space:nowrap;   overflow:hidden;   text-overflow:ellipsis; }   在table和td分别新增这几个样式就可以了,效果如下: 本方法用于解决表格单元格内容过多时的美观问题,主要涉及到4句CSS样式: 1....

线程属性--十分重要的概念

http://blog.chinaunix.net/uid-23193900-id-3346199.html 一.线程属性 线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化。...

mysql alter 语句用法,添加、修改、删除字段等

//主键549830479 alter table tabelname add new_field_id int(5) unsigned default 0 not null auto_increment ,add primary key (new_field_id); //增加一个新列549830479 alter table t2 add...

使用logstash同步Mysql数据表到ES的一点感悟

针对单独一个数据表而言,大致可以分如下两种情况: 1.该数据表中有一个根据当前时间戳更新的字段,此时监控的是这个时间戳字段 具体可以看这个文章:https://www.cnblogs.com/sanduzxcvbnm/p/12858967.html 示例: modification_time就是表中要监控的时间戳字段 input { jdbc {...