mysql客户端和stdin的多个实例

时间:2010-09-29 10:44:14

标签: mysql bash

我有几个主机,我想从中进行相同的查询。所以想象一下,我在每个服务器上都有数据库db和一个表测试,如:

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

显然,每个表测试都有不同的数据,但它们都具有相同的类型。 假设我有2个主机:h1和h2来托管这些表。

现在我需要编写一个脚本,在每个主机上执行相同的查询,并在标准输出上获得结果。第一个想法是:

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 :(得分: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的所有结果。如果这还不够,那么还有另一种选择,但它更复杂。