У меня есть несколько хостов, из которых я хочу сделать тот же запрос. Итак, представьте, у меня на каждом сервере база данных 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. Но я не могу понять, как решить проблему.
Любые идеи?
Используйте цикл
for host in h1 h2 ; do
mysql -h $host -u myusername -p mypwd -d db -e "select * from test" >> out.txt
done
Использование → добавляет к файлу. Хосты будут доступны по порядку, а не одновременно, и поэтому все результаты из h1 будут введены сначала, а затем все результаты из h2. Если этого недостаточно, то есть другой вариант, но он более сложный.