Mnesia用户手册:三,构建Mnesia数据库

本章详细介绍了设计Mnesia数据库和编程结构的基本步骤:
1)定义schema
2)数据模型
3)启动Mnesia
4)创建新表

1,定义schema
Mnesia系统的配置在schema里描述
schema是一个特殊的表,它包含了表名、每个表的存储类型(表应该存储为RAM、硬盘或两者)以及表的位置等信息
不像数据表,schema表里包含的信息只能通过schema相关的方法来访问和修改
Mnesia提供多种方法来定义数据库schema,可以移动表、删除表或者重新配置表布局
这些方法的一个重要特性是当表在重配置的过程中可以被访问
例如,可以在移动一个表的同时执行写操作
该特性对需要连续服务的应用非常好
下面的方法是schema管理所要用到的,它们都返回一个tuple {atomic, ok}或{aborted, Reason}
1)mnesia:create_schema(NodeList)
该方法用来初始化一个新的空schema,在Mnesia启动之前这是一个强制必要的步骤
Mnesia是一个完全分布的DBMS,而schema是一个系统表,它备份到Mnesia系统的所有节点上
如果NodeList中某一个节点已经有schema,则该方法会失败
该方法需要NodeList中所有节点上的Mnesia都停止之后才执行
应用程序只需调用该方法一次,因为通常只需要初始化数据库schema一次
2)mnesia:delete_schema(DiscNodeList)
该方法在DiscNodeList节点上擦除旧的schema,它也删除所有的旧table和数据
该方法需要所有节点上的Mnesia都停止后才执行
3)mnesia:delete_table(Tab)
该方法永久删除Tab表的备份
4)mnesia:clear_table(Tab)
该方法永久删除Tab表的记录
5)mnesia:move_table_copy(Tab, From, To)
该方法将Tab表的copy从From节点移动到To节点
表的存储类型{type}保留,这样当移动一个RAM表到另一个节点时,在新节点上也维持一个RAM表
在表移动的过程中仍然可以有事务执行读和写操作
6)mnesia:add_table_copy(Tab, Node, Type)
该方法在Node节点上创建Tab表的备份,Type参数为ram_copies/disc_copies/disc_only_copies
7)mnesia:del_table_copy(Tab, Node)
该方法在Node节点上删除Tab表的备份,当最后一个备份被删除后,表也被删除
8)mnesia:transform_table(Tab, Fun, NewAttributeList, NewRecordName)
该方法对Tab表的所有数据更改format,它对表里所有记录调用Fun
Fun应该是一个方法,参数为记录的旧类型,返回记录的新类型,表的key不能更改
[code]
-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),
[/code]
Fun参数也可以为ignore,它表示只更新表的meta data,不推荐使用
9)mnesia:change_table_copy_type(Tab, Node, ToType)
该方法更改表的存储类型,如从RAM改为disc_table

2,数据模型
Mnesia的数据库数据由record组成,record由tuple表示
record的第一个元素是record名,第二个元素是表的key,前两个元素组成的tuple称为oid
Mnesia数据模型是对关系模型的扩展,因为该模型可以在域属性里存储任意的Erlang term
例如,可以在一个属性里存储指向其他表里的oid树,而这种类型的记录在传统的关系型DBMS里很难建模

3,启动Mnesia
在启动Mnesia之前我们必须在相应的节点上初始化一个空的schema
1)Erlang系统必须启动
2)必须使用create_schema(NodeList)来定义数据库schema
当运行一个分布式系统时,可能有多个节点参与,则mnesia:start()方法必须在相应的节点上运行
典型的,在一个嵌入式环境里mnesia:start()应该为启动脚本的一部分
在一个测试环境或解释型环境里,mnesia:start()也可以从Erlang shell或其他程序里调用

