gpt4 book ai didi

mysql - 在 bash 脚本中使用带有 where 选项和长参数列表的 mysqldump

转载 作者:可可西里 更新时间:2023-11-01 07:08:31 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com