收藏 分享(赏)

Mnesia用户手册.pdf

上传人:HR专家 文档编号:6224851 上传时间:2019-04-03 格式:PDF 页数:86 大小:605.85KB
下载 相关 举报
Mnesia用户手册.pdf_第1页
第1页 / 共86页
Mnesia用户手册.pdf_第2页
第2页 / 共86页
Mnesia用户手册.pdf_第3页
第3页 / 共86页
Mnesia用户手册.pdf_第4页
第4页 / 共86页
Mnesia用户手册.pdf_第5页
第5页 / 共86页
点击查看更多>>
资源描述

1、Mnesia用户手册4.4.10版Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时特性的Erlang应用。翻译:法无定法mnesia 4.4.10Copyright 1991-2009 Ericsson 2目 录1 、介绍 4 1.1 关于 Mnesia .4 1.2 Mnesia 数据库管理系统( DBMS ) .4 2 、开始 Mnesia .7 2.1 首次启动 Mnesia .7 2.2 一个示例 8 3 、构建 Mnesia 数据库 22 3.1 定义模式 .22 3.2 数据模型 23 3.3 启动 Mnesia 23 3.4 创建新表

2、26 4 、事务和其他上下文存取 .29 4.1 事务属性 29 4.2 锁 30 4.3 脏操作 33 4.4 记录名与表 .34 4.5 作业( Activity )概念和多种存取上下文 .37 4.6 嵌套事务 38 4.7 模式匹配 39 4.8 迭代 .41 5 、其它 Mnesia 特性 45 5.1 索引 45 5.2 分布和容错 .45 5.3 表分片 46 5.4 容表 .53 5.5 无 .54 5.6 多的模式管理 .55 5.7 Mnesia 事 理 .55 5.8 Mnesia 应用 57 5.9 Mnesia 的 .58 5.10 型 58 5.11 Mnesia

3、于 的 61 6 Mnesia 系统信 .64 6.1 数据库配 数据 .64 6.2 (Core Dumps) .64 6.3 表 .64 36.4 .64 6.5 文 .65 6.6 启动时 表 .67 6.7 信 .68 6.8 事务的 .68 6.9 备、currency1“ .69 7 Mnsia 与 SNMP 的合 .74 7.1 合 Mnesia 与 SNMP 74 8 fi录 A : Mnesia 错fl信 75 8.1 Mnesia 的错fl 75 9 fi录 B :备 数 76 9.1 Mnesia 备 行 76 10 fi录 C :作业存取 83 10.1 Mnnesia

4、 存取 行 83 11 fi录 D :分片表 92 11.1 mnesia_frag_hash 行 92 41 、介绍介绍Mnesia数据库管理系统。Mnesia是一个分布式数据库管理系统” ,适合于电信和其它需要持续运行和具备软实时特性的Erlang 应用,是构建电信应用的 系统 开式电信(OTP)的一分。1.1 关于Mnesia 电信系统的数据管理与统的业数据库管理系统(DBMS)多 , 。特 是 多 系统 要 的 容错、需要 数据库管理系统与应用 合运行 实 一个新的数据库管理系统 Mnesia。Mnesia与Erlang 系 用Erlang实 ,实 容错电信系统 需要的 。Mnesia

5、是 业 电信应用 、用 Erlang 的多用 、分布式数据库管理系统。Mnesia 型电信系统的数据管理 ,具备一 统数据库 到的特性。电信应用 多于统数据库管理系统的需 。用Erlang 实 的应用 需要具备宽广的特性,这是统数据库管理系统无法满足的。Mnesia的设计要 如下:1、快速实时的键(key)/值(value) 2、主要用于运营和维护的非实时杂 询3、由于分布式应用 的分布式数据4 、 容错5 、动态重配 6 、杂 Mnesia与其它大分数据库管理系统的区 于其是被设计用于电信应用的型数据管理 。因此,Mnesia 多统数据库的概念,如事务和 询,也 多电信应用数据管理系统的概念

6、,如 速实时操作,可配 的容错 ( 的意义上)“停机 行重新配 的 力 。Mnesia与Erlang 是紧耦合的,得Erlang几乎数据库 。其最大的好是 操作数据时由于数据库与 用的数据格式而带来的阻抗配 消。1.2 Mnesia数据库管理系统(DBMS )1.2.1 特性Mnesia 包含的下列特性组合后可产生一个可容错的分布式数据库管理系统: 数据库模式(schema)可 运行时动态重配 ;5 表 被声明诸如位 (location)、 (replication)和持久(persistence) 属性; 表 被迁移或 到多个 来改 容错性,系统的其它分仍然可 表 行存取来读、和删除记录;

