我正在尝试使用 mysqldump 在 MySQL 中转储表的子集。我有我想从表中选择的行的 id 值,存储在一个文件中。当我将这些值用作变量时,如下所示:
ids=`cat ids.csv`
mysqldump -u root -p db Table --where="id in ($ids)" >> dump.sql
我得到:
x.bash: line x: /usr/bin/mysqldump: Argument list too long
我可能会尝试将单行变量 $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。
最佳答案
试一试:
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
关于mysql - 在 bash 脚本中使用带有 where 选项和长参数列表的 mysqldump,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4348065/