Nearly every job advertisement for MySQL DBA positions asks for ‘shell scripting’, so I decided to investigate what it is. I remembered some performance training, where I was told how forking is bad, and one should attempt to use shell features as much as possible (like, avoid paths to something, what can be used by builtin (e.g. don’t use /usr/bin/[, just pure [ instead )
I tried to automate one MySQL DBA task (reinitializing slave after relay log corruption or after copying in cloned dataset from other server) using just bash – and it kind of worked. From now on I can put ‘Shell scripting’ proudly on my resume :-)
Next step – learn JCL (some people think this is funny :)
What was your most complicated task solved with shell scripts? :)
#!/bin/bash
HOST=$1
RPASS=$(<passwordfile)
IFS="
"
mysql -h $HOST -e "STOP SLAVE"
for line in $(mysql -e "SHOW SLAVE STATUS" -E -h $HOST)
do
key=${line%:*} # Split off what goes before :
key=${key// } # And trim spaces
data=${line#*:} # Split off what goes after :
data=${data// } # And trim spaces yet again!!!
case $key in
Exec_master_log_pos) LOGPOS=$data;;
Relay_Master_Log_File) LOGFILE=$data;;
Master_Host) RHOST=$data;;
Master_User) RUSER=$data;;
esac
done
if [ -z $LOGPOS -o -z $LOGFILE ]; then
echo "OMG FAIL NO POSITIONS KNOWN"; exit;
fi
mysql -f -h $HOST -e "
RESET SLAVE;
CHANGE MASTER TO
MASTER_HOST='$RHOST',
MASTER_USER='$RUSER',
MASTER_PASSWORD='$RPASS',
MASTER_LOG_FILE='$LOGFILE',
MASTER_LOG_POS=$LOGPOS ;
START SLAVE
"
Update: rewrote the last ‘mysql’ command to avoid multiple unnecessary forks! (thanks, Aidai :)