2008-09-01 3 views
7

Ich erwäge Log-Versand von Write Ahead Logs (WAL) in PostgreSQL, um eine Warm-Standby-Datenbank zu erstellen. Jedoch habe ich eine Tabelle in der Datenbank, die jeden Tag eine große Menge von INSERT/DELETEs empfängt, aber die Daten darin nicht interessiert. Um die Menge der produzierten WALs zu reduzieren, frage ich mich: Gibt es eine Möglichkeit, zu verhindern, dass Aktivitäten an einem Tisch in den WALs aufgezeichnet werden?Wie verhindert man Write Ahead Logging an nur einer Tabelle in PostgreSQL?

Antwort

4

Leider glaube ich nicht, dass es gibt. Die WAL-Protokollierung arbeitet auf der Seitenebene, die viel niedriger als die Tabellenebene ist und nicht einmal weiß, welche Seite Daten aus welcher Tabelle enthält. Tatsächlich wissen die WAL-Dateien nicht einmal, welche Seiten zu welcher Datenbank gehören.

Sie könnten Ihre Tabelle mit hoher Aktivität in eine völlig andere Instanz von PostgreSQL verschieben. Das scheint drastisch, aber ich kann mir keinen anderen Weg vorstellen, um zu vermeiden, dass diese Aktivität in Ihren WAL-Dateien auftaucht.

0

Um eine Option zu meiner eigenen Frage anzubieten. Es gibt temp tables - "temporäre Tabellen werden automatisch am Ende einer Sitzung oder optional am Ende der aktuellen Transaktion gelöscht (siehe ON COMMIT unten)" - was ich denke, dass keine WALs generiert werden. Trotzdem ist dies möglicherweise nicht ideal, da die Erstellung der Tabelle & im Code enthalten sein muss.

+1

Temp-Tabellen generieren WAL-Einträge für Systemkatalog-Updates (pg_class), auch wenn sie nicht für Datenaktualisierungen (ich bin mir nicht sicher). Sie können die ausgelastete Tabelle an anderer Stelle verschieben und die dblink-Schnittstelle verwenden, um darauf zuzugreifen oder zu einem tabellenbasierten Replikationssystem wie Slony zu wechseln. – mjy

-4

Ich würde memcached für solche Anwendungsfälle betrachten. Sie können die Last sogar über eine Menge billiger Maschinen verteilen.

8

Lief über diese alte Frage, die jetzt eine bessere Antwort hat. Postgres 9.1 führte "Unlogged Tables" ein, bei denen es sich um Tabellen handelt, die ihre DML-Änderungen nicht in WAL protokollieren. Weitere Informationen finden Sie in den Dokumenten, aber zumindest gibt es eine Lösung für dieses Problem.

Siehe Waiting for 9.1 - UNLOGGED tables von Depesz und die 9.1 docs.

+0

Wenn Sie in den Versionen vor 9.1 die Tabelle vor der Ausführung der Einfügungen abschneiden, werden diese Einfügungen ebenfalls nicht protokolliert. –

+0

Ich glaube, das ist nur wahr, wenn Sie die truncate/einfügen innerhalb der gleichen Transaktion, aber noch wichtiger nicht für den Fall mit einem warmen Standby, wo die Einfügedaten noch in den WAL-Stream gehen müssen, um an den anderen Server geliefert werden . – xzilla

+0

Sie haben Recht mit der Transaktion (ich dachte, das war offensichtlich;)) Guter Punkt über den Warm-Standby-Modus. –