Несколько экземпляров клиента MySQL и стандартного ввода

0

У меня есть несколько хостов, из которых я хочу сделать тот же запрос. Итак, представьте, у меня на каждом сервере база данных db и табличный тест вроде:

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

Очевидно, что каждый тест таблицы имеет разные данные, но все они имеют один и тот же тип. Скажем, у меня есть 2 хоста: h1 и h2, которые размещают эти таблицы.

Теперь мне нужно написать script, которые выполняют один и тот же запрос на каждом хосте и получают результаты на стандартном выходе. Первая идея:

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

Я хочу сделать это быстрее, поэтому я сделал это:

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

Проблема в том, что у меня есть некоторая коллизия в моем выходном файле, например

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

У вас есть две строки в строке 2.

Моя идея заключалась в том, что mysql-буфер возвращает результат, поэтому буфер может заканчиваться посредине строки. В этом примере буфер остановится на 459. Но я не могу понять, как решить проблему.

Любые идеи?

Теги:

1 ответ

0
Лучший ответ

Используйте цикл

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

Использование → добавляет к файлу. Хосты будут доступны по порядку, а не одновременно, и поэтому все результаты из h1 будут введены сначала, а затем все результаты из h2. Если этого недостаточно, то есть другой вариант, но он более сложный.

  • 0
    Это была первая идея, и она дает мне действительные результаты, но я хочу сделать это одновременно, поэтому мне не терпится узнать ваш другой вариант!
  • 0
    @GuillaumeThomas: Другой вариант, о котором я могу подумать, это обман с именованными каналами. Запишите выходные данные каждой команды в отдельный канал и затем прочитайте их обе в третий объединенный файл, когда закончите. «Хитрая» часть здесь контролирует команды и выясняет, когда они закончатся. Если вы хотите отслеживать результаты в режиме реального времени, этого еще недостаточно.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню