Wie führe ich eine Abfrage von psql aus, ohne auf das Ergebnis zu warten?

9

Meine Abfrage (um eine neue Tabelle aus einer vorhandenen Tabelle zu erstellen) dauert sehr lange. Also habe ich in meinem Büro eine entfernte Datenbank eingerichtet - dort mehr RAM.

Ich kann wie gewohnt von zu Hause aus mit psql eine Verbindung zu meiner Datenbank herstellen.

Wie kann ich den Remote-Server anweisen, meine Abfrage vom Terminal aus auszuführen, ohne auf eine Antwort warten zu müssen?

(postgresql-9.2, Linux-Umgebung)

Bearbeiten: Ich bin offen für andere Lösungen, es ist nicht notwendig, psql zu verwenden

user528025
quelle

Antworten:

6

Da Sie angeben, dass Sie für andere Lösungen offen sind, kann ich Ihnen empfehlen, sich Terminal-Multiplexer wie screen oder tmux anzusehen . Meiner Meinung nach ist tmux aufgrund seines eindeutigen Namens eine bessere Wahl (es ist einfacher, relevante Treffer in Suchmaschinen zu erhalten).

Im Wesentlichen können Sie mit dieser Art von Software die Verbindung zu einer Shell trennen und die Sitzung später fortsetzen.

c0dem4gnetic
quelle
1
Funktioniert tmuxdies folgendermaßen: " Kann ich meinen lokalen Computer herunterfahren und die Abfrage wird weiterhin auf dem Remote-Server verarbeitet?"
Dekso
Ja, die Sitzung wird auf dem Remotecomputer ausgeführt. Ein Stromausfall oder ein Verlust der Internetverbindung ist kein Problem (in Bezug auf die Remotesitzung :)). Beachten Sie, dass Sie den Prozess vom Terminal-Multiplexer (afaik) aus starten müssen.
c0dem4gnetic
Können Sie eine Anleitung geben, wie dies umgesetzt wird? psqlWird Client-Software auf Ihrem lokalen Computer ausgeführt und stellt dann tmuxeine sshVerbindung zu einem Remote-Computer her, auf dem ein Postgres-Server ausgeführt wird? Wenn dies der Fall ist, habe ich leider festgestellt, dass dies mit einer Redshift-Instanz nicht funktioniert, ohne dass auch ein EC2 ausgeführt wird.
Merlin
@Merlin tmux wird auf dem Remotecomputer ausgeführt und richtet die Shell-Sitzung ein. Daraus lösen und befestigen Sie. Wenn Sie psql lokal ausführen, können Sie es in einer tmux-Sitzung ausführen, aber die Clientverbindung wird nur so lange beibehalten, wie es die Netzwerkbedingungen zulassen - genau wie bei einer normalen ssh-Sitzung.
c0dem4gnetic
@ c0dem4gnetic Ich denke, psql muss noch auf dem Remote-Server installiert sein. Scheint, als würde sich lokaler tmux -> EC2 + tmux + psql bei redshift / postgres db anmelden, um die Sitzung am Leben zu erhalten.
Merlin
8

Sie können versuchen, psqlin den Hintergrund zu senden :

psql -f your_sql_file.sql &

Wenn Sie eine Verbindung zur lokalen dblinkDatenbank herstellen , können Sie eine Abfrage an die entfernte Datenbank senden:

SELECT dblink_connect('your_connection_name', 'your_connection_string');
SELECT dblink_send_query('your_connection_name', 'your_query');

Beachten Sie, dass jeweils dblink_send_querynur eine Abfrage gesendet werden kann. Wenn Sie also mehrere SQL-Anweisungen ausführen möchten, ist dies nicht Ihre Lösung.

Sie können auch einen pg_agentJob auf dem Remote-Server starten , für den keine manuellen Eingriffe erforderlich sind. Daher hat der Status Ihrer Home-Box keine Auswirkungen auf die Ausführung Ihres Jobs. Das gleiche kann erreicht werden, indem Sie einen cron(oder noch besser, at- danke, Erwin) Job einrichten, der Ihr Skript ausführt.

Wenn Sie einen Job mit langer Laufzeit haben, den Sie manuell starten, können Sie außerdem eine screenSitzung auf dem Server starten und die Datei von dort aus ausführen. In diesem Fall können Sie sich abmelden und nach Hause gehen, und das Skript wird weiter ausgeführt.

dezso
quelle
pg_agent sieht vielversprechend aus. Ich werde es versuchen und die Ergebnisse aktualisieren.
user528025
3
Oder für eine einmalige Operation kann der atBefehl Ihnen besser dienen als cron.
Erwin Brandstetter