[b]初始化schema并启动Mnesia[/b]
要想在a@gin和b@skeppet这两个节点上运行Company数据库,每个节点必须已经具备Mnesia目录并初始化schema
有两种方式指定Mnesia目录
1)通过程序参数来指定
[code]
%erl -mnesia dir '"/ldisc/scratch/Mnesia.Company"'
[/code]
2)如果没有输入命令行参数,则Mnesia使用当前节点的当前工作目录来作为Mnesia目录
以下命令在两个指定节点上运行Company数据库:
1)gin节点上
[code]
gin %erl -sname a -mnesia dir '"/ldisc/scratch/Mnesia.company"'
[/code]
2)在skeppet节点上
[code]
skeppet %erl -sname b -mnesia dir '"/ldisc/scratch/Mnesia.company"'
[/code]
3)在两个节点之一执行create_schema:
(a@gin1) > mnesia:create_schema([a@gin, b@skeppet]).
4)在两个节点上运行mnesia:start()
5)在两个节点之一执行以下代码来初始化数据库:
[code]
dist_init() ->
mnesia:create_table(employee,
[{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields, employee)}]),
mnesia:create_table(dept,
[{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields, dept)}]),
mnesia:create_table(project,
[{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields, project)}]),
mnesia:create_table(manager,
[{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields, manager)}]),
mnesia:create_table(at_dept,
[{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields, at_dept)}]),
mnesia:create_table(in_proj,
[{ram_copies, [a@gin, b@skeppet]},
{attributes, record_info(fields, in_proj)}]).
[/code]
数据库只需初始化一次,下次只需mnesia:start()启动即可从硬盘启动系统
mnesia:stop()方法在当前节点上停止Mnesia,start/0和stop/0都在本地Mnesia系统上起作用,没有启动和停止一些节点的方法

[b]启动过程[/b]
Mnesia通过调用mnesia:start()来启动
该方法在本地初始化DBMS
配置选择会更改表的位置和加载顺序:
1)表只存储在本地,从本地Mnesia目录初始化
2)根据哪个备份是最新的来决定备份表从本地硬盘还是其它节点的完整表copy来初始化,Mnesia会决定哪份备份是最新的
3)一旦表被加载,则可以被其他节点访问
表的初始化时同步的,如果数据库比较大,则mnesia:start()可能消耗一部分时间
mnesia:wait_for_table(TabList, Timeout)会等待表的加载
mnesia:force_load_table(Tab)会强制从硬盘加载表而不管其他情况,这时可能远程的备份上的操作会丢失

4,创建新表
Mnesia提供方法mnesia:create_table(Name, ArgList)来创建新表,返回{atomic, ok}或{aborted, Reason}
1)Name是表名
2)ArgList是{Key, Value}的tuple
-{type, Type}
Type值为set、ordered_set或bag,默认为set
bag可以一个key对应多条record,而set和ordered_set只能一个key对应一条record
Mnesia表中不会出现重复的record(同样的key和content)
-{disc_copies, NodeList}
表存储在硬盘上
disc_copies类型的表备份的写操作会将数据写到disc和RAM中的表副本中
如果我们有如下需求:
1)读操作必须很快,直接在RAM操作
2)写操作必须写到硬盘中
那么我们可以一个表放到RAM中,一个disc_copies放到硬盘上
对disc_copies的表的写操作会分两步执行,首先将写操作添加到日志文件中,然后再RAM里执行真正的写操作
-{ram_copies, NodeList}
表存储在RAM里
ram_copies类型的表备份可以用mnesia:dump_tables(TabList)方法来导入到硬盘上
-{disc_only_copies, NodeList}
这种类型的表备份只存储在硬盘上,因此访问比较慢,但是这种类型的表消耗更少的内存
-{index, AttributeNameList}
AttributeNameList指定Mnesia构建和维护的索引名,有一个index表来索引list里的每个元素
Mnesia record的第一个field是key,所以不需要额外的索引
-{snmp, SnmpStruct}
表示该表通过简单网络管理协议(SNMP)来访问
-{local_content, true}
表名对所有Mnesia节点可见,但是内容对每个节点唯一
-{attributes, AtomList}
指定表的字段名
AtomList一般使用record_info(fields, record_name),而是硬编码属性列表,这样更易维护和更健壮,如果以后表结构更改则只用改record
-{record_name, Atom}
指定表记录的common name,表里所有的record都以Atom作为第一个元素
例如我们定义如下record:
[code]
-record(funky, {x, y}).
[/code]
那么在两个备份节点和y属性上的一个额外索引的bag类型的表的创建代码:
[code]
mnesia:create_table(funky, [{disc_copies, [N1, N2]}, {index, [y]}, {type, bag}, {attributes, record_info(fields, funky)}]).
[/code]
而mnesia:create_table(stuff, [])将在本地节点创建一个RAM表stuff,没有额外的索引,并且表的字段为[key,val]
erlang mnesia 数据库实现SQL查询 Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南。下面的内容将着重说明 Mnesia 数据库如何实现SQL查询,实现select / insert / update / where / order by / join / limit / delete等SQL操作。 阅读详情

