我必须为我们的数据库编写一个小的多线程mysqldump脚本,因为一个表包含一个空格,所以我遇到了一些问题。
我的第一次尝试非常简单:
for TABLE in `mysql -u user -ppassword -e 'show tables;' dbname`
do
while [ 1 ]
do
if [ `jobs -r | wc -l` -lt $MAXTHREADS ]
then
break
else
sleep 1
fi
done
mysqldump -u user -ppassword dbname $TABLE
done不幸的是,有一张桌子,里面有一个空格。我在googled上搜索了一下,了解了如何将for循环与命令的多行输出结合使用,并且更改$IFS变量是一个常见的解决方案。所以我将它改为\n\b (当我只使用\n时,不知何故$IFS是空的),但这不是一个好主意,因为它导致mysql命令不再工作。
我认为,当我预先获得表并在每次使用for循环中的mysqldump时将$IFS改回时,这应该不是问题。但是我再一次弄错了,因为我现在只有一行所有的表。
我当前的代码:
TABLES=$(mysql -u user -ppassword -e "show tables" dbname | tail -n +2)
OIFS="$IFS"
AIFS=$(echo -en "\n\b")
IFS="$AIFS"
for TABLE in "$TABLES"
do
IFS="$OIFS"
while [ 1 ]
do
if [ `jobs -r | wc -l` -lt $MAXTHREADS ]
then
break
else
sleep 1
fi
done
mysqldump -u user -ppassword dbname $TABLE
IFS="$AIFS"
done
IFS="$OIFS"当我尝试回显$TABLES变量时,我每行得到一个表,但是for循环只使用包含所有表的$TABLE变量运行一次。
提前感谢
kiro
发布于 2012-06-08 23:14:11
使用while循环而不是for:
mysql -u user -ppassword -e "show tables" dbname | tail -n +2 | while read TABLE
do
...
done...unless您需要在循环内设置任何变量,并在循环退出后使它们可用。因为这使得while循环成为管道的一部分,所以它在子shell中运行,并且变量等不会传输到主shell。如果需要在主shell中运行循环,可以使用bash的进程替换功能,而不是标准管道:
while read TABLE
do
...
done < <(mysql -u user -ppassword -e "show tables" dbname | tail -n +2)https://stackoverflow.com/questions/10948849
复制相似问题