7、表的位 员是透明的。 过表名寻 ,由系统自身保持 表位 的追踪; 数据库事务 够被分布 一个事务 够 用大量 数; 多个事务 够 运行,由数据库管理系统步其执行。nesia 保证会两个 时操作数据; 事务 被赋予要么 系统的 上执行,要么 任何一个 上执行的特性。 “够用脏操作(dirty operations ” )绕过事务减少开销 大大 快运行速度。这 特性的细 下面章 描述。1.2.2 fi 的应用 QLC和Mnesia Session可与Mnesia协产生一 增强Mnesia操作 力的 数。Mnesia Session和QLC都其自己的文档作OTP文档集的一分。下面是Mnesia Se

8、ssion和QLC与Mnesia协用时的主要特性: QLC具Mnesia数据库管理系统优化 询 译器的 力, 根 上让DBMS 效; QLC 用作Mnesia “的数据库 ,它包括被称 列表表达式(list comprehensions ”)的标记方法 用来 表的集合做杂的数据库 询; nesia ession是Mnesia数据库管理系统的一个; nesia ession允 外 (即除Erlang外的 ) Mnesia DBMS。1.2.2.1何时用Mnesia 下列 型的应用用Mnesia : 需要 数据的应用; 需要 数据执行杂 索的应用; 需要用 事务来步 新多 记录的应用; 需要用到软

9、实时特性的应用。一方面,Mnesia可 适合下 型的应用: 理 文 或 文 数据的 ; 需 询 的应用可用标 库模 dets 这是ets模 的 版; 需要 设 的应用应优 用disc_log 模 ; 适合 实时系统。1.2.3 和目的是OTP文档的一分,它描述 构建Mnesia数据库应用“ 集和用Mnesia数据库管理系统和OTP。 述 构 包含大量 实例来 Mnesia的用。 61.2.4 的读 应 系统开 和数据库管理系统,读 Erlang 。1.2.5 关于 包括下列 章: 第2 章开始Mnesia:用一个数据库实例来介绍nesia。实例 示 启动一个Erlang 会,定nesia数据库

10、目录,始化数据库模式,启动nesia 创建表。录始 型的定义。 第currency1 章构建一个Mnesia数据库: 2 章介 的 做更正式地描述,即定 数据 模绍 步“ 义 库式、启动nesia “创建表的nesia 数。 第4 章事 和其它存取上下文:描述使得务 nesia容错实时分布式数据库管理系统的事务属性。 章描述锁的概念,用来保证表的一 性。脏操作可绕过事务系统来改 速度 减少开销。 第 章多种Mnesia 特性:描述 用于构建杂数据库应用的特性。这 特性包括索引、 、分布与容错、无 、 操作、 容表、 “nesia 于 的。 第 章nesia 系统信 :描述包含 nesia数据库

11、目录 的文 ,数据库配 数据,“表的 ,此外,包括备、currency1“的 理。 第 章nesia与fifl的合: nesia与fifl的合。 fi录 nesia错fl信 :列 nesia的错fl信 “其含义。 fi录 备 数:此设 实 的 代列表。 fi录C 作业存取 数:一种可 实 此设 的的 ”。72、开始Mnesia章介绍Mnesia。 要的关于首次始化设 后,会 示一个nesia数据库的实例。这个数据库示例 后面的章 被引用和改明的 构。 章 例明下列强 过 : 启动一个Erlang 定nesia数据库目录; 始化数据库模式(schema); 启动nesia 创建 要 的表。 2.

