Konfiguration eines Standalone Systems

Hallo zusammen,

wir haben eine DB auf einem Linux-Rechner, der eine Maschine steuert. In der DB werden Parameter und Betriebsdaten erfasst.

Da nicht auszuschliessen ist, dass ein Anwender den Hauptschalter ausschaltet und damit auch den Linux-Rechner auscchaltet, soll die DB so sicher wie möglich konfiguriert werden.

Laut dem PostgreSQL Administrations-Buch von Peter Eisentraut sollte PostgreSQL einen Stromausfall ohne Probleme verkraften. Gibt es trotzdem Tipps wie man das optimieren könnte, eventuell in der postgresql.conf Datei? Bei den WAL-Einstellung beispielsweise, sollte man wal_buffers erhöhen oder checkpoint_segments und checkpoint_timing verkleinern?

Noch eine Frage generell zu postgresql.conf:
In unserer postgresql.conf ist beispielsweise “#autovacuum == on”. Da diese Zeile auskommentiert ist, ist nun autovacuum aus- oder eingeschaltet?

Danke schon mal für die Antworten,

Kalle

Eine USV kostet nicht die Welt …
Ihr solltet auch über Backups nachdenken. Ein ‘hartes’ Abschalten mach PG eigentlich nicht kaputt, aber das System selber könnte was abbekommen. Ist aber auch nicht sehr wahrscheinlich.


Bei den WAL-Einstellung beispielsweise, sollte man wal_buffers erhöhen oder checkpoint_segments und checkpoint_timing verkleinern?

Nicht nötig, diese Parameter ändert man nicht um ‘bessere’ Chancen nach einem Crash zu haben.

Noch eine Frage generell zu postgresql.conf:
In unserer postgresql.conf ist beispielsweise “#autovacuum == on”. Da diese Zeile auskommentiert ist, ist nun autovacuum aus- oder eingeschaltet?

Danke schon mal für die Antworten,

Kalle

Ist eingeschaltet, das ist die Default-Einstellung, daß es ‘on’ ist. Zumindest in aktuellen Versionen seit 8.x oder so. Die postgresql.conf enthält, im Gegensatz zu z.B. MySQL, per Default alle möglichen Parameter. Dinge, die per Default eingestellt sind, stehen als Kommentar mir ihrer Default-Einstellung drin. Das macht sie zwar größer und für Anfänger unübersichtlicher, aber ich finde es so dennoch besser, weil man sehen kann,was es alles so gibt.

Hallo Andreas,

danke für die schnelle Antwort. Eine USV geht leider nicht, aber mit einem regelmässigen Backup sind wir hoffentlich auf der sicheren Seite.

Ich habe gestern einen Stromausfall mehrere Male simuliert. Soweit ist mit den Daten alles ok. Allerdings habe ich manchmal nach dem erneuten Aufstarten ein Problem mit meinen Sequenzen, sie haben danach Lücken. Da diese Sequenzen Maschinenablauf-Zyklen oder Fehlereinträge zählen, sind diese Lücken beim späteren Anschauen über die GUI unschön :wink:

Da es sich um Standalone-System handelt und nur eine Anwendung auf die DB zugreift und während des Stromausfalls keine DB-Zugriff stattfand, verstehe ich dies nicht so recht. Im Internet habe ich gelesen, dass Sequenz-Lücken entstehen, falls ein INSERT nicht geht. Der Sequenzzähler wird daraufhin nicht wieder zurückgesetzt, obwohl kein Eintrag stattfand. Das passiert bei mir allerdings nicht.

Hast du eine Erklärung, wie dies passieren könnte und wie man es korrigieren könnte?

Spontan habe ich nur 2 Ideen:

  • statt die Sequenz automatisch hochzählen zu lassen, spendiere ich ein weiteres Feld in der Tabelle namens “zaehler”, wo ich “von Hand”, d.h. selbst hochzähle
  • Beim Aufstarten überprüfe ich die Sequenzzähler und korrigiere sie gegebenenfalls

Irgendwie sind allerdings beide Ideen unschön, entweder benötige ich mehr Speicher oder manipuliere die Sequenzen. Gibt es vielleicht noch eine besserer Variante?

Gruß

Kalle

Sequenzen dienen nicht dazu, in einer GUI schön auszusehen. Man verwendet sie insbesondere als PK. Der muß nicht schön sein, sondern stabil. Und das sind Sequenzen.

Da es sich um Standalone-System handelt und nur eine Anwendung auf die DB zugreift und während des Stromausfalls keine DB-Zugriff stattfand, verstehe ich dies nicht so recht. Im Internet habe ich gelesen, dass Sequenz-Lücken entstehen, falls ein INSERT nicht geht. Der Sequenzzähler wird daraufhin nicht wieder zurückgesetzt, obwohl kein Eintrag stattfand. Das passiert bei mir allerdings nicht.

