我在共享网络主机上有一个 mysql 数据库。它变得太大了,并且带有压缩的单个转储进程被终止。我想单独转储和压缩每个表。用这个命令
mysqldump -uuser -ppass database < show_tables.sql
我可以让它返回所有表的名称,如下所示:
table1
table2
etc
...
如何将其输入到 bash 脚本中,以便将每一行输入到此语法的命令中
mysqldump -uuser -ppass database table_name_goes_here > and_here.sql
?
编辑抱歉各位,我在原始格式中犯了一个错误。查询的输出show tables
不是带有空格分隔的表名的单行;它实际上是每行一个表名,就像现在的格式一样。对于造成的混乱,我深表歉意。
答案1
mysqldump -uuser -ppass database < show_tables.sql |
xargs -I TableName sh -c 'mysqldump -uuser -ppass database TableName > TableName.sql'
答案2
假设表名不能包含换行符,
mysqldump -uuser -ppass database < show_tables.sql |
while IFS= read -r table; do
mysqldump -uuser -ppass database "$table" > and_here.sql
done
答案3
这手动的说
Arrays are assigned to using compound assignments of the form name=(value1 ... valuen),
所以你只需要一种方法将命令的输出放在它所说的地方value1 ... valuen
。
你可以这样做
databases=( $(mysqldump -uuser -ppass database < show_tables.sql) )
然后像这样迭代它们
for database in ${databases[*]}; do
...
done
但以防万一你的表名真的很奇怪并且包含一些换行符,我建议使用它mysql -Bse
来列出数据库和/或表,并while read IFS=
像 jw013 所建议的那样使用(可能没有该-r
选项)。
答案4
mysql database -e 'show tables' | while read table
do mysqldump -uuser -ppass database "$table" -r "$table.sql"
done
也适用于表格中的空格。