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是包含磁盘表的节点列表。
缺省值为[],
在一个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表, 没有附加索引和属性。