2010-09-29 30 views
0

我有幾臺主機從中想要做同樣的查詢。所以,想象一下,我有每個服務器上的數據庫DB和像臺試驗:mysql客戶端和標準輸入的多個實例

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停止。但我無法弄清楚如何解決這個問題。

任何想法?

回答

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

這是第一個想法,它給了我有效的結果,但我想同時做,所以我很想知道你的其他選擇! – 2010-09-29 12:31:35

+0

@GuillaumeThomas:我能想到的另一個選擇是命名管道的欺騙。將每個命令的輸出寫入單獨的管道,然後在完成時將它們讀入第三個組合文件。這裏的「棘手」部分是監控命令並確定它們何時完成。如果你想要實時監控結果,那還不夠。 – Sorpigal 2010-09-29 14:42:09

+0

是的,我可以找出一個方法,它運行幾個過程,每個過程將數據保存在一個文件中,然後將所有內容連接成一個文件。 其實,我想知道一個關於緩衝區大小的選項或者類似 – 2010-09-29 15:35:46

相關問題