12、1 首次启动Mnesia 下是nesia系统启动的一个 示。 来自于Erlang shell:unix erl -mnesia dir “/tmp/funky“Erlang (BEAM) emulator version 4.9Eshell V4.9 (abort with G)1 1 mnesia:create_schema(node().ok2 mnesia:start().ok3 mnesia:create_table(funky, ).atomic,ok4 mnesia:info().- Processes holding locks Processes waiting for loc

13、ks Pending (remote) transactions Active (local) transactions Uncertain transactions Active tables System info in version “1.0“, debug level = none mnesia:create_schema(node().ok2 mnesia:start().ok下 模 创建 面定义的表:10-include_lib(“stdlib/include/qlc.hrl“).-include(“company.hrl“).init() -mnesia:create_tabl

14、e(employee,attributes, record_info(fields, employee),mnesia:create_table(dept,attributes, record_info(fields, dept),mnesia:create_table(project,attributes, record_info(fields, project),mnesia:create_table(manager, type, bag, attributes, record_info(fields, manager),mnesia:create_table(at_dep,attribu

15、tes, record_info(fields, at_dep),mnesia:create_table(in_proj, type, bag, attributes, record_info(fields, in_proj).2.2.4 的 下 和 数用来始化Company数据库: % erl -mnesia dir “/ldisc/scratch/Mnesia.Company“。这是一个用来启动Erlang系统的fi 行, 标 -mnesia dir Dir定数据库目录的位 ,系统用1 来应 后面的; mnesia:create_schema(node()。这个 数一个格式;mnesia:

16、create_schema(DiscNodeList) 用来始化一个新的模式(schema)。 这个示例, 一个 上创建一个非分布式的系统。模式的 3章:定义模式。 mnesia:start()。这个 数启动nesia。 3章:启动nesia。Erlang shell 续 过 如下:3 company:init().atomic,ok4 mnesia:info().- Processes holding locks Processes waiting for locks Pending (remote) transactions Active (local) transactions Unce

17、rtain transactions Active tables System info in version “1.0“, debug level = none Ename = Emp#employee.name,Fun = fun() -mnesia:write(Emp),AtDep = #at_depemp = Ename, dept_id = DeptId,mnesia:write(AtDep),mk_projs(Ename, ProjNames)end,12mnesia:transaction(Fun).mk_projs(Ename, ProjName|Tail) -mnesia:w

18、rite(#in_projemp = Ename, proj_name = ProjName),mk_projs(Ename, Tail);mk_projs(_, ) - ok. insert_emp(Emp, DeptId, ProjNames) - ,insert_emp/3的数是:1. Emp是员记录; 2. DeptId是员 作的标 ; 3. ProjNames是员 的 目列表(list)。 insert_emp(Emp, DeptId, ProjNames) - 数创建一个 数 , 数 由Fun来标 。Fun被做一个 的数 数mnesia:transaction(Fun),这意 被

19、做一个事务来运行的Fun具备下列性 : n要么要么 ; 操作 数据记录的代可 行运行 的 而会 。 数可这 用:Emp = #employeeemp_no= 104732,name = klacke,salary = 7,sex = male,phone = 98108,room_no = 221, 015,insert_emp(Me, B/SFR, Erlang, mnesia, otp).: 数 (Funs) Erlang “的 Fun ”表达式 描述。2.2.5 始化数据库 容名klacke的员后, 数据库下列记录:empno name salary se phone roomno 10

20、4currency12 lac e male 99 221 01 Employee一 员数据 应的元组表 :employee, 104732, klacke, 7, male, 98108, 221, 015emp deptname lac e / R At_deptdep表 的元组:at_dep, klacke, B/SFR。emp projname 13lac e Erlang lac e otp lac e mnesia In_projnproj表 的元组:in_proj, klacke, Erlang, klacke, otp, klacke, mnesia表的行与nesia记录 没什

21、么,两个概念是一 的。 替用。一个Mnesia表由nesia记录构。例如,元组boss, klacke, bjarne是一 记录。这个元组的个元素是键( ey),唯一的标 表的行需要表名和键这两个元素。术 标 (object identifier)即oid时是 Tab Key这个 元元组。记录boss, klacke, bjarne的oid是 元元组boss, klacke。元组的一个元素是记录的 型, 个元素是键。取于表的 型是set或bag,一个oid可 应零、一或多 记录。boss, klacke, bjarne记录到数据库时可 隐含一个至今 数据库存 的员,nesia没强 要 这 做。

22、2.2.6 添 记录和关系到数据库增 fi 的录到数据库后, 下列记录作终。employee employee, 104465, “Johnson Torbjorn“, 1, male, 99184, 242,038.employee, 107912, “Carlsson Tuula“, 2, female,94556, 242,056.employee, 114872, “Dacker Bjarne“, 3, male, 99415, 221,035.employee, 104531, “Nilsson Hans“, 3, male, 99495, 222,026.employee, 104

23、659, “Tornkvist Torbjorn“, 2, male, 99514, 222,022.employee, 104732, “Wikstrom Claes“, 2, male, 99586, 221,015.employee, 117716, “Fedoriw Anna“, 1, female,99143, 221,031.employee, 115018, “Mattsson Hakan“, 3, male, 99251, 203,348.dept dept, B/SF, “Open Telecom Platform“.dept, B/SFP, “OTP - Product D

24、evelopment“.dept, B/SFR, “Computer Science Laboratory“.project project, erlang, 1.project, otp, 2.project, beam, 3.project, mnesia, 5.14project, wolf, 6.project, documentation, 7.project, www, 8.上述个标 employees、dept和projects的表是实 记录构的。下面 数据库存 的表表 的是关系。这 表的标 :manager,at_dep和in_proj。manager project, erl

25、ang, 1.project, otp, 2.project, beam, 3.project, mnesia, 5.project, wolf, 6.project, documentation, 7.project, www, 8.at_dep at_dep, 104465, B/SF.at_dep, 107912, B/SF.at_dep, 114872, B/SFR.at_dep, 104531, B/SFR.at_dep, 104659, B/SFR.at_dep, 104732, B/SFR.at_dep, 117716, B/SFP.at_dep, 115018, B/SFP.i

26、n_proj in_proj, 104465, otp.in_proj, 107912, otp.in_proj, 114872, otp.in_proj, 104531, otp.in_proj, 104531, mnesia.in_proj, 104545, wolf.in_proj, 104659, otp.in_proj, 104659, wolf.in_proj, 104732, otp.in_proj, 104732, mnesia.in_proj, 104732, erlang.in_proj, 117716, otp.in_proj, 117716, documentation

27、.in_proj, 115018, otp.in_proj, 115018, mnesia.15房 是员记录的一个属性,这个属性由一个元组构。元组的一个元素标 过道(corridor), 个元素标 这个过道 的实际房 。 也可 择用记录-record(room, corr, no)来代替匿名的元组来表 。2.2.7 询句DBMS 获取数据的 数mnesia:read/3或mnesia:read/1。下列 数增 资:raise(Eno, Raise) -F = fun() -E = mnesia:read(employee, Eno, write),Salary = E#employee.sal

28、ary + Raise,New = E#employeesalary = Salary,mnesia:write(New)end,mnesia:transaction(F).由于 望 增 资后用mnesia:write/1来 新记录, 表 读数据时要获得一个 锁(个数)。会总是 够 一个表直读 值,时 需要 索一个或多个表才 获取 想要的数据,要做到这一 需要 数据库 询。 询总是会比直用mnesia:read 的开销要大多。两种方式来 数据库 询: nesia 数 QLC 2.2.7.1 Mnesia 数下列 数 数据库获取女性员的名 :mnesia:select(employee, #em

29、ployeesex = female, name = $1, _ = _, $1).select运行 事务 作业 , shell 用 需要构 如下 数:all_females() -F = fun() -Female = #employeesex = female, name = $1, _ = _,mnesia:select(employee, Female, , $1)end,mnesia:transaction(F).select表达式匹配employee表 的记录 sexfemale的记录。这个 数可 shell 直 用:161 company:all_females(). (klac

30、kegin)1 company:all_females().atomic, “Carlsson Tuula“, “Fedoriw Anna“也可 4.7 模式匹配(Pattern Matching)一 获得select的描述和其法。2.2.7.2 用QLC 这分 包含 的示例。 QLC 询 的描述QLC。用QLC可 比直用Mnesia 数开销 大, 是它一个好的法。下列 数 数据库取女性员的列表:Q = qlc:q(E#employee.name | E F = fun() -Q = qlc:q(E#employee.name | E company:females().atomic, “Ca

31、rlsson Tuula“, “Fedoriw Anna“统的关系数据库术,上述操作被称 择(selection)和映射(projection)。上面示例的列表表达式包含的一 法元素如下:1 )一个方括 “应视 构建列表(list ” )2)| “ ” 表示 如此这般 ,箭头17F = fun() -Q = qlc:q(E | E Salary = E#employee.salary + Amount,New = E#employeesalary = Salary,mnesia:write(New),1 + over_write(Tail, Amount);over_write(, _) -0

32、.数raise_females/1 返元组atomic, Number,其Number是获得增 资的女性员的数量。错fl时,值aborted, Reason被返。 错的情况下,Mnesia保证任何员的 资都会被增 。33company:raise_females(33).atomic,2183、构建Mnesia数据库章详细介绍设计Mnesia数据库和 构的 步“。 章包括下列分: 定义模式 数据模型 启动nesia 创建新表3.1 定义模式nesia系统的配 模式(schema) 描述。模式是一种特殊的表,它包含诸如表名、个表的存 型(例如,表应存 到RAM、 或 可 是两 “表的位 ) 信

33、。像数据表,模式表 包含的信 只 过与模式 关的 数来 和改。nesia多种方法来定义数据库模式,可移动、删除表或 重新配 表的布局。这 方法的一个重要特性是 表 重配 的过 可被 。例如,可 移动一个表的时执行 操作。特性 需要连续服务的应用非 好。下面的分描述模式管理 要用到的 数,它都返一个元组(tple): atomic, ok或 aborted, Reason 如果成功。3.1.1 模式 数 mnesia:create_schema(NodeList). 数用来始化一个新的 模式, nesia启动 这是一个强 性的要步“。nesia是一个真正分布式的数据库管理系统,而模式是一个系统表

34、,它被 到nesia系统的 上。如果NodeList某一个 已 模式, 数会。 数需要NodeList 上的nesia都停止后才执行。应用 只需 用 数一次,因 只需要始化数据库模式一次 。 mnesia:delete_schema(DiscNodeList). 数 DiscNodeList 上删除旧的模式,它也删除 旧的表和数据。 数需要 数据库 (db_nodes)上的nesia都停止后才 执行 。 mnesia:delete_table(Tab). 数永久删除表Tab的 副 。 mnesia:clear_table(Tab). 数永久删除表Tab的记录。 mnesia:move_tabl

35、e_copy(Tab, From, To). 数 表Tab的拷贝 From 移动到To 。表的存 型type被保,这 移动一个R表到 一个 时, 新 上也维持一个R表。 表移动的过 仍然可事务执行读和 操作 。 mnesia:add_table_copy(Tab, Node, Type). 数 Node 上创建Tab表的备。Type数是ram_copies 、disc_copies或 是disc_only_copies。如果 一19个系统表schema的拷贝到某个 上,这意 要nesia模式也 。这个动作扩展组特定nesia系统 的集合 。 mnesia:del_table_copy(Tab,

36、 Node). 数 Node 上删除Tab表的备, 最后一个备被删除后,表 身也被删除。 mnesia:transform_table(Tab, Fun, NewAttributeList, NewRecordName). 数改变表Tab 记录的格式。它 表 记录 用数Fun明的 数 行 理, 表取得旧的记录 型 理后返新的录 型,表的键( ey)可被改变。-record(old, key, val).-record(new, key, val, extra). Transformer = fun(X) when record(X, old) -#newkey = X#old.key,val

37、= X#old.val,extra = 42end,atomic, ok = mnesia:transform_table(foo, Transformer, record_info(fields, new), new),Fun的数也可是 ignore,它表示只 新表的元(meta)数据,推荐用(因它 元数据和实际数据 产生矛盾)。 可 用 需要用其 离线时做自己的 换。 change_table_copy_type(Tab, Node, ToType). 数改变表的存 型。例如,Node 上定的 存 型的表Tab改 型的表. 3.2 数据模型nesia采用的数据模型是一个扩展的关系数据模型。

38、数据按照表的集合来组,数据记录的关系 过描述实际关系的fi 表来建模。个表包含记录的实例,记录由元组表示。标 ,即oid,由表名和键组。例如,如果 一个员记录用元组表示employee, 104732, klacke, 7, male, 98108, 221, 015。这个录的 标示(Oid)是元组employee, 104732。因此,个表由录(record)组,一个元素是记录名,表的 个元素是标 表特定记录的键( ey)。表名和键的组合是一个被称Oid的 元元组Tab, Key。 4章:记录名与表名,获得 多关于记录名和表名 关系的信 。nesia数据模型是 关系模型的扩展,因模型可 属性 存 任意的Erlang (term)。例如,可 一个属性 存 向 其它表 的oids树,而这种 型的记录 统的关系型” 建模。203.3启动Mnesia 启动Mnesia 关的 上始化一个 的模式。 Erlang系统启动。 设 disc数据库模式的 用 数create_schema(NodeList) 来定义和执行。运行一个两个或 多个 与的分布式系统时, 与的一个 上分 执行 数mnesia:start( )。型的, 一个嵌式环境 mnesia:start( )应启动脚 的一分。一个测 环境或 式环境 ,mnesia:start( )也 够 Erlang

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 产品手册

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报