相关推荐

用Mnesia构建分布式数据库:深入了解Erlang中的Mnesia

本文将深入探讨Mnesia的特性和用法,并提供一些示例代码来演示其功能。Mnesia是Erlang/OTP平台的一部分,它是一个内置的键值存储数据库。Mnesia提供了强大的查询和索引功能,使开发人员能够轻松地执行复杂的数据操作。事务是Mnesia中的基本操作单元,可以确保数据的一致性和完整性。这意味着数据将被复制到其他节点上,以增加系统的容错性和可用性。然后,我们可以在其他节点上执行相同的数据操作。上述代码将启动Mnesia并创建一个新的数据库节点。我们还指定了数据副本的位置,这里我们只使用了当前节点。

AzProcessgroup的博客 309

Mnesia 学习笔记(3)

 3、建造Mnesia数据库3.1 定义数据库结构3.1.1 与数据库结构相关的函数● mnesia:create_schema(NodeList). 用于初始化新建的空白的结构。它必须在Mnesia启动前调用。● mnesia:delete_schema(DiscNodeList). 它清除在列表DiscNodeList中的全部节点上的已有数据库结构及其数据表格。它调

lawme的专栏 3184

等时替代模型( Isotemporal Substitution Model)

文献阅读:Associations of sedentary time and physical activity with adverse health conditions: Outcome-wide analyses using isotemporal substitution model(该论文于2022年4月28日发表在柳叶刀子刊 EClinicalMedicine 上)

姚巨龙的博客 1万+

EMQ持久化数据库Oracle,EMQ源码分析(五):Mnesia数据库

前言基于EMQ2.3.11。Mnesia是分布式电信数据库管理系统,有以下特性:DBMS查询语言数据持久性:表是持久化到存储的集群复制:表可以在多个节点上复制原子事务:支持事务透明:对编程来说是透明的实时数据搜索:查询速度很快一、Mnesia表的创建参数1、type 表类型【取值】set:唯一键值,1:1,一个键一条记录ordered_set:唯一键值,1:1,带排序bag:1:n,一个键可以映射...

weixin_33974017的博客 728

Tomcat启动过程中cmd窗口(控制台)中文乱码的问题

tomcat启动时,启动过程日志中文乱码的处理方法。

寻码启示 1942

nmap、X-Scan漏洞扫描和Metasploit中用永恒之蓝漏洞入侵靶机并上传冰河

利用nmap、X-Scan扫描靶机的漏洞,在Metasploit中用扫描出的永恒之蓝漏洞入侵靶机,建立连接后上传冰河木马控制靶机,最后用冰河陷阱清除靶机的冰河木马,记一次完整的入侵控制实验。

m0_59302403的博客 4407

Mnesia(三)

内存表(RAM Table)以其极高的性能适用于对速度要求极高的场景,但由于数据是瞬态的,一旦系统崩溃或重启,所有数据会丢失。其值是一个节点名的列表,表示哪些节点上的 Mnesia 实例将存储该表的数据,数据存储在磁盘上。它的值是一个节点名的列表,表示哪些节点上的 Mnesia 实例将存储该表的数据。用于获取与记录相关的信息,使用语法{attribute,record_info(fields,xxx)},而不需要显式的逐个字段的指定列名。Args:一个包含表配置的列表,它指定了该表的属性和行为。

m0_63236927的博客 1964

密码学:一文看懂Base64算法

