我正在尝试使用mysqldump转储MySQL中的一个表的子集。我有从表中选择的行的id值,存储在文件中。当我将这些值用作变量时,如下所示:
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进行该步骤。
答案 0 :(得分:2)
尝试一下:
xargs -a ids.csv -d '\n' -n 20 sh -c 'mysqldump -u root -p db Table --where="id in ($@)" >> 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 $@)" >> 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 ($@)" >> 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
答案 1 :(得分:0)
ids.csv => 91916, 91859, 91861, 91894, 92095, 92166, 91796 ...
#!/bin/bash
ids=$(< offer_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
echo "list: " $list
mysqldump -uroot -h host -p pw --opt --where="offer_id IN ("${list%,}")" db offer_images >> offer_images.sql
done
bash输出:
offer_id IN (91916, 91859, 91861, 91894, 92095)
mysqldump: Got error: 1049: Unknown database '91859,' when selecting the database