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

标签 mysql bash mysqldump

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

相关文章:

bash - 命令的输出作为变量

mysql - 加载数据 MySQL

mysql - 无法删除 mySQL 表。 (错误 1050)

php - 将 PHP 中的 ImageMagick 与 MySQL blob 一起使用的选项?

MySQL 没有从索引中选择正确的行数

mysql - 在 phpmyadmin 中启动无限程序

bash - chroot + execvp + bash

mysql - 来自 group by 的最高条目并使用having与另一个值进行比较

bash - 如何重定向 '&' 命令的日志?

mysql - 从 mysqldump 中检索最后 N 行