Mnesia用户手册:一,介绍
Mnesia是一个分布式数据库管理系统DBMS,适合于需要连续运算和软实时特性的电信应用及其他Erlang应用 目录 1,介绍
2,Mnesia快速上手 3,构建一个Mnesia数据库 4,事务和其他访问上下文 5,多种Mnesia特性 6,Mnesia系统信息 7,联合Mnesia和SNMP 8,Mnesia错误消息 9,备份callback接口 10,活动访问callback接口 11,碎片表哈希callback接口
1,介绍
本手册介绍了Mnesia数据库管理系统
Mnesia是一个分布式数据库管理系统,它是OTP的一部分,OTP是构建电信应用的控制系统平台
1.1 关于Mnesia
电信系统里数据的管理和传统的商业DBMS有很多相似之处,但不全是
特别是在许多永不宕机系统里的高级别的容错、和应用程序运行在同一地址空间等需求导致我们实现一个全新的DBMS——Mnesia
Mnesia使用Erlang实现,并且和Erlang紧密连接在一起,它提供实现容错电信系统必要的功能 Mnesia是多用户分布式DBMS,特别为使用符号编程语言Erlang写就的工业级电信应用量身打造 Mnesia尝试解决典型的电信系统所以的数据管理问题,它有许多传统数据库所没有的特性
在电信应用里有许多不同于传统DBMS的需求,使用Erlang实现的应用混合了多种特效,这是传统DBMS所满足不了的
Mnesia的设计符合以下需求: 1,快速实时key/value查询
2,复杂的非实时查询,主要为运营和维护 3,分布式数据,为分布式应用 4,高容错 5,动态重配置 6,复杂对象
让Mnesia区别于大部分其他DBMS的是它是设计来解决电信应用典型的数据管理问题 Mnesia有许多传统数据库的概念,如事务和查询
Mnesia也有许多电信应用里的数据管理,如快速实时计算,配置容错级别(通过备份),不宕机的重配置等等
Mnesia和Erlang编程语言紧密结合在一起,这样它在操作数据时没有阻抗失配的问题(数据库和编程语言所操作的数据格式一样)
1.2 Mnesia数据库管理系统 特性
Mnesia包括以下特性,以产生容错、分布式数据库管理系统: 1)数据库结构可以在运行时动态重配置
2)表可以声明含有location、replication和persistence等属性
3)表可以迁移或备份到多个不同的节点来改进容错,系统其他部分仍然可以访问表来读写和删除记录
4)表的位置对程序员透明。程序让表名和系统本身来跟踪表的位置 5)数据库事务可以分布,大量的方法可以在一个事务里调用
6)不同的事务可以并行运行,它们的执行由数据库管理系统保证完全同步。Mnesia保证不会有两个进程同时操作数据
7)事务可以在系统的所有节点上执行,也可以不在任何节点上执行。事务也可以在避免“脏操作”时避开以减少开销并保证运行快速
application插件
QLC和Mnesia Session可以和Mnesia一起使用来提供一些特有的功能,以加强Mnesia的操作能力
Mnesia Session和QLC都有相应的OTP文档 下面是Mnesia Session和QLC的主要特性:
1)QLC拥有为Mnesia数据库管理系统优化查询编译器的能力,从根本上让DBMS更高效 2)QLC可以用来作为Mnesia的数据库编程语言,它包括“list comprehension”,可以用来在一些表上做复杂的数据库查询
3)Mnesia Session是Mnesia数据库管理系统的一个接口
4)Mnesia Session允许外部编程语言(即除了Erlang以外的语言)访问Mnesia DBMS
何时使用Mnesia
在以下几种应用场景使用Mnesia: 1)需要备份数据的应用
2)在数据上执行复杂的搜索的应用
3)需要使用原子事务来同步更新一些记录的应用 4)使用软实时特性的应用
另一方面,Mnesia可能不适合以下类型的应用: 1)处理纯文本或二进制文件数据的程序
2)仅仅需要可以持久化到硬盘的字典查询的应用可以使用标准库dets,它是硬盘版的ets 3)需要硬盘日志功能的应用更应该使用disc_log 4)不适合硬实时系统
Mnesia用户手册:二,Mnesia快速上手 本章介绍了Mnesia:
1)启动一个Erlang session并制定Mnesia数据库的目录 2)初始化数据库结构
3)启动Mnesia并创建必要的表
1,初次启动Mnesia
以下是Mnesia系统启动的一个简单展示:
Java代码
? ? ? ? ? ? ? ? ?
unix> erl -mnesia dir '\ Erlang (BEAM) emulator version 4.9
Eshell V4.9 (abort with ^G) 1>
1> mnesia:create_schema([node()]). ok
2> mnesia:start(). ok
?? 3> mnesia:create_table(funky, []). ?? {atomic,ok} ?? 4> mnesia:info().
?? ---> Processes holding locks <--- ?? ---> Processes waiting for locks <--- ?? ---> Pending (remote) transactions <--- ?? ---> Active (local) transactions <--- ?? ---> Uncertain transactions <--- ?? ---> Active tables <---
?? funky : with 0 records occupying 269 words of mem ?? schema : with 2 records occupying 353 words of mem
?? ===> System info in version \, debug level = none <=== ?? opt disc. Directory \ is used. ?? use fall-back at restart = false ?? running db nodes = [nonode@nohost] ?? stopped db nodes = [] ?? remote = []
?? ram copies = [funky] ?? disc copies = [schema] ?? disc only copies = []
?? [fnonode@nohost,disc copiesg] = [schema] ?? [fnonode@nohost,ram copiesg] = [funky]
?? 1 transactions committed, 0 aborted, 0 restarted, 1 logged to disc ?? 0 held locks, 0 in queue; 0 local transactions, 0 remote ?? 0 transactions waits for other nodes: [] ?? ok
unix> erl -mnesia dir '\Erlang (BEAM) emulator version 4.9
Eshell V4.9 (abort with ^G) 1>
1> mnesia:create_schema([node()]). ok
2> mnesia:start(). ok
3> mnesia:create_table(funky, []). {atomic,ok} 4> mnesia:info().
---> Processes holding locks <--- ---> Processes waiting for locks <--- ---> Pending (remote) transactions <--- ---> Active (local) transactions <--- ---> Uncertain transactions <--- ---> Active tables <---
funky : with 0 records occupying 269 words of mem schema : with 2 records occupying 353 words of mem
===> System info in version \opt disc. Directory %use fall-back at restart = false
running db nodes = [nonode@nohost] stopped db nodes = [] remote = []
ram copies = [funky] disc copies = [schema] disc only copies = []
[fnonode@nohost,disc copiesg] = [schema] [fnonode@nohost,ram copiesg] = [funky]
1 transactions committed, 0 aborted, 0 restarted, 1 logged to disc 0 held locks, 0 in queue; 0 local transactions, 0 remote 0 transactions waits for other nodes: [] ok
上面的例子里:
1)启动erl时参数-mnesia dir '\指定了Mnesia存储数据的目录,windows下可以是erl -mnesia dir 'D:/erl/code'
2)mnesia:create_schema([node()])在本地节点上初始化一个空的schema 3)DBMS通过mnesia:start()启动
4)通过mnesia:create_table(funky, [])来创建表funky 5)mnesia:info()根据数据库的状态来显示信息
2,一个例子
Mnesia数据库组织为一个表的集合,一个表也包含一些属性,如location和persistence 在这个例子中:
1)启动一个Erlang系统,指定数据库位置目录
2)初始化一个新的schema,使用一个属性来指定数据库在那些节点上操作 3)启动Mnesia本身 4)创建数据库表
例子数据库
在这个数据库例子里,我们将创建如下数据库和关系,称为Company数据库 Company ER图:
Java代码
?? id name emp_no name salary sex phone room_no name number ?? \\ / \\ / \\ / ?? Dept - Manager - Employee - In_proj - Project ?? \\ / ?? At_dep
id name emp_no name salary sex phone room_no name number \\ / \\ / \\ / Dept - Manager - Employee - In_proj - Project \\ / At_dep
数据库模型如下:
1)有三个实体:employee,project,department 2)这些实体间有三个关系:
i)一个department由一个employee管理,manager关系 ii)一个employee在一个department工作,at_dep关系 iii)每个employee对多个project工作,in_proj关系
定义结构和内容
我们首先将record定义输入到一个company.hrl文件,该文件定义了如下结构:
Java代码
?? -record(employee, {emp_no, ?? name, ?? salary, ?? sex,