shell习题-shell多线程


上一篇文章(http://mp.weixin.qq.com/s/AiKTWf7Y4mGwwOwJyysQtw)我们介绍了命名管道FIFO,利用里面的知识点,实现这个需求。

需求背景:

领导要求小明备份数据库服务器里面的100个库(数据量在几十到几百G),需要以最快的时间完成(5小时内),并且不能影响服务器性能。

需求分析:

由于数据量比较大,单个库备份时间少则10几分钟,多则几个小时,我们算平均每个库30分钟,若一个库一个库的去备份,则需要3000分钟,相当于50个小时。很明显不可取。但全部丢到后台去备份,100个并发,数据库服务器也无法承受。所以,需要写一个脚本,能够控制并发数就可以实现了。

 

参考答案:

#!/bin/sh

##假设100个库的名字存到了一个文件里,文件名字为/tmp/databases.list
##其中备份数据库用了mysqldump,这里你可以换成xtrabackup,更快

function bak_data {
    dbname=$1
    d=`date +%y%d`
    mysqldump -uroot -pxxxxx $dbname > /backup/$1.$d
}

mkfifo $tmp_fifofile
exec 1000<>$tmp_fifofile
rm -f $tmp_fifofile

thread=10
for ((i=0;i<$thread;i++));
do
    echo >&1000
done

for d in `cat /tmp/databases.list`
do
    read -u1000
    {
        bak_data $d 
        echo >&1000
    } & 
done

wait
exec 1000>&-