Base64常常在我们开发中出现,我们可能只知道它是一串乱码(看不懂的符号),知道有时候知道我们需要把一些数据进行base64编码,有时候需要进行Base64解码。但是却不知道它的作用是什么?它存在的意义是什么?还有它是如何生成的?如何编码和解码?上述的疑问相信在你读完本篇文章之后烟消云散。下面开始正文。Base64是什么?它和加密解密操作有什么关系吗?没错,这就是经过Base64编码后的字符串。对它解码后,我们获得以下内容点个关注,是对我持续创作的最大的鼓励!

Shujie 1万+

mnesia如何修改表结构

mnesia创建的时候需要指定表record结构,如果定义的record结构修改了,就要更新数据的表结构,否则mnesia无法正常读取和写入数据。 我们最开始是这样定义结构的 -record(person, {name, age}). 然后这样建表 mnesia:create_table(person, [{disc_only_copies, nodes()}, {attributes, ...

ve12345的博客 218

告别Modern Standby!Win10/11强制S3睡眠的终极指南(含BIOS设置避坑)

本文是针对Windows 10/11用户因Modern Standby(S0低电量待机)导致睡眠耗电、发热问题的终极解决方案。文章详细对比了Modern Standby与传统S3睡眠(Suspend to RAM)的本质区别,并提供了从系统诊断、注册表修改、BIOS/UEFI设置避坑到驱动优化的完整步骤,旨在帮助用户强制启用稳定、省电的S3睡眠模式,彻底告别睡眠噩梦。

n7o8p的博客 799

高通GAIA V3命令参考手册的研读学习(15):自定制命令的详细工作描述

里的示例一样,手机APP发出这个GetManuFacturer的命令发0x0000,那么耳机回复:0x8000, 同时在回复的playload部分,用最多15个字节的ACSII码来表达制造商信息(因此最多15个字母)。那么这个APP在通过GAIA协议控制这个耳机时,不仅可以通过前面讲过的vendor ID来识别,也可以更进一步通过这个命令来识别这个耳机,到底是不是本公司的。通过这个可变长度的playload,真的是可以传达极多的事先约定的信息,相当的灵活,真是不错!这个命令用来得到设备的制造商信息。

qq_37191547的博客 398

创建Mnesia数据库

最近学习erlang,在erlang中天然集成了一个分布式数据库名字叫mnesia,因为数据库天然就和erlang的元组,记录无缝结合,并且具有良好的分布式特性,能够自动地在几个erlang节点上实现数据复制,效果有点像zookeeper的节点集群,而且mnesia还支持数据库事务特性,所以mnesia在erlang应用中使用得非常频繁。   要在本地创建一个mnesia数据库,并且要实现...

百岁 243

公交车调度排班优化算法研究与实现

本文提出的公交车调度排班优化算法基于遗传算法,能够较好地处理公交车调度排班问题,使得车辆数量和运营时间得到平衡,公交车的使用效率得到了优化。在模拟的公交车路线中,使用本文所提出的算法,得到了一组较优的公交车调度排班方案。其中,车辆数量的多少会影响到公交车的行驶速度和等候时间,而运营时间的长短则会直接影响到公交车的使用效率和成本。本文基于遗传算法,通过随机生成种群、选择、交叉、变异等操作,逐步优化种群中个体的适应度,最终得到较优的公交车调度排班方案。以下是本文中所使用的Matlab代码实现,供参考。

PixelLoom的博客 872

erlang(十五)--Mnesia用户手册:三,构建Mnesia数据库

erlang(十五)--Mnesia用户手册:三,构建Mnesia数据库 分类:erlang | 标签: Mnesia用户手册  2012-08-31 17:00 阅读(333)评论(0)编辑删除 本章详细介绍了设计Mnesia数据库和编程结构的基本步骤:  1)定义schema  2)数据模型  3)启动Mnesia  4)创建新表  1,定义sch

426

【OCPP】ocpp1.6协议3.3章节:功能配置文件及接口

Smart Charging Profile中定义了4个接口请求,即GetCompositeSchedule、ClearChargingProfile、SetChargingProfile和ClearCache等。Smart Charging: 包含智能充电相关的功能,如计划充电,报告充电计划,并改变充电速度。Core: 包含电动汽车充电相关的基础功能,如启动和停止充电,更改充电配置,报告充电状态等。Reservation: 包含预约服务相关的功能,如创建,取消和更改预约。

