mnesia是erlang自带的分布式数据库,基于ets和dets实现的。mnesia兼顾了dets的持久性和ets的高性能,可以自动在多个erlang节点间同步数据库。最关键的是,mnesia实现了事务机制。

mnesia数据库有一个schema表,保存着数据库相关的一些信息,例如如何将表保存到磁盘、如何加载这些表、在哪些节点间同步数据。构建集群,关键是处理这个schema表。

调用函数mnesia:create_schema(ListOfNodes)可以创建schema,这必须在启动mnesia之前调用。缺省情况下,schema会保存在节点启动的当前目录,可以在应用启动时修改这个参数erl -name SomeName -mnesia dir where/to/store/table,或者执行函数application:set_env(mnesia, dir, "where/to/store/table").

初始化时构建mnesia集群

必须保证每一个Node都没有schema,如果有,调用mnesia:delete_schema删除。

在本地启动两个erlang 节点:

erl -name a@127.0.0.1 -mnesia dir '"path1"' -s mnesia
erl -name b@127.0.0.1 -mnesia dir '"path2"' -s mnesia

mnesia启动后会创建schema的,所以需要先删除schema,再重新创建。

(a@127.0.0.1)1> mnesia:system_info().
===> System info in version "4.11", debug level = none <===
opt_disc. Directory "path1" is NOT used.
use fallback at restart = false
running db nodes = ['a@127.0.0.1']
stopped db nodes = []
master node tables = []
remote = []
ram_copies = [schema]
disc_copies = []
disc_only_copies = []
[{'a@127.0.0.1',ram_copies}] = [schema]
2 transactions committed, 0 aborted, 0 restarted, 0 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: [] (b@127.0.0.1)1> mnesia:system_info().
===> System info in version "4.11", debug level = none <===
opt_disc. Directory "path2" is NOT used.
use fallback at restart = false
running db nodes = ['b@127.0.0.1']
stopped db nodes = []
master node tables = []
remote = []
ram_copies = [schema]
disc_copies = []
disc_only_copies = []
[{'b@127.0.0.1',ram_copies}] = [schema]
2 transactions committed, 0 aborted, 0 restarted, 0 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []

分别在两个节点上运行下面的命令删除schema

mnesia:stop(),
mnesia:delete_schema([node()])

在任意一个节点上(选择的是a@127.0.0.1)运行创建schema

mnesia:create_schema([node(), 'b@127.0.0.1']).

之后就可以看到在两个节点上看到新的schema了

(a@127.0.0.1)7> mnesia:system_info().
===> System info in version "4.11", debug level = none <===
opt_disc. Directory "/Users/zhaoxiaosen/work" is used.
use fallback at restart = true
running db nodes = []
stopped db nodes = ['b@127.0.0.1','a@127.0.0.1'] (b@127.0.0.1)5> mnesia:system_info().
===> System info in version "4.11", debug level = none <===
opt_disc. Directory "/Users/zhaoxiaosen" is used.
use fallback at restart = true
running db nodes = []
stopped db nodes = ['b@127.0.0.1','a@127.0.0.1']

最后分别启动mnesia。

给已有的mnesia集群添加node

新启动一个节点c@127.0.0.1

erl -name c@127.0.0.1 -mnesia dir '"path3"' -s mnesia
  1. 在a节点上运行mnesia:change_config(extra_db_nodes, ['c@127.0.0.1']).,将c节点连接到集群上,这时,c只是复制了schema
  2. 在c节点上更改存储方式,mnesia:change_table_copy_type(schema, 'c@127.0.0.1', disc_copies).
  3. 将所有表都同步到c节点上
[{Tb, mnesia:add_table_copy(Tb, node(), Type)}
|| {Tb, [{'a@node', Type}]} <- [{T, mnesia:table_info(T, where_to_commit)}
|| T <- mnesia:system_info(tables)]].

这样,新的节点就加入到mnesia集群上了。

上面的例子中,在启动节点时启动了mnesia,主要是为了测试删除schema

实例代码

%%启动
init_once() ->
mnesia:stop(),
mnesia:create_schema([node()]),
mnesia:start(),
mnesia:create_table(tab1, [{disc_copies, [node()]},
{attributes, record_info(fields, config)}]),
mnesia:create_table(tab2, [{ram_copies, [node()]},
{attributes, record_info(fields, watcher)}]),
mnesia:create_table(tab3, [{ram_copies, [node()]},
{attributes, record_info(fields, version)}]).
%%更改存储方式
change_table_copy_type([]) ->
ok;
change_table_copy_type([Node | T]) ->
mnesia:change_table_copy_type(schema, Node, disc_copies),
mnesia:change_table_copy_type(tab1, Node, disc_copies),
mnesia:change_table_copy_type(tab2, Node, ram_copies),
mnesia:change_table_copy_type(tab3, Node, ram_copies),
change_table_copy_type(T).
%%集群添加节点
sync_data(Node) when is_atom(Node) ->
sync_data([Node]);
sync_data(Nodes) when is_list(Nodes) ->
mnesia:change_config(extra_db_nodes, Nodes),
change_table_copy_type(Nodes),
add_table_copy(Nodes);
sync_data(_) ->
ok.
%%同步数据
add_table_copy([]) ->
ok;
add_table_copy([Node | T]) ->
[mnesia:add_table_copy(Tb, Node, Type)
|| {Tb, [{_, Type}]} <- [{T1, mnesia:table_info(T1, where_to_commit)}
|| T1 <- mnesia:system_info(tables)]],
add_table_copy(T).
%%事务执行,Q为操作命令
do(Q) ->
F = fun() -> qlc:e(Q) end,
mnesia:transaction(F).

