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 :)