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.

转载于:https://www.cnblogs.com/xianzhedeyu/p/5881677.html

erlang mnesia数据库简单应用相关推荐

  1. elang mnesia 数据库操作

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

  2. [数据库]简单SQL语句总结

    1.在查询结果中显示列名: a.用as关键字:select name as '姓名'   from students order by age b.直接表示:select name '姓名'   fr ...

  3. mysql数据库二进制_Mysql数据库简单安装(二进制)

    二进制安装: [root@lufengcentos ~]# mkdir /home/lufeng/tools -p [root@lufengcentos ~]# cd /home/lufeng/too ...

  4. Oracle 数据库 简单操作命令(新手看 可以收藏哟)

    目录 Oracle 数据库 简单操作命令(新手看 可以收藏哟) 一.认识 Oracle 1.简介 2.需要了解的知识点 3.命令类型 二.SQL 查询 1.了解表及表的结构 2.SQL语句特点 3.简 ...

  5. FMDB数据库简单使用

    上一篇文章sqlite3原生数据库简单使用 介绍了sqlite3原生数据库的简单使用,由于执行语句都是C语言写的,导致看起来操作非常不方便,因此便根据数据库封装了一个很好用的第三方框架,以下是他的简单 ...

  6. Unity3D笔记——MySQL数据库 简单使用

    ** Unity3D笔记--MySQL数据库 简单使用 前言:Unity3D笔记是我平时做一些好玩的测试和研究,记录的笔记.会比较详细也可能随口一提就过了. 所以大家见谅了,内容一般都会是原创的(非原 ...

  7. (C语言)数据库简单实现

    (C语言)数据库简单实现 介绍 一.数据结构 自定义基础数据类型 数据字典表数据结构 表信息存储 列信息存储 自定义表信息存储 数据块头信息 数据项(元组)存储信息 过滤表达式结构 其他 二.全局变量 ...

  8. Oracle 数据库简单日常操作

    Oracle 数据库简单日常操作 目录 Oracle 数据库简单日常操作 SQL基础部分 1.简介 2.安装好之后可以登录系统账户 3.用户与表空间 4.数据字典 5.如何启用scott用户 6.表空 ...

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

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 Linux/windows系统oracle数据库简单冷备同步 我们有一个重视财务数据安全性的财务系统,并且我们有两个 ...

最新文章

  1. sqlserver2008r2升级到2012的问题
  2. 用按钮控制游戏物件的开启及关闭
  3. 2021年8月Python小屋编程比赛获奖名单
  4. 2019/3/27写给自己
  5. 欧拉工程第60题:Prime pair sets
  6. 静态方和和实例方法的区别
  7. MYSQL 碎片查询
  8. pycharm 的live_template的使用
  9. 东方通php支持,应用服务器TongWeb
  10. adams教程建模仿真实例
  11. 一文了解caffe框架
  12. python直方图解释_python直方图1 lin
  13. pintos (1) -- Alarm Clock
  14. GmSSL快速上手指南
  15. 阿里云国际站云服务器可以用来做什么业务?
  16. 组装一台电脑需要选购哪些基本部件
  17. 航拍“中国南北地理分界线” 感受独特景观
  18. 爬取电影天堂最新电影(xpath结合lxml)
  19. 数据库关于事务的详解分析(全)包含面试常问的细节
  20. 如何才能做到用户持续增长?

热门文章

  1. oracle查看被锁的行,查找被锁的表到底是哪一行被锁定了
  2. win7 php mysql apache 64_教你在64位win7体系中设备apache+mysql+php情况.doc
  3. nginx转发图片请求变成html/text_教你使用nginx部署网站教程
  4. 运维基础(2)实用工具篇
  5. 超适合新手的基础Linux命令
  6. 【干货】连交换机的攻击、防御都不懂,还做什么网络工程师
  7. EventBridge消息路由|高效构建消息路由能力
  8. 阿里巴巴 Kubernetes 应用管理实践中的经验与教训
  9. java win7 jdk_WIN7下配置JDK并运行JAVA的过程
  10. STP文件服务器,综合监控stp服务器