Mit E-Mail-Diensten muss sich jeder Administrator früher oder später einmal beschäftigen. Das zur CeBIT erscheinende ADMIN 02/2012 gibt dazu Praxis-Tipps und ... (mehr)

Abspülen

»VACUUM« gibt den Speicher der toten Tupel zur Wiederverwendung für die Tabelle wieder frei, aber nicht in jedem Fall einfach so für das System. Wovon hängt das ab? Ein Glas dient normalerweise nach dem Spülen immer wieder dem gleichen Verwendungszweck. Ein Bierglas wird üblicherweise immer wieder für Bier und ein Weinglas für Wein verwendet. Speicher einfach so an die Festplatte zurückzugeben, käme dem Einschmelzen des Glases gleich. Danach könnte dann das Bierglas entweder wieder als Bierglas oder als Weinglas oder als Fensterscheibe das Licht der Welt erblicken. Wenn es aber nicht eingeschmolzen wird, bleibt es an seinen Verwendungszweck gebunden und erhöht die Kapazität für andere Getränke nicht. Nun werden nach »VACUUM« nochmal 3000 Bierbestellungen und 2000 Bestellungen für alkoholfreies Bier eingefügt und die Statistiken aktualisiert ( Listing 6 ).

Listing 6

Verschiedene Getränkesorten

 

Zu sehen ist, dass die Tabelle trotz 5000 neuer Einträge nicht gewachsen ist. Der Speicherplatz der toten Tupeln (Gläser) muss also wiederverwendet (die Gläser gespült) worden sein.

Es ist ratsam, nach einem »VACUUM« ein »ANALYZE« auszuführen. Daher lässt sich »VACUUM« gleich in Kombination mit »ANALYZE« als ein Befehl ausführen:

VACUUM ANALYZE bier;

Was passiert jetzt aber bei einem UPDATE? 1000 Bestellungen alkoholfreies Bier sollen in Bestellungen für normales Bier umgewandelt werden ( Listing 7 ).

Listing 7

Aus alkoholfreiem Bier wird Bier

 

Die Tabelle ist wieder gewachsen. Statt die alten Werte einfach zu überschreiben, hat PostgreSQL neue Pages hinzugenommen. Die Gründe dafür lassen sich in der MVCC finden. Der Vergleich mit dem Bierstand macht das Ganze einleuchtend: Das alkoholfreie Bier wurde nicht einfach aus den Gläsern ausgeschüttet und Bier hineingefüllt. Es wurden saubere Gläser und – da keine gebrauchten mehr vorhanden waren – neue Gläser für das Bier verwendet. Die Gläser für alkoholfreies Bier warten jetzt erstmal darauf, gespült zu werden.

Um zu zeigen, dass auch tote Tupel, die bei einem »UPDATE« entstehen, nach dem »VACUUM« wiederverwendet werden können, werden nach einem »VACUUM« nochmals 1000 Bestellungen eingefügt ( Listing 8 ).

Listing 8

Bierglas-Recycling

 

Die Tabelle wurde nicht größer, denn die Datenbank hat den freigegebenen Speicher von den ehemaligen toten Tupeln genutzt.

Seitenweise säubern

Diese kleine Demonstration zeigt, wie wichtig es ist, regelmäßig »VACUUM« und auch »ANALYZE« auf Tabellen auszuführen, in denen Daten geändert oder gelöscht werden. Ohne »VACUUM« kann es am Ende passieren, dass die Tabelle zwar nur einen Datensatz enthält, aber trotzdem einen Großteil des Plattenspeichers belegt und immer mehr Speicher haben möchte.

Ein einfaches »VACUUM« gibt jedoch nur dann Speicher an das System zurück, wenn es komplette Pages freiräumt, die sich am Ende befinden. Dazu muss die Page, die als Letztes hereingekommen ist, durch »VACUUM« komplett freigeräumt werden.

Als Letztes wurden die Bestellnummern von 15001 bis 16000 eingefügt. Diese werden jetzt gelöscht ( Listing 9 ).

Listing 9

Bestellung retour

 

Die Tabelle ist nicht geschrumpft. Es wurde zwar das letzte »INSERT« zurückgenommen – aber die Daten waren nicht auf den letzten Pages gelandet, sondern auf Pages, die ziemlich weit vorne lagen.

Das letzte Mal gewachsen ist die Tabelle mit den Bestellnummern 14001 bis 15000. Deshalb werden jetzt diese Bestellungen gelöscht. ( Listing 10 ).

Listing 10

Letzte Pages räumen

 

Jetzt wurden Pages an das System zurückgegeben. Im Beispiel des Bierstands wurden jetzt Gläser eingeschmolzen.

Führt man auf sich verändernden Tabellen nicht regelmäßig »VACUUM« aus, so nimmt die Tabelle immer mehr Speicher für sich in Anspruch, bis am Ende nur noch ein Ausweg bleibt:

VACUUM FULL Tabellenname;

Mit der Option »FULL« räumt PostgreSQL richtig auf. Die Daten werden auf der Festplatte neu sortiert und lückenlos in Pages geschrieben. Dieser Prozess dauert lange. Dabei wird während eines »VACUUM FULL« die komplette Tabelle gelocked. Weder Schreiben noch Lesen ist dann auf der Tabelle möglich. Nach einem »VACUUM FULL« muss in jedem Fall »ANALYZE« laufen, damit die Statistiken aktualisiert werden.

Neben einem normalen »VACUUM« und auch neben einem »ANALYZE« kann alles ausgeführt werden, außer »VACUUM« , »ANALYZE« , »CREATE INDEX« , »ALTER TABLE« , »DROP TABLE« , »TRUNCATE« , »REINDEX« , »CLUSTER« und »LOCK TABLE« . Es ist daher ratsam, es gar nicht erst soweit kommen zu lassen, dass »VACUUM FULL« benötigt wird.

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023