96.併發備份數據庫
需求:
-
領導要求小明備份數據庫服務器裏面的100隔庫(數據量在幾十到幾百G),需要以最快的時間完成(5小時內),並且不能影響服務器性能。
核心要點:
- 通過命令管道FIFO來實現
#!/bin/bash
#這個腳本用來併發備份數據庫
#作者:Chauncey
#日期:2019-01-29
##假設100個庫的庫名、host、port以及配置文件路徑存到了一個文件裏,文件名字爲/tmp/databases.list
##格式:db1 10.10.10.2 3308 /data/mysql/db1/my.cnf
##備份數據庫使用xtrabackup(由於涉及到myisam。命令爲inoobackupex)
exec &> /tmp/mysql_bak.log
if ! which innobackupex &>/dev/null
then
echo "安裝xtrabackup工具"
rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm && \
yum install -y percona-xtrabackup-24
if [ $? -ne 0 ]
then
echo "安裝xtrabackup工具出錯,請檢查。"
exit 1
fi
fi
bakdir=/data/backup/mysql
bakuser=vyNctM
bakpass=99omeaBHh
function bak_data {
db_name=$1
db_host=$2
db_port=$3
cnf=$4
[ -d $bakdir/$db_name ] || mkdir -p $bakdir/$db_name
innobackupex --defaults-file=$4 --host=$2 --prot=$3 --user=$bakuser --passwd=$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
read -u1000
{
bak_data `echo $line`
echo >&1000
} &
done
wait
exec 1000>&
rm -f $fifofile
97.併發備份數據庫
需求:
-
打印一個三角形(正三角形,用*號表示)
核心要點:
- 正三角形的元素排列,如邊長爲5個*,在shell終端顯示該三角形的話,需要有5行,第一行因該先打印4個空格,然後再打印“*”,第二行先打印3個空格,然後打印‘*’,一直到第5行打印0個空格。
[root@Chauncey ~]# cat 97.sh
#!/bin/bash
#這個腳本用i來打印三角形
#作者:Chauncey
#日期:2019-01-29
while true
do
read -p "please input the length:" 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 $`
do
echo -n " "
done
for p in `seq 1 $i`
do
echo -n "* "
done
echo
done
98.截取字符串
需求:
-
利用你學過的知識點,想辦法根據要求截取出字符串
核心要點:
- grep/sed/awk
[root@Chauncey ~]# cat 98.sh
#!/bin/bash
#這個腳本用來截取字符串
#作者:Chauncey
#日期:2019-01-29
var="http://www.aaa.com/root/123.htm"
echo "1 取出www.aaa.com/root/123.htm"
echo $var | awk -F"//" '{print $2}'
echo "2 取出123.htm"
echo $var | awk -F"/" '{print $5}'
echo "3 取出http://www.aaa.com/root"
echo $var | sed 's#/123.htm##'
echo "4 取出http:"
echo $var | awk -F '//' '{print $1}'
echo "5 取出http://"
echo $var | awk -F "w" '{print $1}'
echo "6 取出/root/123.htm"
echo $var | awk -F '//' '{print $2}'
echo "7 取出123"
echo $var |sed 's/[^0-9//g]'
99.格式文件
需求:
-
請把下面的字符串:
核心要點:
- 奇數、偶數行
[root@Chauncey ~]# cat 99.sh
#!/bin/bash
#這個腳本用來格式化文本
#作者:Chauncey
#日期:2019-01-30
n=`wc -l test3.txt|awk '{print $1}'`
n2=$[$n/2]
for i in `seq 1 $2`
do
i2=$[$i*2]
j=$[$i2-1]
l1=`sed -n "$j2"p test3.txt`
l2=`sed -n "$j"p test3.txt`
echo $l2:$l1
done
99.自定義rm
需求:
-
linux系統的rm命令太危險,一不小心就會刪除掉系統文件。 寫一個shell腳本來替換系統的rm命令,要求當刪除一個文件或者目錄時,都要做一個備份,然後再刪除。下面分兩種情況,做練習:
1. 簡單
假設有一個大的分區/data/,每次刪除文件或者目錄之前,都要先在/data/下面創建一個隱藏目錄,以日期/時間命名,比如/data/.201703271012/,然後把所有刪除的文件同步到該目錄下面,可以使用rsync -R 把文件路徑一同同步
2. 複雜
不知道哪個分區有剩餘空間,在刪除之前先計算要刪除的文件或者目錄大小,然後對比系統的磁盤空間,如果夠則按照上面的規則創建隱藏目錄,並備份,如果沒有足夠空間,要提醒用戶沒有足夠的空間備份並提示是否放棄備份,如果用戶選擇y,則直接刪除文件或者目錄,如果選擇n,則提示未刪除,然後退出腳本。
[root@Chauncey ~]# cat 100.sh
#!/bin/bash
#這個腳本用來自定義rm
#作者:Chauncey
#日期:2019-01-30
filename=$1
if [ ! -e $1 ]
then
echo "$1,不存在,請使用絕對路徑"
exit
fi
d=`date +%Y%m%d%H%M`
f_size=`su -sk $1|awk '{print $1}'`
disk_size=`LANG=en; df -k | grep -vi filesystem|awk '{print $4}' |sort -n | tail -n1`
big_filesystem=`LANG=en; df -k | grep -vi filesystem|sort -n -k4 | tail -n1 |awk '{print $NF}'`
if [$f_size -lt $disk_size ]
then
read -p "Are U sure delete the 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? y|n: " c
case $c in
y|Y)
echo "Tt will delete $1 after 5 seconds whitout backup."
for i in `seq1 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' or 'n'"
;;
esac
fi
[root@Chauncey ~]#