Erlang笔记 -- Mnesia:Erlang数据库简单使用

1. 创建数据库
  • 在当前节点创建
PS E:\ERL\Mnesia> erl
Eshell V8.3  (abort with ^G)
1> node().
nonode@nohost
2> mnesia:create_schema([node()]).
ok
3> init:stop().
ok
4>
PS E:\ERL\Mnesia> ls
    目录: E:\ERL\Mnesia
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/10/21     11:38                Mnesia.nonode@nohost
PS E:\ERL\Mnesia>

mnesia:create_schema(NodeList)会在NodeList(它必须是一个包含有效Erlang节点的列表)里的所有节点上都初始化一个新的Mnesia数据库。
Mnesia完成初始化并创建了一个名为Mnesia.nonode@nohost的目录结构来保存数据库。

  • 在特定节点创建
PS E:\ERL\Mnesia> erl -sname dylan
Eshell V8.3  (abort with ^G)
(dylan@DESKTOP-FRA3DA2)1> mnesia:create_schema([node()]).
ok
(dylan@DESKTOP-FRA3DA2)2> init:stop().
ok
(dylan@DESKTOP-FRA3DA2)3>
PS E:\ERL\Mnesia> ls
    目录: E:\ERL\Mnesia
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2020/10/21     11:46                Mnesia.dylan@DESKTOP-FRA3DA2
d-----       2020/10/21     11:38                Mnesia.nonode@nohost

另外,可以在启动erl时通过参数-mnesia dir Dir指定数据库目录的位置。

  • Mnesia常用方法
    mnesia:start(). 启动mnesia数据库
    mnesia:stop(). 关闭mnesia数据库
    mnesia:info(). 显示mnesia数据库状态
2. 创建表

可以对Mnesia表进行多种方式的配置。首先,表可以位于内存或磁盘里。其次,表可以位于单台机器上,也可以在多台机器之间复制。

  • 内存表
    它们的速度非常快,但是里面的数据是易失的,所以如果机器崩溃或者停止了DBMS,数据就会丢失。
  • 磁盘表
    磁盘表应该不会受到系统崩溃的影响(前提是磁盘没有物理损坏)。当Mnesia事务写入一个表并且这个表是保存在磁盘上时,实际上是事务数据首先被写入了一个磁盘日志。

要创建一个表,则调用mnesia:create_table(Name, ArgS),其中ArgS是一个由{Key,Val}元组构成的列表。如果表创建成功,create_table就会返回{atomic, ok},否则返回{aborted, Reason}。常用参数:

  • Name
    表的名称(一个原子)。按惯例是一个Erlang记录的名称,表里的各行是这个记录的实例。
  • {type, Type}
    指定了表的类型。Type是setordered_setbag中的一个。
  • {disc_copies, NodeList}
    NodeList是一个Erlang节点列表,这些节点将保存表的磁盘副本。使用这个选项时,系统还会在执行这个操作的节点上创建一个表的内存副本。
    可以既在一个节点上保存disc_copies类型的副本表,又在另一个节点上保存该表的不同类型。这种做法能满足以下要求:
  1. 读取操作非常快,并在内存里执行;
  2. 写入操作在持久性存储介质里执行。
  • {ram_copies, NodeList}
    NodeList是一个Erlang节点列表,这些节点将保存表的内存副本。
  • {disc_only_copies, NodeList}
    NodeList是一个Erlang节点列表,这些节点将只保存表的磁盘副本。这些表没有内存副本,访问起来会比较慢。
  • {attributes, AtomList}
    这个列表包含表里各个值的列名。要创建一个包含Erlang记录xxx的表,可以用{attributes, record_info(fields, xxx)}这种语法(也可以显式指定一个记录字段名列表)。
常用的表属性组合:
  • mnesia:create_table(shop, [{attributes, record_info(fields, xxx)}]).
    它会在单个节点上创建一个常驻内存的表。
    如果节点崩溃了,表就会丢失。
    它是所有表里最快的一种。
    内存必须能容纳这个表。

  • mnesia:create_table(shop, [{attributes, record_info(fields, xxx)}, {disc_copies, node()]}).
    它会在单个节点上创建一个常驻内存的表和一个磁盘副本。
    如果节点崩溃了,表就会从磁盘恢复。
    表的读访问很快,但写访问较慢。
    内存最好能容纳这个表。

  • mnesia:create_table(shop, [{attributes, record_info(fields, xxx)}, {disc_only_copies, node()]}).
    它只会在单个节点上创建一个磁盘副本。
    它用于那些因为太大而无法放入内存的表。
    它的访问速度比带有内存副本的方案更慢。

  • mnesia:create_table(shop, [{attributes, record_info(fields, xxx)}, {ram_copies, node(), soneOtherNode()]}).
    它会在两个节点上各创建一个常驻内存的表。
    如果两个节点都崩溃了,表就会丢失。
    内存必须能容纳这个表。
    可以在任何一个节点上访问这个表。

  • mnesia:create_table(shop, [{attributes, record_info(fields, xxx)}, {disc_copies, node(), soneOtherNode()]}).
    它会在多个节点上创建磁盘副本。
    无论哪个节点崩溃,我们都能恢复过来。
    即使所有节点都崩溃了,表也不会丢失。

首先,通过执行test_mnesia:do_only_once()创建一个数据库及数据表:

1> test_mnesia:do_only_once().
stopped

=INFO REPORT==== 30-Oct-2020::15:06:32 ===
    application: mnesia
    exited: stopped
    type: temporary
2> mnesia:info().
===> System info in version "4.14.3", debug level = none <===
opt_disc. Directory "e:/ERL/Mnesia/Mnesia.nonode@nohost" is used.
use fallback at restart = false
running db nodes   = []
stopped db nodes   = [nonode@nohost]
ok
3> mnesia:start().
ok
4> mnesia:info().
---> Processes holding locks <---
---> Processes waiting for locks <---
---> Participant transactions <---
---> Coordinator transactions <---
---> Uncertain transactions <---
---> Active tables <---
cost           : with 0        records occupying 302      words of mem
shop           : with 0        records occupying 302      words of mem
schema         : with 3        records occupying 645      words of mem
===> System info in version "4.14.3", debug level = none <===
opt_disc. Directory "e:/ERL/Mnesia/Mnesia.nonode@nohost" is used.
use fallback at restart = false
running db nodes   = [nonode@nohost]
stopped db nodes   = []
master node tables = []
remote             = []
ram_copies         = [cost,shop]
disc_copies        = [schema]
disc_only_copies   = []
[{
   nonode@nohost,disc_copies}] = [schema]
[{
   nonode@nohost,ram_copies}] = [shop,cost]
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: []
ok

test_mnesia:do_only_once()代码如下:

do_only_once() ->
    mnesia:create_schema([node()]),
    mnesia:
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值