qq_53871375的博客 2170

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Mnesia:Erlang数据库

在做任何事之前,必须先创建一个Mnesia数据库。这件事只需要做一次。会在NodeList(它必须是一个包含有效Erlang节点的列表)里的所有节点上都初始化一个新的Mnesia数据库。这个案例给出的节点列表是[node()],也就是当前节点。Mnesia完成初始化并创建了一个名为的目录结构来保存数据库。然后退出Erlang shell,用操作系统的ls命令进行验证。/home/joe/some/path/to/Mnesia.company是将要保存这个数据库的目录。

qq_53795917的博客 1337

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mnesia用户手册的阅读总结:

1. Mnesia数据库被组织为一个表的集合, 每个表又实例(Erlang record)构成, 表也有一些属性, 如位置(location)和持久性(persistence)等. 2. 通过一个基本的例子介绍Mnesia数据库的使用: 有如下的数据模型: 三个实体: 雇员employee,项目project,部门department 三个实体的关系式: a

6904

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

生产环境中的Que:编译发布与Mnesia数据库配置指南

Que是一个基于Mnesia的Elixir后台任务处理库,它提供了简单高效的作业处理能力。在生产环境中,正确配置Mnesia数据库并进行编译发布是确保系统稳定运行的关键步骤。本文将详细介绍如何在生产环境中配置Que的Mnesia数据库以及进行编译发布的完整流程。 ## 为什么选择Que与Mnesia? Que作为一款轻量级的作业处理库,与Mnesia数据库的结合为Elixir应用提供了独特的优

gitblog_00830的博客 986

Mnesia RocksDB:为Mnesia数据库系统注入新活力

Mnesia RocksDB:为Mnesia数据库系统注入新活力 项目介绍 Mnesia RocksDB 是一个为 Mnesia 数据库系统设计的 RocksDB 后端插件。Mnesia 是 Erlang/OTP 中的一个分布式数据库管理系统,而 RocksDB 是一个高性能的嵌入式键值存储库。通过将 RocksDB 作为 Mnesia 的后端存储,Mnesia 能够突破 dets 模块的 2GB...

gitblog_00487的博客 1161

RabbitMQ修改数据目录MNESIA数据目录

Mnesia作为数据库存储引擎。Mnesia是一个基于Erlang语言开发的分布式数据库,其默认情况下将数据存储在节点的本地磁盘上。Mnesia提供了一个基于事务的存储系统,支持ACID属性(原子性、一致性、隔离性和持久性),可以保证数据的完整性和可靠性。Mnesia可以将数据存储在节点的本地磁盘上,也可以将数据存储在多个节点之间,从而实现数据的分布式存储和管理。在RabbitMQ中,Mnesia用于存储所有队列、交换器、绑定和节点的元数据信息。

出发之前永远是梦想,上路之后永远是挑战。 2648

erlang mnesia 数据库备份与还原

数据库在使用当中都会有数据库备份工作,当数据库发生严重错误无法启动,或者数据丢失时可以及时有效地恢复数据。文章首先介绍如何备份和还原Erlang Mnesia数据库,然后从备份、回滚两大方面深入探讨mnesia的备份机制。

没有开花的树 4610

Memento:革命性Elixir分布式数据库包装器,让Mnesia开发变得简单高效

Memento是一个革命性的Elixir分布式数据库包装器,专门为简化Mnesia数据库开发而设计。这个强大的工具让Elixir开发者能够轻松地使用Erlang的Mnesia分布式实时数据库,无需面对复杂的原始API和查询语言。Memento提供了简单直观的接口,让分布式数据库开发变得前所未有的简单高效。 [![Memento分布式数据库包装器](https://raw.gitcode.com/

gitblog_01019的博客 814
上一篇: Mnesia用户手册:二,Mnesia快速上手
下一篇: Rails程序开发的最大问题是代码规范
hidetobj
博客等级 码龄19年 16粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值