Wohl doch. Du hast ganz sicher zum Zeitpunkt des Stromausfalles offene Transaktionen.

Spontan habe ich nur 2 Ideen:

  • statt die Sequenz automatisch hochzählen zu lassen, spendiere ich ein weiteres Feld in der Tabelle namens “zaehler”, wo ich “von Hand”, d.h. selbst hochzähle

Ganz schlechte Idee, bitte sofort vergessen.

  • Beim Aufstarten überprüfe ich die Sequenzzähler und korrigiere sie gegebenenfalls

Welches Problem gedenkst Du damit zu lösen?

Danke für die Antwort.

Das ist bei mir auch so…

Wohl doch. Du hast ganz sicher zum Zeitpunkt des Stromausfalles offene Transaktionen.

Durchaus möglich. Allerdings sind die Sprünge bei den Sequenzen immer so im Bereich von 20-35. Ich hatte gestern nach einem einzelnen Maschinenzyklus einen Stromausfall provoziert. Das heisst auch ein einzelner INSERT in die Tabelle mit der besagten Sequenz wurde gemacht. Trotzdem hatte ich nach dem Aufstarten eine Lücke von 29 und nicht 1. Naja, irgendwie verstehe ich das nicht :wink:

Ich benötige einen Maschinenzyklen-Zähler . Dieser ist beispielsweise für die Wartungszyklen zuständig oder man will sich über die GUI die Zyklen 645-655 anschauen. Deshalb benötige ich einen lückenlosen Zähler. Wenn nicht über die Sequenz, wie kann ich es dann am effektivsten machen, beim Auslesen über die GUI beispielsweise die Lücken vor der Anzeige herausfiltern?

select foo, bar, batz, row_number() over (order by id) from table

damit hast Du eine lückenlose Nummerierung der Ergebniszeilen

select * from (select foo, bar, batz, row_number() over (order by id) as my_number from table) blafasel where my_number between 645 and 655

zum filtern wie oben dargestellt.

Nimm doch ein Feld das dir automatisiert per Trigger oder default einen Timestamp mitschreibt. Einen Zähler könntest du anschliessend daraus per Windowfunktion rank() erzeugen. Oder du schreibst dir analog dazu eine Funktion, die dem Maximalwert des Zählerfelds bestimmt und um eins erhöht per Trigger/default in das Feld schreibt. Der Offset in Sequenz kann daherkommen, das eine bestimmte Anzahl Werte reserviert werden und die Sequenz entsprechen vorwärts springt. Oder du machst irgendwo 29 andere Sequenzanfragen.

Gruß Uwe

Hast Du die Sequence mit der Option CACHE x (mit x > 1) angelegt? Der cache wird pro Verbindung gehalten, und wenn die Verbindung abbricht (oder eben der Server “abstürzt” dann ist der Cache natürlich weg. Abhilfe wäre hier die Sequence mit CACHE 1 zu definieren.

Wenn der “lückenlose” Zähler nur (und ausschliesslich) für die GUI ist (und es z.B. kein Problem ist das ein bestimmter Eintrag morgen einen anderen Zähler hat) dann geht das sehr einfach mittels row_number() (wie schon erwähnt).

Wenn dieser Zähler aber dauerhaft gleich bleiben soll (und trotzdem lückenlos aufsteigend) dann musst Du andere Methoden verwenden. Ein Beispiel dafür ist z.B. hier: ruby on rails - PostgreSQL gapless sequences - Stack Overflow

Danke an euch für die Antworten.

Ja, der Zähler ist nur für die GUI, somit finde ich den Ansatz mit row_number sehr passend, einen Zeitstempel habe ich in der Tabelle ebenfalls, somit kann ich auch über diesen sortieren.

Wenn der “lückenlose” Zähler nur (und ausschliesslich) für die GUI ist (und es z.B. kein Problem ist das ein bestimmter Eintrag morgen einen anderen Zähler hat) dann geht das sehr einfach mittels row_number() (wie schon erwähnt).

Das verstehe ich noch nicht ganz. Ich mache per INSERT neue Einträge, vorhandene Einträge werden nicht gelöscht. Somit sollten auch morgen noch die gleichen Zählerstände sein, oder?

Cache ist übrigens 1.

Gruß,

Kalle

Wenn die Zeitstempel in den INSERTs grundsätzlich aufsteigend sind, dann natürlich. Wenn Du aber z.B. einen alten Eintrag “nachholst”, dann ändert sich der Zähler. Wenn zwei Datensätze mit exakt dem gleichen Zeitstempel eingefügt werden ist die Reihenfolge nicht definiert und kann sich somit ändern.