<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Mnesia</id>
	<title>Mnesia - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Mnesia"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Mnesia&amp;action=history"/>
	<updated>2026-05-26T15:52:59Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Mnesia&amp;diff=2739551&amp;oldid=prev</id>
		<title>imported&gt;Thomas Dresler: Kommasetzung</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Mnesia&amp;diff=2739551&amp;oldid=prev"/>
		<updated>2024-07-31T21:40:28Z</updated>

		<summary type="html">&lt;p&gt;Kommasetzung&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
{{Infobox Software&lt;br /&gt;
|Maintainer           = Ericsson/Das Erlang-Projekt&lt;br /&gt;
|Hersteller           = [[Ericsson]]&lt;br /&gt;
|AktuelleVersion      = 4.21.3&amp;lt;ref&amp;gt;{{Internetquelle |url=https://www.erlang.org/doc/apps/mnesia/release_notes.html |titel=Mnesia Release Notes |titelerg=Versionshinweise |werk=erlang.org |hrsg=Ericsson AB |sprache=en |abruf=2019-09-21}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
|AktuelleVersionFreigabeDatum = 30. Januar 2023&lt;br /&gt;
|Betriebssystem       = Unixe&amp;amp;nbsp;([[Linux]],&amp;amp;nbsp;[[FreeBSD]],&amp;amp;nbsp;[[macOS]]), [[Microsoft Windows|Windows]] (alle Plattformen, auf denen Erlang läuft)&lt;br /&gt;
|Programmiersprache   = [[Erlang (Programmiersprache)|Erlang]]&lt;br /&gt;
|Kategorie            = [[Datenbank]]managementsystem&lt;br /&gt;
|Lizenz               = EPL (Erlang Public License; ähnlich [[Mozilla Public License]])&lt;br /&gt;
|Deutsch              = nein&lt;br /&gt;
|Website              = [https://www.erlang.org/ erlang.org], [https://www.erlang.org/doc/man/mnesia.html mnesia(3erl)]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mnesia&amp;#039;&amp;#039;&amp;#039; ist ein in [[Erlang (Programmiersprache)|Erlang]] geschriebenes Datenbanksystem. Es wird ausschließlich im direkten Verbund mit Erlang benutzt, eine Anbindung an andere Sprachen existiert nicht. Mnesia besitzt weiche [[Echtzeitsystem|Echtzeit]]-Fähigkeiten, kann leicht [[Verteiltes System|verteilt]] konfiguriert werden und ist außerdem auf Geschwindigkeit optimiert.&lt;br /&gt;
&lt;br /&gt;
== Name ==&lt;br /&gt;
[[Joe Armstrong (Informatiker)|Joe Armstrong]], einer der Hauptentwickler von Erlang, beantwortet die Frage nach dem Namen &amp;#039;&amp;#039;Mnesia&amp;#039;&amp;#039; in seinem Buch &amp;#039;&amp;#039;Programming Erlang&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;Joe Armstrong: &amp;#039;&amp;#039;Programming Erlang: Software For A Concurrent World.&amp;#039;&amp;#039; In: &amp;#039;&amp;#039;Pragmatic Bookshelf.&amp;#039;&amp;#039; Raleigh (North Carolina) 2007, ISBN 1-934356-00-X, S. 316 (englisch).&amp;lt;/ref&amp;gt; folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=The original name was [[Amnesie|Amnesia]]. One of our bosses didn’t like the name. He said, ‘You can’t possibly call it Amnesia–you can’t have a database that forgets things!’. So we dropped the A and the name stuck.&lt;br /&gt;
 |Autor=[[Joe Armstrong (Informatiker)|Joe Armstrong]]&lt;br /&gt;
 |Übersetzung=Der ursprüngliche Name lautete [[Amnesie|Amnesia]]. Aber einer unserer Chefs mochte diesen Namen nicht. Er meinte: ‚Ihr könnt das Ding doch nicht Amnesia nennen – ihr könnt keine Datenbank entwickeln, die Sachen vergisst!‘. Also haben wir das A weggelassen und der Name blieb.}}&lt;br /&gt;
&lt;br /&gt;
== Einsatz ==&lt;br /&gt;
Wie schon Erlang wurde Mnesia für den Einsatz in Telekom-Umgebungen entwickelt, in denen es auf niedrige Latenz und sehr hohe Verfügbarkeit sowie [[Nebenläufigkeit|Parallelität]] ankommt. Mnesia wurde nicht entworfen, um herkömmliche, [[SQL]]-basierte Datenbanken zu ersetzen, sondern eher als in die Sprache eingebettete Datenbank, ähnlich wie die [[Berkeley DB]].&lt;br /&gt;
&lt;br /&gt;
== Integration in Erlang ==&lt;br /&gt;
Mnesia wurde stark auf Erlang spezialisiert, so unterstützt es das Speichern jeglicher Erlang-Terme. Erlang-Terme sind hierbei die in der Sprache selbst verwendete Datenstrukturen-/Typen:&lt;br /&gt;
* Listen: &amp;lt;code&amp;gt;[1,2,3]&amp;lt;/code&amp;gt;&lt;br /&gt;
* Skalare: &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt;&lt;br /&gt;
* Atome: &amp;lt;code&amp;gt;helloworld&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;xyz&amp;lt;/code&amp;gt;&lt;br /&gt;
* Tupel: &amp;lt;code&amp;gt;{hello,1,3.4,[1,2,3],{5,abc}}&amp;lt;/code&amp;gt;, Records: &amp;lt;code&amp;gt;R = #recordname{a=1,b=2}&amp;lt;/code&amp;gt;&lt;br /&gt;
* Funs: &amp;lt;code&amp;gt;fun() -&amp;gt; doSomething() end.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es entfällt also die Umwandlung von Datentypen.&lt;br /&gt;
&lt;br /&gt;
Eine Verwendung von anderen Sprachen als Erlang ist nicht möglich. Innerhalb von Erlang wird das Modul &amp;lt;code&amp;gt;mnesia&amp;lt;/code&amp;gt; genutzt, um mit dem Datenbankserver zu kommunizieren, der mit diversen Erlang-Prozessen arbeitet.&lt;br /&gt;
&lt;br /&gt;
== Speichermodell ==&lt;br /&gt;
Mnesia speichert Erlang-Tupel in Tabellen. Die Tupel sind nach folgendem Muster aufgebaut:&lt;br /&gt;
&lt;br /&gt;
 {Tabellenname,Key,Feld1,Feld2,...}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Tabellenname&amp;#039;&amp;#039; dient Mnesia dazu, den Datensatz in die richtige Tabelle zu stecken, während &amp;#039;&amp;#039;Key&amp;#039;&amp;#039; ein in der jeweiligen Tabelle eindeutiger Schlüssel ist (typisch für relationale Datenbanksysteme), zum Beispiel eine fortlaufende Nummer. Der Rest des Tupels sind andere Datenfelder.&lt;br /&gt;
&lt;br /&gt;
Aufgrund dieser Struktur werden zumeist Records für die Arbeit mit Mnesia genutzt. Der Record &amp;lt;code&amp;gt;-record(table1,{field1,field2=defaultvalue}).&amp;lt;/code&amp;gt; wird in ein Tupel &amp;lt;code&amp;gt;{table1,Wert1,Wert2}&amp;lt;/code&amp;gt; umgewandelt, und ist damit gut geeignet in Mnesia gespeichert zu werden.&lt;br /&gt;
&lt;br /&gt;
== Transaktionen ==&lt;br /&gt;
Das Lesen, Schreiben und Abfragen sollte nur in sogenannten [[Transaktion (Informatik)|Transaktionen]] (&amp;#039;&amp;#039;transactions&amp;#039;&amp;#039;) stattfinden. Transaktionen sind Erlang-&amp;#039;&amp;#039;Funs&amp;#039;&amp;#039; (Fun ist in Erlang synonym mit [[Anonyme Funktion|anonymer Funktion]]), in denen die Mnesia-Befehle für Lesen, Schreiben und Abfragen ausgeführt werden. Eine solche Fun wird dann dem Mnesia-Transaktionsmanager übergeben.&lt;br /&gt;
&lt;br /&gt;
Der Sinn von Transaktionen besteht darin, Atomarität (Unteilbarkeit) und dadurch Konsistenz zu erreichen. Entweder die gesamte Transaktion hat Erfolg, oder die gesamte Transaktion schlägt fehl. Die Datenbank bleibt immer konsistent. Beispiel: Zwei zusammenhängende Datensätze sollen in die Datenbank geschrieben werden. Das Schreiben des ersten Datensatzes ist erfolgreich, das des zweiten schlägt fehl (zum Beispiel wegen eines vergessenen Feldes im einzufügenden Datensatz). Nun wird der erste Schreibvorgang wieder rückgängig gemacht, um wieder Konsistenz zu erreichen. Danach wird das Programm darüber informiert, dass etwas schiefgelaufen ist.&lt;br /&gt;
&lt;br /&gt;
Neben Transaktionen gibt es &amp;#039;&amp;#039;dirty operations&amp;#039;&amp;#039;, also schmutzige Operationen, die um ein Vielfaches schneller sind als Transaktionen, dafür aber keinerlei Garantie für Konsistenz oder Atomarität geben.&lt;br /&gt;
&lt;br /&gt;
== Die Arbeit mit Mnesia – einige kleine Beispiele ==&lt;br /&gt;
=== Schema ===&lt;br /&gt;
Bevor die Datenbank genutzt werden kann, muss ein sogenanntes &amp;#039;&amp;#039;Schema&amp;#039;&amp;#039; erstellt werden. Ein Schema ist eigentlich nur ein Ordner im aktuellen Verzeichnis, das nach dem Muster &amp;#039;&amp;#039;Mnesia.node()&amp;#039;&amp;#039; benannt ist, bei einer unbenannten Erlang-Instanz also &amp;#039;&amp;#039;Mnesia.nonode@nohost&amp;#039;&amp;#039;. Das Schema wird genutzt, um je nach Modus Daten auf der Festplatte zu sichern und die Verlinkung mit anderen Mnesia-Instanzen zu verwalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
mnesia:create_schema([&amp;#039;node1@host.example.org&amp;#039;,&amp;#039;node2@host.example.org&amp;#039;,node()]).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser Befehl erstellt für die beiden genannten Knoten (Erlang-VMs, die in der Lage sind, über das Netzwerk angesprochen zu werden) sowie den aktuellen Knoten (&amp;#039;&amp;#039;node()&amp;#039;&amp;#039;) die notwendigen Dateien. &amp;#039;&amp;#039;table1&amp;#039;&amp;#039; ist zurzeit die einzige Tabelle in der Datenbank. Die gesamte Struktur nimmt bei 20 Einträgen etwa 28&amp;amp;nbsp;[[Kilobyte|kB]] ein, eine leere Datenbank benötigt etwa 20&amp;amp;nbsp;kB.&lt;br /&gt;
&lt;br /&gt;
 Mnesia.node1@host.example.org/&lt;br /&gt;
 ├── DECISION_TAB.LOG&lt;br /&gt;
 ├── LATEST.LOG&lt;br /&gt;
 ├── schema.DAT&lt;br /&gt;
 ├── table1.DCD&lt;br /&gt;
 └── table1.DCL&lt;br /&gt;
&lt;br /&gt;
Das Schema speichert also die Metainformationen für die Arbeit mit einer Datenbank. Das Verknüpfen mit einem laufenden Mnesia-Server geschieht automatisch, d.&amp;amp;nbsp;h. wenn ein Mnesia-Server in einem Node gestartet wird und er ein Schema mit zum Node-Namen passendem Namen findet, wird dieses genutzt.&lt;br /&gt;
&lt;br /&gt;
Nachdem ein Schema angelegt wurde, muss Mnesia auf allen beteiligten Nodes gestartet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
mnesia:start().&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tabellen ===&lt;br /&gt;
Ein wichtiges Grundelement von relationalen Datenbanken sind Tabellen. Eine Tabelle besteht in Mnesia aus einer Reihe von Erlang-Tupeln, die alle mit demselben Namen beginnen, nämlich dem der Tabelle. Am besten hierfür geeignet ist ein Erlang-Record:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
-record(table1,{field1,field2=defaultvalue}).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
mnesia:create_table(table1,[{attributes,record_info(fields,table1)},{disc_copies,[&amp;#039;node1@host.example.org&amp;#039;,&amp;#039;node2@host.example.org&amp;#039;]}]).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;table1&amp;#039;&amp;#039; ist der Name der Tabelle, der mit dem Record-Namen übereinstimmen muss. Das zweite Argument ist eine Liste von Optionstupeln. Hier verwendet:&lt;br /&gt;
* &amp;lt;code&amp;gt;{attributes,[field1,field2]}&amp;lt;/code&amp;gt; – Liste der Felder. &amp;lt;code&amp;gt;record_info()&amp;lt;/code&amp;gt; gibt die Liste der Felder des gegebenen Records zurück.&lt;br /&gt;
* &amp;lt;code&amp;gt;{disc_copies,[&amp;#039;node1@host.example.org&amp;#039;,&amp;#039;node2@host.example.org&amp;#039;]}&amp;lt;/code&amp;gt; – Speichermethode. Neben &amp;#039;&amp;#039;disc_copies&amp;#039;&amp;#039; (Ort: RAM; Sicherung auf Festplatte) existieren nur-RAM (&amp;#039;&amp;#039;ram_copies&amp;#039;&amp;#039; bzw. kein Argument) und nur-Festplatte (&amp;#039;&amp;#039;disc_only_copies&amp;#039;&amp;#039;). Die Nodeliste enthält dabei immer nur Nodes, die beim Erzeugen des Schemas angegeben wurden, da ein spezielles Cookie zwischen den Schemas übereinstimmen muss. Diese Nodeliste konfiguriert die Tabelle so, dass Kopien der Tabelle auf zwei Nodes abgelegt werden, aber nicht auf dem Haupt-Node, auf dem die Anwendung läuft, die diese Funktion gerade ausführt. Ein typisches Szenario wäre eine Frontend-Backend-Anwendung, bei der der Anwendungsserver vor allem Rechenleistung besitzt und die beiden anderen Nodes den Speicherplatz bereitstellen.&lt;br /&gt;
&lt;br /&gt;
=== Schreiben ===&lt;br /&gt;
Zunächst wird ein Funktionsobjekt mit dem gewünschten Verhalten erzeugt und dann dem Transaktionsmanager übergeben. Die in Transaktionen verwendeten Mnesia-Funktionen laufen nur im Transaktionskontext, d.&amp;amp;nbsp;h. es ist mit diesen Funktionen nicht möglich, außerhalb einer Transaktion die Datenbank zu ändern.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
Transaction_Fun = fun() -&amp;gt;&lt;br /&gt;
    Data = #table1{field1=1337,field2=42},&lt;br /&gt;
    mnesia:write(Data)&lt;br /&gt;
    end.&lt;br /&gt;
&lt;br /&gt;
mnesia:transaction(Transaction_Fun).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Abfragen ===&lt;br /&gt;
Das Abfragen geschieht mittels der in Erlang oft eingesetzten Listenkomprehensionen. Um alle Werte von &amp;#039;&amp;#039;field1&amp;#039;&amp;#039; in Datensätzen, bei denen &amp;#039;&amp;#039;field2&amp;#039;&amp;#039; größer als 100 ist zu extrahieren, wird folgende Abfrage formuliert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
Transaction_Fun = fun() -&amp;gt;&lt;br /&gt;
    Query = qlc:q([X#table1.field1 || X &amp;lt;- mnesia:table(table1), X#table1.field2 &amp;gt; 100 ]),&lt;br /&gt;
    qlc:e(Query)&lt;br /&gt;
    end.&lt;br /&gt;
&lt;br /&gt;
mnesia:transaction(Transaction_Fun).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;QLC&amp;#039;&amp;#039; ist hierbei ein Modul zur Abfrage von verschiedenen Tabellen, zum Beispiel ETS oder eben Mnesia. &amp;#039;&amp;#039;qlc:q()&amp;#039;&amp;#039; kompiliert eine Listenkomprehension, &amp;#039;&amp;#039;qlc:e()&amp;#039;&amp;#039; führt sie aus und gibt die Werte zurück. Mit diesen Listenkomprehensionen sind auch Joins möglich.&lt;br /&gt;
&lt;br /&gt;
Das SQL-Äquivalent für diese Abfrage würde folgendermaßen lauten:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT field1 FROM table1 WHERE field2 &amp;gt; 100&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Freies Datenbankmanagementsystem]]&lt;br /&gt;
[[Kategorie:Relationales Datenbankmanagementsystem]]&lt;br /&gt;
[[Kategorie:Erlang (Programmiersprache)]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Thomas Dresler</name></author>
	</entry>
</feed>