Angenommen, Ihre relevanten Tabellen haben einen eindeutigen, indizierten, sequentiellen Schlüssel (oder können damit erweitert werden), dann erhalten Sie einen viel besseren Wert, wenn Sie einfach SELECT ... FROM table ... WHERE key> ausgeben:last_max_key
mit Ausgabe in eine Datei, wobei last_max_key
ist der letzte Schlüsselwert der letzten Extraktion (0 bei der ersten Extraktion). Dieser inkrementelle, entkoppelte Ansatz vermeidet Einführung von Triggerlatenz im Einfügungsdatenpfad (sei es benutzerdefinierte Trigger oder modifizierter Slony) und könnte je nach Setup besser mit der Anzahl der CPUs usw. skalieren. (Wenn Sie jedoch auch UPDATE
verfolgen müssen s , und der fortlaufende Schlüssel wurde von Ihnen hinzugefügt, dann Ihr UPDATE
Anweisungen sollten SET
sein die Schlüsselspalte auf NULL
so erhält es einen neuen Wert und wird von der nächsten Extraktion ausgewählt. Sie wären nicht in der Lage, DELETE
zu verfolgen s ohne Trigger.) Hatten Sie das im Sinn, als Sie Talend erwähnten?
Ich würde die Protokollierungsfunktion nicht verwenden, es sei denn, Sie können die obige Lösung nicht implementieren; Die Protokollierung beinhaltet höchstwahrscheinlich Sperraufwand um sicherzustellen, dass Protokollzeilen sequenziell geschrieben werden und sich nicht überlappen/überschreiben, wenn mehrere Backends in das Protokoll schreiben (überprüfen Sie die Postgres-Quelle). code>AUSWÄHLEN Alternative. Außerdem würde die Anweisungsprotokollierung übertönen keine nützlichen WARN- oder ERROR-Meldungen, und das Parsen selbst erfolgt nicht sofort .
Wenn Sie nicht bereit sind, WALs zu analysieren (einschließlich der Verfolgung des Transaktionsstatus und bereit sind, den Code jedes Mal neu zu schreiben, wenn Sie Postgres aktualisieren), würde ich die WALs auch nicht unbedingt verwenden - das heißt, es sei denn, Sie haben die zusätzliche Hardware verfügbar , in diesem Fall könnten Sie WALs zur Extraktion an einen anderen Computer senden (Auf der zweiten Maschine können Sie Trigger schamlos verwenden -- oder sogar Anweisungsprotokollierung -- denn was auch immer dort passiert, wirkt sich nicht auf INSERT
aus /AKTUALISIEREN
/LÖSCHEN
Leistung auf dem primären Computer.) Beachten Sie, dass Sie in Bezug auf die Leistung (auf dem primären Computer) durch den Versand von WALs einen vergleichbaren Leistungseinbruch (meistens in Bezug auf das Thrashing des Dateisystem-Cache) erhalten würden, es sei denn, Sie können die Protokolle in ein SAN schreiben zu einem anderen Rechner ab dem Ausführen des inkrementellen SELECT
.