使用mysqldump与where选项和bash脚本中的长参数列表

时间:2010-12-03 17:16:21

标签: mysql bash mysqldump

我正在尝试使用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进行该步骤。

2 个答案:

答案 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