表的类型和位置
内存表
它们的速度非常快,但是里面的数据是易失的,所以如果机器崩溃或者你停止了DBMS,数据就会丢失。
磁盘表
磁盘表应该不会受到系统崩溃的影响(前提是磁盘没有物理损坏)。
当Mnesia事务写入一个表并且这个表是保存在磁盘上时,实际上是事务数据首先被写入
了一个磁盘日志。这个磁盘日志会不断增长,里面的信息会每隔一段时间与数据库里的其他数据合并,然后磁盘日志里的条目就会被清除。如果系统崩溃了,磁盘日志就会在下一次系统重启时进行一致性检查,任何未合并的日志条目会先添加到数据库里,然后数据库才可用。
任何一个事务成功时,数据都应该已经正确写入到磁盘日志里,如果系统随后崩溃了,那么当它下次重启时,事务所做的改动应该会完好无损。
如果系统在事务进行过程中崩溃了,那么它对数据库所做的改动应该会丢失。
使用内存表之前,需要做一些试验来看看物理内存是否能容纳整个表。如果物理内存装不下内存表,系统就会频繁读写页面文件,这将会影响性能。
内存表是易失的,所以如果想构建一个容错式应用程序,就需要把内存表复制到磁盘上,或者把它复制为第二台机器的内存或磁盘表,或者两者皆有。
常见的表属性组合
mnesia:create_table(shop, [Attrs]).
它会在单个节点上创建一个常驻内存的表。
如果节点崩溃了,表就会丢失。
它是所有表里最快的一种。
内存必须能容纳这个表。
mnesia:create_table(shop,[Attrs,{disc_copies,[node()]}]).
它会在单个节点上创建一个常驻内存的表和一个磁盘副本。
如果节点崩溃了,表就会从磁盘恢复。
表的读访问很快,但写访问较慢。
内存最好能容纳这个表。
mnesia:create_table(shop,[Attrs,{disc_only_copies,[node()]}]).
它只会在单个节点上创建一个磁盘副本。
它用于那些因为太大而无法放入内存的表。
它的访问速度比带有内存副本的方案更慢。
mnesia:create_table(shop,[Attrs,{ram_copies,[node(),someOthernode()]}]).
它会在两个节点上各创建一个常驻内存的表。
如果两个节点都崩溃了,表就会丢失。
内存必须能容纳这个表。
可以在任何一个节点上访问这个表。
mnesia:create_table(shop,[Attrs,{disc_copies,[node()],someOthernode()}]).
它会在多个节点上创建磁盘副本。
无论哪个节点崩溃,我们都能恢复过来。
即使所有节点都崩溃了,表也不会丢失。
代码片段
在上次的代码中补充test即可,其中Attr格式如下所示即可创建相应数据库表
test() ->
Attrs = {attributes, record_info(fields, shop)},
mnesia:create_table(shop,[Attrs]).
%% mnesia:create_table(shop,[Attrs,{disc_copies,[node()]}]),
%% mnesia:create_table(shop,[Attrs,{disc_only_copies,[node()]}]).
%% mnesia:create_table(shop,[Attrs,{ram_copies,[node(),some_node]}]),
%% mnesia:create_table(shop,[Attrs,{disc_copies,[node()],some_node}]).
下面是运行截图,当时没有启动数据库,因此报了节点没有运行的错误,之后使用test函数创建数据库。由于我之前已经创建过了,这里说我已经创建了shop数据库,说明是可以创建成功的。
Mnesia数据库的学习基本上就差不多