其它常用函数

wait_for_tables(TabList, Timeout) -> ok | {timeout, BadTabList} | {error, Reason}

Some applications need to wait for certain tables to be accessible to do useful work. mnesia:wait_for_tables/2 either hangs until all tables in TabList are accessible, or until timeout is reached.

erlang mnesia数据库简单应用的更多相关文章

  1. erlang mnesia 数据库实现SQL查询

    Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...

  2. erlang mnesia数据库设置主键自增

    Mnesia是erlang/otp自带的分布式数据库管理系统.mnesia配合erlang的实现近乎理想,但在实际使用当中差强人意,总会有一些不足.mnesia数据表没有主键自增的功能,但在mnesi ...

  3. erlang mnesia 数据库查询

    Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...

  4. 远程连接ejabberd的mnesia数据库

    由于服务器是server版本,所以很难直观的看到mnesia的数据.所以对于初学者来说非常的困惑. 特地在qq群中请教了别人.别人说只要pong通了就行,就能通过rpc去操作远程的mnesia数据库. ...

  5. 如何在cowboy应用中指定mnesia数据库路径

    创建mnesia数据库的步骤简述: 1)定义脚本: -module(mns). -export([setup/0, clean/0]). -record(user, { id, coin, diamo ...

  6. linux/windows系统oracle数据库简单冷备同步

    linux/windows系统oracle数据库简单冷备同步 我们有一个财务系统比较看重财务数据的安全性,同时我们拥有两套系统,一个生产环境(linux),一个应急备份环境(windows).备份环境 ...

  7. ORACLE 数据库简单测试

    ORACLE 数据库简单测试 操作系统:Windows 7 – ORACLE:oracle database 10.2.0.4 一.目的 测试 启动监听程序.数据库  非同一个用户的情况,用户是否可以 ...

  8. Erlang cowboy 处理简单的HTTP请求

    Erlang cowboy 处理简单的HTTP请求 原文出自: Handling plain HTTP requests 处理请求的最简单的方式是写一个简单的HTTP处理器.它的模型参照Erlang/ ...

  9. [转]mnesia数据库学习笔记

    mnesia数据库学习笔记一 mnesia数据库学习笔记二 mnesia数据库学习笔记三 mnesia数据库学习笔记四

随机推荐

  1. 【高德地图API】从头德国高中生JS API(三)覆盖物——大喊|折线|多边形|信息表|聚合marker|点蚀图|照片覆盖

    覆盖物,是一张地图的灵魂.有覆盖物的地图.才是完整的地图.在一张地图上,除了底层的底图(瓦片图,矢量图),控件(有功能可操作的工具).最重要最必不可少的就是覆盖物了.覆盖物有多种.包含.标注.折线.多 ...

  2. 于linux已安装moodle

    本文介绍了两个虚拟机的安装linux server 及相关服务,随着后这些基础.安装应用程序服务 moodle 2.7+  它是使用最广泛的平台,网络课程. 在安装过程中moodle之前,需要支持软件 ...

  3. 配置SQL Server 2008的资源调控器实现负载均衡

    原文:配置SQL Server 2008的资源调控器实现负载均衡 转自:http://www.ithov.com/server/93267.shtml 1.为什么引入"资源调控器" ...

  4. Javascript入门视频教程

    1,第一节 http://pan.baidu.com/play/video#video/path=%2F%E6%95%99%E5%AD%A61.mov&t=-1 2,第二节 http://pa ...

  5. Linux服务器杀马(转)

    开篇前言 Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,Linux上的病毒.木马较少,二则由于宣称Linux是最安全的操作系统,导致很多人对Linux ...

  6. Cocos2dx 3.0 过渡篇(二十五)死不了的贪食蛇(触摸版)

    上一篇写的贪食蛇的重力感应控制版,这一篇就讲下触摸控制版吧.额,也不知道写了那个贪食蛇教程究竟有没有获得沈老师的书,假设没有的话,看我不拿西瓜刀砍掉 偶尔E往事 的那啥! 重力版链接:http://b ...

  7. 减小Cookie体积

    HTTP coockie能够用于权限验证和个性化身份等多种用途.coockie内的有关信息是通过HTTP文件头来在webserver和浏览器之间进行交流的.因此保持coockie尽可能的小以降低用户的 ...

  8. js关于propotype的一些事-------Day62

    近期在忙着搬家,忙忙活活的收拾这收拾那,原以为自己东西了了,谁知道东西是越收拾越多,各种崩溃啊..... 昨日在记录js动态生成表格的经典方式时,用到了createDocumentFragment() ...

  9. HTTP Cookie深入理解

    HTTP Cookie 概述:Cookie通常也叫做网站cookie,浏览器cookie或者http cookie,是保存在用户浏览器端的,并在发出http请求时会默认携带的一段文本片段.它可以用来做 ...

  10. log4j的配置信息(转)

    首先,在项目中的classes 中新建立一个log4j.properties文件即可: 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对Logger.Append ...