Comment exécuter une requête depuis psql sans attendre le résultat?

9

Ma requête (pour créer une nouvelle table à partir d'une table existante) prend très longtemps. J'ai donc mis en place une base de données distante dans mon bureau - plus de RAM là-bas.

Je peux me connecter à ma base de données de la maison comme d'habitude avec psql.

Comment puis-je dire au serveur distant d'exécuter ma requête depuis le terminal sans avoir à attendre une réponse?

(postgresql-9.2, environnement Linux)

Edit: je suis ouvert à d'autres solutions, il n'est pas nécessaire d'utiliser psql

user528025
la source

Réponses:

6

Puisque vous déclarez que vous êtes ouvert à d'autres solutions, je pourrais suggérer de regarder des multiplexeurs de terminaux tels que screen ou tmux . À mon avis, tmux est un meilleur choix en raison de son nom unique (plus facile d'obtenir des résultats pertinents dans les moteurs de recherche).

Essentiellement, ce type de logiciel vous permet de vous détacher d'un shell et de reprendre la session ultérieurement.

c0dem4gnetic
la source
1
Cela tmuxfonctionne- t-il de cette façon: «Pourrai-je arrêter ma machine locale et la requête sera toujours traitée sur le serveur distant»?
dezso
Oui, la session s'exécute sur la machine distante - une panne de courant ou une perte de connexion Internet n'est pas un problème (en ce qui concerne la session distante :)). Notez que vous devez démarrer le processus à partir du multiplexeur de terminal (afaik).
c0dem4gnetic
pouvez-vous nous indiquer comment cela est mis en œuvre? psqlle logiciel client est-il en cours d'exécution sur votre machine locale, puis tmuxse sshconnecte-t-il à une machine distante exécutant un serveur postgres? Si c'est le cas, j'ai malheureusement réalisé que cela ne fonctionnera pas avec une instance Redshift sans qu'un EC2 ne fonctionne également.
Merlin
@Merlin tmux s'exécute sur la machine distante et établit la session shell. C'est de cela que vous vous détachez et vous attachez. Lorsque vous exécutez psql localement, vous pouvez l'exécuter dans une session tmux, mais la connexion client n'est conservée que tant que les conditions du réseau le permettent - tout comme une session ssh normale.
c0dem4gnetic
@ c0dem4gnetic je pense que psql doit toujours être installé sur le serveur distant. Il semble que tmux local -> EC2 + tmux + psql se connecte à redshift / postgres db pour maintenir la session en vie.
Merlin
8

Vous pouvez essayer d'envoyer psqlen arrière-plan:

psql -f your_sql_file.sql &

Ou, en vous connectant à la base de données locale, vous pouvez utiliser dblinkpour envoyer une requête vers la base de données distante:

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

Notez que dblink_send_queryvous ne pouvez envoyer qu'une seule requête à la fois. Donc, si vous souhaitez exécuter plusieurs instructions SQL, ce n'est pas votre solution.

Ou, vous pouvez démarrer un pg_agenttravail sur le serveur distant, ce qui ne nécessite aucune intervention manuelle, par conséquent, l'état de votre box d'accueil n'a aucun effet sur l'exécution de votre travail. La même chose peut être obtenue en configurant un travail cron(ou mieux encore, atmerci Erwin) exécutant votre script.

En outre, si vous avez un travail long que vous démarrez manuellement, vous pouvez démarrer une screensession sur le serveur et exécuter le fichier à partir de là. Dans ce cas, vous pouvez vous déconnecter et rentrer chez vous, et le script continuera de fonctionner.

dezso
la source
pg_agent semble assez prometteur. Je vais l'essayer et mettre à jour les résultats.
user528025
3
Ou, pour une opération ponctuelle, la atcommande peut vous servir mieux que cron.
Erwin Brandstetter