#!/bin/sh # # -- san2(at)wdb.co.kr # -- 2005.04.02 : tunning run_slave_start() # -- 2005.01.04 : bug fixed $? # -- 2004.12.31 : add `wait_shutdown' # -- 2004.11.15 : new build ## check real-running ## is_running() { [ -n "`/bin/ps ac | grep mysqld 2>/dev/null`" ] && echo 1 } ## same as `mysqladmin shutdown' ## wait_shutdown() { #sleep 1; while [ -n "`is_running`" ] ; do :; done sleep 1; while [ -f ${PIDFILE} ] ; do :; done } get_master_conf() { TMP=`grep -i "master-" $CONF 2>/dev/null` R=$? for n in $TMP ; do var=`echo "$n" | awk -F"=" '{print $1}' | sed -e "s/[[:space:]]*//g"` val=`echo "$n" | awk -F"=" '{print $2}' | sed -e "s/[[:space:]]*//g"` if [ X"$var" = X"master-host" ] ; then MASTER_HOST=$val elif [ X"$var" = X"master-user" ] ; then MASTER_USER=$val elif [ X"$var" = X"master-password" ] ; then MASTER_PASS=$val fi done return $R } get_master_info() { SQL='SHOW MASTER STATUS\G' RESULT=`$MYSQL -u "$MASTER_USER" -h "$MASTER_HOST" --password="$MASTER_PASS" \ --batch -e "$SQL" 2>/dev/null | awk '{print $1,$2}'` R=$? for LINE in $RESULT ; do K=`echo $LINE | awk '{print $1}'` case "$K" in File:) MASTER_LOG_FILE=`echo "$LINE" | awk '{print $2}'` ;; Position:) MASTER_LOG_POS=`echo "$LINE" | awk '{print $2}'` ;; esac done return $R } get_local_info() { SQL='SHOW SLAVE STATUS\G' RESULT=`$MYSQL -u root -h localhost --password="$MASTER_PASS" \ --batch -e "$SQL" 2>/dev/null | awk '{print $1,$2}'` R=$? for LINE in $RESULT ; do K=`echo $LINE | awk '{print $1}'` case "$K" in Master_Host:) SLAVE_TO_MASTER=`echo "$LINE" | awk '{print $2}'` ;; Master_Log_File:) SLAVE_LOG_FILE=`echo "$LINE" | awk '{print $2}'` ;; Read_Master_Log_Pos:) SLAVE_LOG_POS=`echo "$LINE" | awk '{print $2}'` ;; Slave_IO_Running:) SLAVE_IO_RUNNING=`echo "$LINE" | awk '{print $2}'` ;; Slave_SQL_Running:) SLAVE_SQL_RUNNING=`echo "$LINE" | awk '{print $2}'` ;; esac done return $R } run_slave_start() { echo -n ' slave-start...' sleep 2 #echo "RESET SLAVE; #CHANGE MASTER TO MASTER_LOG_FILE='${MASTER_LOG_FILE}',MASTER_LOG_POS=${MASTER_LOG_POS}; #START SLAVE;" | /usr/local/bin/mysql -u root -h localhost --password="${MASTER_PASS}" 2>/dev/null $MYSQL -u root -h localhost --password="${MASTER_PASS}" 2>/dev/null <<__END__ RESET SLAVE; CHANGE MASTER TO MASTER_LOG_FILE='${MASTER_LOG_FILE}',MASTER_LOG_POS=${MASTER_LOG_POS}; START SLAVE; __END__ return $? } mysql_sync() { echo -n ' mysql-sync...' rm -f ${LOG_DIR}/*.info rm -f ${LOG_DIR}/*-bin* /usr/local/bin/rsync -qa rsync://${MASTER_HOST}/${RSYNC_DB_DIR}/ ${DB_DIR}/ >/dev/null 2>&1 return $? } mysql_status() { get_master_conf && get_master_info && get_local_info && { printf "%-20s %s\n" '[MASTER]' '[SLAVE]' printf "%-20s %s\n" "$MASTER_HOST" "${SLAVE_TO_MASTER}(master_to)" printf "%-20s %s\n" "$MASTER_LOG_FILE" "$SLAVE_LOG_FILE" printf "%-20s %s\n" "$MASTER_LOG_POS" "$SLAVE_LOG_POS" printf "%-20s %s\n" '-' "Slave_IO_Running:$SLAVE_IO_RUNNING" printf "%-20s %s\n" '-' "Slave_SQL_Running:$SLAVE_SQL_RUNNING" return 0 } || return 1 } ##################################################### CONF='/etc/my.cnf' MYSQL=`which mysql 2>/dev/null` DB_DIR='/databases/mysql' LOG_DIR=/databases/mysqldlog PIDFILE=${LOG_DIR}/mysqld.pid RSYNC_DB_DIR='mysqldata' IFS=' ' case "$1" in start) if [ -s ${PIDFILE} -o -n "`is_running`" ] ; then echo 'mysqld running !!!' >&2 exit 1 elif [ -x /usr/local/bin/mysqld_safe ]; then get_master_conf && get_master_info && mysql_sync [ $? = 0 ] && /usr/bin/limits -U mysql \ /usr/local/bin/mysqld_safe --user=mysql --datadir=${DB_DIR} --pid-file=${PIDFILE} >/dev/null & [ $? = 0 ] && run_slave_start && echo -n ' mysqld' fi ;; stop) if [ -s ${PIDFILE} ]; then /bin/kill `cat ${PIDFILE} 2>/dev/null` >/dev/null 2>&1 && wait_shutdown && echo -n ' mysqld' elif [ -n "`is_running`" ] ; then /usr/bin/killall mysqld && wait_shutdown && echo -n ' mysqld' else echo "mysql-server isn't running" >&2 exit 1 fi ;; status) if [ ! -f ${PIDFILE} ] ; then echo "mysql-server isn't running" exit 1 fi mysql_status return $? ;; *) echo "" echo "Usage: `basename $0` { start | stop | status }" echo "" exit 64 ;; esac exit 0