Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql客户端和stdin的多个实例_Mysql_Bash - Fatal编程技术网

mysql客户端和stdin的多个实例

mysql客户端和stdin的多个实例,mysql,bash,Mysql,Bash,我有几个主机,我想从中执行相同的查询。想象一下,我在每台服务器上都有数据库数据库和一个表测试,如: mysql> desc test; +-------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+-------+

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

mysql> desc test;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(10) unsigned | NO   | PRI |         |       | 
| data  | varchar(255)     | YES  |     | NULL    |       | 
+-------+------------------+------+-----+---------+-------+
显然,每个表测试有不同的数据,但它们都有相同的类型。 假设我有两个主机: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处停止。但我不知道如何解决这个问题

有什么想法吗?

使用循环

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

使用>>附加到文件。主机将按顺序访问,而不是同时访问,因此将首先输入来自h1的所有结果,然后输入来自h2的所有结果。如果这还不够,那么还有另一个选择,但它更复杂。

这是第一个想法,它给了我有效的结果,但我想同时做,所以我很想知道你的其他选择@纪尧姆:我能想到的另一个选择是使用命名管道进行欺骗。将每个命令的输出写入一个单独的管道,然后在完成后将它们读取到第三个组合文件中。这里的“棘手”部分是监视命令并确定它们何时完成。如果你想实时监控结果,那还不够。是的,我可以找到一种方法,它运行几个过程,每个过程将数据保存在一个文件中,然后将所有内容连接到一个文件中。实际上,我想知道一个关于缓冲区大小的选项,或者类似的东西,缓冲mysql端的输出不会有什么好处,因为它无法知道另一个实例当前是否正在编写。为了完成您似乎想要的任务,将两个源的输出行交错,您需要一个更复杂的程序,该程序能够以最快的速度获取行,存储行,并且仅当可以在输出流上获得锁时才输出。这在bash中可能是不可能的,但可以用更复杂的语言(例如perl)来实现。如果您想要纯bash解决方案,我建议您询问serverfault或irc.freenode.net#bash