2010-12-03 14 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を:あまりにも長い引数リストを

私は1行の変数$ ids(1,2,3,4、..)をより短いリストに分割し、ループ内でmysqldumpを呼び出そうとするかもしれませんが、現在はbashスクリプトのループではあまりよくありません。 この問題を解決するには、より良い方法があるかもしれません。

ご協力いただきありがとうございます。 ajrealの提案@考慮

EDIT

、 私は

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

をすれば、私は再び、 "あまりにも長い引数リスト" を取得します。

別の環境からid値を取得します。このスクリプトを実行するデータベースと、where句内で使用するid値を取得するデータベースは、別々の環境にあります。 さらに、この手順を実行する前に、次の手順で使用する「テーブル」テーブルを無視して、--ignore-tableオプションを使用してダンプファイルを作成します。したがって、私はそのステップにもmysqldumpを使用することを好むでしょう。

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を埋めるためだけのダミーの値である:

+1

負、** MySQLの-uルート-pをファイルに保存し、使用.. ajreal

+0

いくつかの変更後、@Dennis'答えはとても役に立ちました。再度、感謝します。 – eaykin

答えて

2

は、この試してみて。あるいは:

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 
+0

デニスありがとうございます。 "xargs -a ids.csv -d '\ n' -n 10 --max-chars = 2394769 bash -c 'mysqldump -u root -p db MyTable --where =" id($ @) ">> dump.sql 'x"は20要素(1,2,3、..、20)の引数リストを持っていますが、実際のファイル(1,2,3 、4、.. 100000)、私は "xargs:bash:引数リストが長すぎます"と思っています。私はまたあなたの他のお勧めとこのエラーを持っています。 2394769がmax-charsに使用できる上限のようです。ファイルが(1,2,3,4、.. 100000) – eaykin

+0

@eaykinの形式の1行で構成されていることを思い出す価値があります。 –

+0

@eaykin:はい、それはタイプミスでした。ごめんなさい。 'c'を' list'に変更してください。私は私の答えを修正します。 –

関連する問題