2010-09-29 3 views
0

J'ai plusieurs hôtes à partir desquels je veux faire la même requête. Alors imaginez, j'ai sur chaque serveur de la base de données db et un test de table comme:Plusieurs instances de client mysql et stdin

mysql> desc test; 
+-------+------------------+------+-----+---------+-------+ 
| Field | Type    | Null | Key | Default | Extra | 
+-------+------------------+------+-----+---------+-------+ 
| id | int(10) unsigned | NO | PRI |   |  | 
| data | varchar(255)  | YES |  | NULL |  | 
+-------+------------------+------+-----+---------+-------+ 

De toute évidence, chaque test de table a des données différentes, mais ils ont tous le même type. Disons que j'ai 2 hôtes: h1 et h2 qui hébergent ces tables.

Maintenant, j'ai besoin d'écrire un script qui fait la même requête sur chaque hôte et obtient les résultats sur la sortie standard. première idée était:

shell> (mysql -h h1 -u myusername -p mypwd -d db -e "select * from test"; 
     mysql -h h2 -u myusername -p mypwd -d db -e "select * from test";) 
     > out.txt 

Je veux le faire plus rapidement, donc ce que je l'ai été:

shell> (mysql -h h1 -u myusername -p mypwd -d db -e "select * from test" & 
     mysql -h h2 -u myusername -p mypwd -d db -e "select * from test" &) 
     > out.txt 

Le problème est que j'ai une collision dans mon fichier de sortie comme

458 Karma police 
459 876 Paint it black Everything in its right place 
460 street spirit 

Vous avez deux lignes sur la ligne 2.

Mon idée était que mysql tampon le résultat, de sorte que le tampon pourrait se terminer au milieu d'une rangée. Dans cet exemple, le tampon s'arrêterait à 459. Mais je n'arrive pas à comprendre comment résoudre le problème.

Des idées?

Répondre

0

Utilisez une boucle

for host in h1 h2 ; do 
    mysql -h $host -u myusername -p mypwd -d db -e "select * from test" >> out.txt 
done 

>> En utilisant le fichier joint. Les hôtes seront accédés dans l'ordre, pas simultanément, et ainsi tous les résultats de h1 seront entrés en premier, puis tous les résultats de h2. Si cela est insuffisant, il y a une autre option mais c'est plus complexe.

+0

C'était la première idée et cela me donne des résultats valables mais je veux le faire simultanément donc je suis impatient de connaître votre autre option! –

+0

@GuillaumeThomas: L'autre option à laquelle je pourrais penser est la supercherie avec des pipes nommées. Ecrivez la sortie de chaque commande dans un tube séparé, puis lisez-les toutes les deux dans un troisième fichier combiné lorsque vous avez terminé. La partie «difficile» consiste à surveiller les commandes et à déterminer quand elles sont terminées. Si ce que vous voulez est de surveiller les résultats en temps réel, ce n'est pas encore suffisant. – Sorpigal

+0

Oui, je peux comprendre une méthode qui exécute plusieurs processus où chacun enregistre les données dans un fichier, puis concaténer tout dans un fichier. En fait, je m'interrogeais sur une option sur la taille de la mémoire tampon ou quelque chose comme ça –

Questions connexes