SWick

Sysadmin-by-Nature

Entries from January 2010.

Dokumente in CouchDB wieder herstellen
2nd January 2010

Das Dateiformat bei CouchDB ist append-only, d.h. Veränderungen an der Datenbank ändern niemals bestehende Daten, sondern es wird immer am Ende angehängt. Das hat den Vorteil, dass bei einem Absturz o.ä., Daten nicht korrupt gehen können, keine langen Konsistenz-Checks beim Starten durchgeführt werden müssen und kein Locking stattfindet und dadurch extrem skalierbar ist.

Aber wie werden dann Daten in CouchDB gelöscht?

Beim Löschen eines Dokuments (Datensatz) wird dieses mit dem zusätzlichen Attribut _deleted und dem Wert true an die Datenbank angehängt. Da bei jeder Änderung eines Dokuments sich die sogenannte Revision ID ändert, erhält man auch beim Löschen eines Dokuments eine neue Revision ID. Dieses neue (angehängte) Dokument ist jedoch nur noch ein stub (Stumpf). D.h. es beinhaltet (fast) nichts mehr von seinen ursprünglichen Daten.

Einzig die Attribute ID, Revision ID und _deleted sind erhalten. Endgültig gelöscht werden Daten erst, wenn man eine Datenbank in CouchDB compacted. Da wird dann altes Zeug ausgemistet.

Das bedeutet, man kann auf gelöschte Dokumente weiterhin zugreifen, wenn man vorherige Revision IDs verwendet und kann damit z.B. Datensätze wieder herstellen. Da die letzte Revision ja nur noch ein Stumpf ist, muss also eine vorherige verwendet verwenden und es darf vorher solange NICHT compacted werden. Erst nachdem der Un-Delete durchgeführt wurde, darf man compacten. Ansonsten sind die Daten weg...

Details auf der Mailing Liste

Hier mal ein Beispiel, wie man das mit dem Python Modul für CouchDB macht. Hilfe dazu bekam ich auf der Mailingliste. Das Anzeigen von Dokumenten hab ich hier noch mit curl in einer Shell gemacht, damit es anschaulicher ist. Lässt sich aber auch direkt mit dem Python Modul machen. Testumgebung ist eine Ubuntu Karmic Installation, die mit CouchDB 0.10 und CouchDB-Python 0.6 daherkommt...

Anlegen einer Datenbank und Dokument erstellen

import couchdb
server = couchdb.Server()
db = server.create('testdb')
db['somedoc'] = {'type': 'Subtitle'}

Dokument anzeigen

curl -X GET 127.0.0.1:5984/testdb/somedoc
{"_id":"somedoc","_rev":"1-1d0d2e2f53eebed9dc22b38e05f7b585","type":"Subtitle"}

Dokument löschen

curl -X DELETE 127.0.0.1:5984/testdb/somedoc?rev="1-1d0d2e2f53eebed9dc22b38e05f7b585"
{"ok":true,"id":"somedoc","rev":"2-3369b4ffb9474a2ae9c22beb238a53a4"}

Wie man sieht, sagt CouchDB mit "ok":true, dass das Dokument gelöscht wurde und auch eine neue Revision ID bekommen hat.

Alte Revisionen anschauen

curl -X GET 127.0.0.1:5984/testdb/somedoc?rev=2-3369b4ffb9474a2ae9c22beb238a53a4
{"_id":"somedoc","_rev":"2-3369b4ffb9474a2ae9c22beb238a53a4","_deleted":true}

Na, etwas aufgefallen? Unser Attribut "type":"Subtitle" fehlt. Das ist der Stumpf, den ich zuvor angesprochen habe. Um eine vorherige Version mit allen Daten zu erhalten, dürfen wir nicht die letzte Revision ID nehmen, sondern eine davor.

curl -X GET 127.0.0.1:5984/testdb/somedoc?rev=1-1d0d2e2f53eebed9dc22b38e05f7b585
{"_id":"somedoc","_rev":"1-1d0d2e2f53eebed9dc22b38e05f7b585","type":"Subtitle"}

Tadaa. Unser altes Dokument. Um es wieder herzustellen, müssen wir diese Revision ID nutzen.

Dokument wieder herstellen

doc = db.get('somedoc', rev='1-1d0d2e2f53eebed9dc22b38e05f7b585')
db[doc.id] = doc

Mal sehen, was passiert ist:

curl -X GET 127.0.0.1:5984/testdb/somedoc
{"_id":"somedoc","_rev":"2-489230fd027dd8b7a1f96d1a0bd3928a","type":"Subtitle"}

Und siehe da. Unser Dokument ist wieder da. Und zwar erneut mit einer neuen Revision ID...

Tags: couchdb, db, nosql, python.
Best TO-DO list ever
2nd January 2010

Tags: gtd.
Being There
9th January 2010

Schon lange beklage ich ja, dass die traditionellen Filmemacher nur noch Masse statt Klasse produzieren. Also immer mehr Spezial-Effekte und Action statt spannendes und interessantes Kino. Höhepunkt waren die 90er. Da bin ich scheinbar auch nicht der Einzige, der das so sieht. Gute Alternativen gibt's natürlich genug ( Korea, Anime, Bollywood, etc...) aber im Westen ist der Ofen irgendwie seit langem aus. Heute ist mir ein Film unter die Finger gekommen, der mal wieder so richtig genial war. Aber schaut man mal aufs Datum, wundert's mich nicht: 1979

Hauptdarsteller ist Peter Sellers, den viele bestimmt aus Der rosarote Panther kennen. Und auch diese Rolle spielt er echt genial. Der Film hat damals viele Preise abgeräumt. Hier ganz kurz, worum es geht:

Ein geistig zurückgebliebener Gärtner, der die Welt nur aus dem Fernsehgerät kennt
und das Haus seines Dienstherrn nie verlassen hat,
gewinnt durch die Freundschaft mit einem sterbenskranken Industriellen
und dessen jüngerer Frau auch Einfluß auf den amerikanischen Präsidenten
und internationale Politiker. Eine tragikomische, teilweise sarkastische Satire
über die Schwächen der modernen Industrie- und Finanzgesellschaft,
insbesondere den unbegrenzten, abstumpfenden Konsum der allzu mächtigen Fernsehprogramme.
Hervorragend gespielte Unterhaltung mit Substanz.
Tags: movies.

RSS Feed

"People said I should accept the world. Bullshit! I don't accept the world." -- Stallman