erlang mnesia数据库简单应用
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
- 在a节点上运行
mnesia:change_config(extra_db_nodes, ['c@127.0.0.1']).
,将c节点连接到集群上,这时,c只是复制了schema - 在c节点上更改存储方式,
mnesia:change_table_copy_type(schema, 'c@127.0.0.1', disc_copies).
- 将所有表都同步到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数据库简单应用相关推荐
- elang mnesia 数据库操作
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...
- [数据库]简单SQL语句总结
1.在查询结果中显示列名: a.用as关键字:select name as '姓名' from students order by age b.直接表示:select name '姓名' fr ...
- mysql数据库二进制_Mysql数据库简单安装(二进制)
二进制安装: [root@lufengcentos ~]# mkdir /home/lufeng/tools -p [root@lufengcentos ~]# cd /home/lufeng/too ...
- Oracle 数据库 简单操作命令(新手看 可以收藏哟)
目录 Oracle 数据库 简单操作命令(新手看 可以收藏哟) 一.认识 Oracle 1.简介 2.需要了解的知识点 3.命令类型 二.SQL 查询 1.了解表及表的结构 2.SQL语句特点 3.简 ...
- FMDB数据库简单使用
上一篇文章sqlite3原生数据库简单使用 介绍了sqlite3原生数据库的简单使用,由于执行语句都是C语言写的,导致看起来操作非常不方便,因此便根据数据库封装了一个很好用的第三方框架,以下是他的简单 ...
- Unity3D笔记——MySQL数据库 简单使用
** Unity3D笔记--MySQL数据库 简单使用 前言:Unity3D笔记是我平时做一些好玩的测试和研究,记录的笔记.会比较详细也可能随口一提就过了. 所以大家见谅了,内容一般都会是原创的(非原 ...
- (C语言)数据库简单实现
(C语言)数据库简单实现 介绍 一.数据结构 自定义基础数据类型 数据字典表数据结构 表信息存储 列信息存储 自定义表信息存储 数据块头信息 数据项(元组)存储信息 过滤表达式结构 其他 二.全局变量 ...
- Oracle 数据库简单日常操作
Oracle 数据库简单日常操作 目录 Oracle 数据库简单日常操作 SQL基础部分 1.简介 2.安装好之后可以登录系统账户 3.用户与表空间 4.数据字典 5.如何启用scott用户 6.表空 ...
- oracle数据库linux冷备,linux/windows系统oracle数据库简单冷备同步
在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 Linux/windows系统oracle数据库简单冷备同步 我们有一个重视财务数据安全性的财务系统,并且我们有两个 ...
最新文章
- sqlserver2008r2升级到2012的问题
- 用按钮控制游戏物件的开启及关闭
- 2021年8月Python小屋编程比赛获奖名单
- 2019/3/27写给自己
- 欧拉工程第60题:Prime pair sets
- 静态方和和实例方法的区别
- MYSQL 碎片查询
- pycharm 的live_template的使用
- 东方通php支持,应用服务器TongWeb
- adams教程建模仿真实例
- 一文了解caffe框架
- python直方图解释_python直方图1 lin
- pintos (1) -- Alarm Clock
- GmSSL快速上手指南
- 阿里云国际站云服务器可以用来做什么业务?
- 组装一台电脑需要选购哪些基本部件
- 航拍“中国南北地理分界线” 感受独特景观
- 爬取电影天堂最新电影(xpath结合lxml)
- 数据库关于事务的详解分析(全)包含面试常问的细节
- 如何才能做到用户持续增长?
热门文章
- oracle查看被锁的行,查找被锁的表到底是哪一行被锁定了
- win7 php mysql apache 64_教你在64位win7体系中设备apache+mysql+php情况.doc
- nginx转发图片请求变成html/text_教你使用nginx部署网站教程
- 运维基础(2)实用工具篇
- 超适合新手的基础Linux命令
- 【干货】连交换机的攻击、防御都不懂,还做什么网络工程师
- EventBridge消息路由|高效构建消息路由能力
- 阿里巴巴 Kubernetes 应用管理实践中的经验与教训
- java win7 jdk_WIN7下配置JDK并运行JAVA的过程
- STP文件服务器,综合监控stp服务器