2010-12-03 50 views
3

我想用mysqldump在MySQL中轉儲表的一個子集。我有我想從表中選擇的行的id值,存儲在一個文件中。當我使用這些值作爲變量如下:在mysqldump中使用where選項和bash腳本中的長參數列表

ids=`cat ids.csv` 
mysqldump -u root -p db Table --where="id in ($ids)" >> dump.sql 

我得到:

x.bash:行x:在/ usr/bin中/ mysqldump的:參數列表過長

我可能會嘗試將單行變量$ ids(1,2,3,4,..)分成較短的列表,並在一個循環中調用mysqldump,但我目前對於bash腳本中的循環不太好。 或者有可能有更好的方法來解決這個問題。

在此先感謝您的幫助。

編輯

考慮@ ajreal的建議, 如果我做

mysql -u root -p -e "select * into outfile ./dump.sql from db.Table where id in ($ids)" 

我得到 「參數列表太長」 了。

我從另一個環境獲取id值。我運行此腳本的數據庫以及我在where子句中使用id值的數據庫位於不同的環境中。 此外,在此步驟之前,我使用--ignore-table選項創建轉儲文件,忽略在下一步中使用的「表格」表格。所以我寧願爲這一步使用mysqldump。

+1

負,它保存到文件,並使用**的mysql -u -p根.. ajreal 2010-12-03 18:51:06

+0

一些變化後,@Dennis的回答是非常有益的。再次感謝。 – eaykin 2010-12-07 15:31:46

回答

2

試試這個:

xargs -a ids.csv -d '\n' -n 20 sh -c 'mysqldump -u root -p db Table --where="id in ([email protected])" >> dump.sql' x 

x僅僅是一個虛擬值填充$0。可替換地:

xargs -a ids.csv -d '\n' -n 20 sh -c 'mysqldump -u root -p db Table --where="id in ($0 [email protected])" >> dump.sql' 

這將輸入文件轉換成的20行的組和每個組運行mysqldump一次。您可以安全地增加該數字,並且可以使用--max-chars來應用字符上限。您可以使用xargs -a /dev/null --show-limits來查看系統的限制。

xargs -a ids.csv -d '\n' -n 1000 --max-chars=100000 sh -c 'mysqldump -u root -p db Table --where="id in ([email protected])" >> dump.sql' x 

編輯:

試試這個bash腳本。將num設置爲任何合理的值。

#!/bin/bash 
ids=$(< ids.csv) 

saveIFS=$IFS 
IFS=',' 
array=($ids)    # split into an array using commas as the delimiter 
IFS=$saveIFS 
array=(${array[@]/%/,}) # add commas back to each element 

num=100     # number of elements to process at a time 

for ((i=0; i<${#array[@]}; i+=$num)) 
do 
    list=${array[@]:$i:$num} 
    # an excess trailing comma is stripped off in the next line 
    mysqldump -u root -p db Table --where="id in ("${list%,}")" >> dump.sql 
done