企业实战题7:开发mysql多实例启动脚本
#!/bin/bash # chkconfig: 2345 64 36 # description: A very fast and reliable SQL database engine basedir='/usr/local/mysql' bindir='/usr/local/mysql/bin' pidfile='/data/mysql/data/mysql.pid' [ -f /etc/init.d/functions ] && . /etc/init.d/functions judge(){ RETVAL=$? if [ $RETVAL -eq 0 ];then action "$1 mysql" /bin/true else action "$1 mysql" /bin/false fi return $RETVAL } # start函数中注意:输出到空以及后台运行 start(){ if [ ! -f $pidfile ];then $bindir/mysqld_safe --defaults-file=$basedir/my.cnf &>/dev/null & judge start else action "MySQL is running" /bin/true fi } stop(){ if [ -f $pidfile ];then $bindir/mysqladmin -uroot -poldboy123456 shutdown &>/dev/null judge stop else action "MySQL is not running" /bin/false fi } stop2(){ if [ -f $pidfile ];then mysqld_pid=`cat "$pidfile"` # 判断mysql pid对应的进程是否存在 if (kill -0 $mysqld_pid 2>/dev/null);then echo $"Shutting down MySQL" kill $mysqld_pid judge stop else action "MySQL is not running" /bin/false fi else action "MySQL is not running" /bin/false fi } case "$1" in start) start ;; stop) stop2 ;; restart) stop2 sleep 2 start ;; *) echo "USAGE:$0 {start|stop|restart}" exit $RETVAL esac
注意事项:
1)Starting MySQL........
ERROR! The server quit without updating PID file (/data/mysql/data/mysql.pid)
是因为配置文件有错误,之前我把账号密码写在了里面,导致无法启动,去掉那两行即可
2)觉得把账号密码写在脚本比较暴露的话,可以用函数stop2,也可以将其写在文件中
cat hehe.conf [client] port = 3306 socket = /usr/local/mysql/var/mysql.sock user=root password=oldboy123456 /usr/local/mysql/bin/mysqladmin --defaults-file=/server/scripts/hehe.conf shutdown
企业实战题8:如何实现对MySQL数据库进行分库备份,请用脚本实现
#!/bin/bash BAKPATH=/server/backup MYUSER=root MYPASS=oldboy123456 SOCKET=/usr/local/mysql/var/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET -x -B -F -R" [ ! -d $BAKPATH ] && mkdir -p $BAKPATH DBLIST=`$MYCMD -e 'show databases;'|sed 1d|egrep -v 'schema|test'` for dbname in $DBLIST do $MYDUMP $dbname|gzip > /server/backup/${dbname}_$(date +%F).sql.gz done
注意事项:
最近把MySQL从5.5升到5.6以后,mysqldump不好用了,提示:
Warning: Using a password on the command line interface can be insecure
# 把账号密码写到配置文件中 vim /usr/local/mysql/my.cnf [mysqldump] user=root password=oldboy123456 # 如何使用(不指定文件会报错): mysqldump --defaults-extra-file=/usr/local/mysql/my.cnf mysql > hehe.sql
企业实战题9:如何实现对MySQL数据库进行分库加分表备份,请用脚本实现
#!/bin/bash BAKPATH=/server/backup MYUSER=root MYPASS=oldboy123456 SOCKET=/usr/local/mysql/var/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET -x -F -R" [ ! -d $BAKPATH ] && mkdir -p $BAKPATH DBLIST=`$MYCMD -e 'show databases;'|sed 1d|egrep -v 'schema|test'` for dbname in $DBLIST do mkdir -p $BAKPATH/$dbname TLIST=`$MYCMD -e 'show tables from $dbname;'|sed 1d` for tname in $TLIST do $MYDUMP $dbname $tname|gzip > $BAKPATH/$dbname/${tname}_$(date +%F).sql.gz done done
企业面试题10:请用至少两种方法实现!
for循环打印下面这句话中字母数不大于6的单词
I am oldboy teacher welcome to oldboy training class.
#!/bin/bash for word in I am oldboy teacher welcome to oldboy training class. do if [ ${#word} -le 6 ];then echo -e "$word \t ${#word}" fi done #!/bin/bash array=(I am oldboy teacher welcome to oldboy training class.) for word in ${array[*]} do if [ ${#word} -le 6 ];then echo -e "$word \t ${#word}" fi done echo "I am oldboy teacher welcome to oldboy training class." \ |tr " " "\n"|awk '{if(length($1)<=6) print $1}'
企业面试题11:
开发shell脚本分别实现以脚本传参以及read读入的方式比较2个整数大小,以read读入的方式对变量是否为数字、并且传参个数做判断.
#!/bin/bash read -p "Pls input two number: " ARG1 ARG2 echo $ARG1 echo $ARG2 if [ ${#ARG1} = 0 -o ${#ARG2} = 0 ];then echo "number is not allowed empty" exit 1 fi expr $ARG1 + 1 >/dev/null 2>&1 RETVAL1=$? expr $ARG2 + 1 >/dev/null 2>&1 RETVAL2=$? if [ $RETVAL1 -ne 0 -o $RETVAL2 -ne 0 ];then echo "number must be int" exit 2 fi if [ $ARG1 -lt $ARG2 ];then echo "$ARG1 < $ARG2" exit elif [ $ARG1 -eq $ARG2 ];then echo "$ARG1 = $ARG2" exit else echo "$ARG1 > $ARG2" exit fi
企业面试题12:打印选择菜单,一键安装Web服务
#!/bin/bash menu(){ cat<<EOF 1.[install lamp] 2.[install lnmp] 3.[exit] echo "pls input num: " EOF } menu read num lamp="/server/scripts/install_lamp.sh" lnmp="/server/scripts/install_lnmp.sh" [ $num -eq 1 ] && { [ -x "$lamp" ] || { echo "$lamp can't be exec";exit 1; } echo "start installing lamp" $lamp exit 0 } [ $num -eq 2 ] && { [ -x "$lnmp" ] || { echo "$lnmp can't be exec";exit 1; } echo "start installing lnmp" $b exit 0 } [ $num -eq 3 ] && { echo "you choice quit!" exit 0 } echo "input error";exit 1