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