例96 并发备份数据库
背景:领导要求小明备份数据库里面的100个库(数据量再几十到几百G),需要以最快的时间完成(5小时以内),并且不能影响服务器性能。
要点:
通过命名管道FIDO来实现
一些小知识点:
一、命名管道
1.再文件系统中FIFO拥有名称,并且是以设备特殊文件的形式存在的;
2.任何进程都可以通过FIFO共享数据
3.除非FIFO两端同时有读与写的进程,否则FIFO的数据流通将会阻塞。
4. 匿名管道是由shell自动创建,存在于内核中,而FIFO是由程序创建的(比如mkfifo命令),存在于文件系统中
4.匿名管道是单向的字节流,而FIFO则是双向的字节流
#!/bin/bash
exec &> /tmp/mysql_bak.log
if ! which innobacckupex &>/dev/null
then
echo "安装xtrabackup工具"
rpm -ivh http://www.percona.com/downloads/peercona-release/redhat/0.1-3/percpna-release-0.1-3.noarch.rpm && \
yum install -y percona -xtrabackup-24
if [ $? -ne 0 ]
then
echo "安装xtrabackup工具出错,请检查。"
exit 1
fi
fi
bkdir=/data/backup/mysql
bakuser=vvNctM
bakpass=99omeaBHh
function bak_data
{
db_name=$1
db_host=$2
db_port=$3
cnf=$4
[ -d $bakdir/$bd_name ] || mkdir -p $bakdir/$db_name
innobackupex --defaults-file=$4 --host=$2 --port=$3 --user=$bakuser --password=$bakpass $bakdir/$1
if [ $? -ne 0 ]
then
echo "备份数据库$1出现问题"
fi
}
fifofile=/tmp/$$
mkfifo $fifofile
exec 1000<>$fifofile
thread=10
for ((i=0;i<$thread;i++))
do
echo >&1000
done
cat /tmp/databases.list | while read line
do
read -u 1000
{
bak_data `echo $line`
echo >&1000
} &
done
wait
exec 1000>&
rm -f $fifofile
例97 打印三角形
要求:打印一个正三角形,元素用*表示
要点:正三角形的元素排列,如果边长为5个*,在shell终端显示该正三角形的话,需要有5行,第一行应该先打印4个空格,然后再打印‘*’,第二行打印三个空格,然后再打印‘*’,一直到第五行打印0个空格
#!/bin/bash
while true
do
read -p "please input then lenth: " n
if [ -z $n ]
then
echo "要输入一个数字"
continue
else
n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n1" ]
then
echo "你输入的不是纯数字,重新输入"
continue
else
break
fi
fi
done
for i in `seq 1 $n`
do
j=$[$n-$i]
for m in `seq $j`
do
echo -n " "
done
for p in `seq 1 $i`
do
echo -n "* "
done
echo
done
例98 截取字符串
要求:利用你学过的知识点,想办法根据要求截取出字符
字符串var=http://www.aaa.com/root/123.htm
2.取出123.htm
4.取出http:
5.取出http://
6.取出root/123.htm
7.取出123
要点
grep/sed/awk
echo $var |awk -F '//' '{print $2}'
echo $var |sed 's#http://##'
echo $var |awk -F '/' '{print $5}'
echo $var |sed 's#/123.htm##'
echo $var |awk -F '//' '{print $1}'
echo $var |awk -F 'www' '{print $1}'
echo $var |awk -F 'com/' 'print $2'
echo $var |awk -F '/' '{print $4 "/" $5 }'
echo $var |sed 's/[^0-9]//g'
例99 修改文本格式
要求:请把下面的字符串
要点:奇数行、偶数行
例100 自定义rm
要求:linux的rm命令太危险,一不小心就会删除掉系统文件。写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份然后再删除。下面两种情况做练习
1.简单
假设有一个大的分区/data/,每次删除文件huozh9e目录之前,都要先在/data/下面创建一个隐藏目录,以日期/时间命名,比如/data/.201703271012/,然后把所有删除的文件同步到该目录下面,可以使用rsync -R把文件路径一起同步
2.复杂
不知道哪个分区有剩余空间,在删除之前先计算要删除的文件或者目录大小,然后对比系统的磁盘空间,如果够则按照上面的规则创建隐藏目录,并备份,如果没有足够空间,要提醒用户没有足够的空间备份并提示是否放弃备份,如果用户选择y,则直接删除文件或者目录,如果选择n则提示未删除,然后退出脚本
#!/bin/bash
filename=$1
big_filesystem=/data/
if [ ! -e $1 ]
then
echo "$1不存在,请使用绝对路径"
exit
fi
d=`date+%Y%m%d%H%M`
read -p "Are U sure delete the file or directory $1 y|n: "c
case $c in
y|Y)
mkdir -p $big_filesystem/ $d && -aR $1 $bin_filesystem/.$d/$1 && /bin/rm -rf $1
;;
n|N)
exit 0
;;
*)
echo "Please input 'y' or 'n' ."
;;
esac
复杂的
#!/bin/bash
filename=$1
if [ ! -e $1 ]
then
echo "$1 不存在,请使用绝对路径"
exit
fi
d=`date+%Y%m%d%H%M`
f_size=`du -sk $1|awk '{print $1}'`
disk_size=`LANG=en;df -k | grep -vi filesystem|awk '{print $1}'|sort -n |tail -n1`
big_filesystem=`LANG=en;df -k | grep -vi filesystem |sorto -n -k4 | tail -n1 |awk '{print $1}'`
if [ $f_size -lt $disk_size ]
then
read -p "Are u user delete then file or directory: $1 y|n:" c
case $c in
y|Y)
mkdir -p $big_filesystem/.$d && rsync -aR $1 $big_filesystem/.$d/$1 && /bin/rm -rf $1
;;
n|N)
exit 0
;;
*)
echo "Please input 'y' or 'n' "
;;
esac
else
echo "The disk size is not enough to backup the files $1."
read -p "Do you want to delete $1:" c
case $c in
y|Y)
echo "It will delete $1 after 5 seconds whitout backup "
for i in `seq 1 5 `; do echo -ne ". ";sleep 1;done
echo
/bin rm -rf $1
;;
n|N)
echo "It will not delete $1"
exit 0
;;
*)
echo "Please input 'y on n' "
;;
esac
fi