safe_mysqld.sh 7.81 KB
Newer Older
bk@work.mysql.com's avatar
bk@work.mysql.com committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#!/bin/sh
# Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
# This file is public domain and comes with NO WARRANTY of any kind
#
# scripts to start the MySQL daemon and restart it if it dies unexpectedly
#
# This should be executed in the MySQL base directory if you are using a
# binary installation that has other paths than you are using.
#
# mysql.server works by first doing a cd to the base directory and from there
# executing safe_mysqld

trap '' 1 2 3 15			# we shouldn't let anyone kill us

defaults=
case "$1" in
17
    --no-defaults|--defaults-file=*|--defaults-extra-file=*)
bk@work.mysql.com's avatar
bk@work.mysql.com committed
18 19 20 21 22
      defaults="$1"; shift
      ;;
esac

parse_arguments() {
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
  # We only need to pass arguments through to the server if we don't
  # handle them here.  So, we collect unrecognized options (passed on
  # the command line) into the args variable.
  pick_args=
  if test "$1" = PICK-ARGS-FROM-ARGV
  then
    pick_args=1
    shift
  fi

  for arg do
    case "$arg" in
      # these get passed explicitly to mysqld
      --basedir=*) MY_BASEDIR_VERSION=`echo "$arg" | sed -e "s;--basedir=;;"` ;;
      --datadir=*) DATADIR=`echo "$arg" | sed -e "s;--datadir=;;"` ;;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
38
      --pid-file=*) pid_file=`echo "$arg" | sed -e "s;--pid-file=;;"` ;;
39 40 41 42 43 44 45 46 47 48
      --user=*)    user=`echo "$arg" | sed -e "s;--user=;;"` ;;

      # these two might have been set in a [safe_mysqld] section of my.cnf
      # they get passed via environment variables to safe_mysqld
      --socket=*)  MYSQL_UNIX_PORT=`echo "$arg" | sed -e "s;--socket=;;"` ;;
      --port=*)    MYSQL_TCP_PORT=`echo "$arg" | sed -e "s;--port=;;"` ;;

      # safe_mysqld-specific options - must be set in my.cnf ([safe_mysqld])!
      --ledir=*)   ledir=`echo "$arg" | sed -e "s;--ledir=;;"` ;;
      --err-log=*) err_log=`echo "$arg" | sed -e "s;--err-log=;;"` ;;
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
49
      # QQ The --open-files should be removed
50
      --open-files=*) open_files=`echo "$arg" | sed -e "s;--open-files=;;"` ;;
monty@donna.mysql.com's avatar
monty@donna.mysql.com committed
51
      --open-files-limit=*) open_files=`echo "$arg" | sed -e "s;--open-files-limit=;;"` ;;
52
      --core-file-size=*) core_file_size=`echo "$arg" | sed -e "s;--core_file_size=;;"` ;;
53
      --timezone=*) TZ=`echo "$arg" | sed -e "s;--timezone=;;"` ; export TZ; ;;
54
      --mysqld=*)   MYSQLD=`echo "$arg" | sed -e "s;--mysqld=;;"` ;;
55 56 57 58 59 60 61 62
      *)
        if test -n "$pick_args"
        then
          # This sed command makes sure that any special chars are quoted,
          # so the arg gets passed exactly to the server.
          args="$args "`echo "$arg" | sed -e 's,\([^a-zA-Z0-9_.-]\),\\\\\1,g'`
        fi
        ;;
bk@work.mysql.com's avatar
bk@work.mysql.com committed
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
    esac
  done
}

MY_PWD=`pwd`
# Check if we are starting this relative (for the binary release)
if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a \
 -x ./bin/mysqld
then
  MY_BASEDIR_VERSION=$MY_PWD		# Where bin, share and data are
  ledir=$MY_BASEDIR_VERSION/bin		# Where mysqld is
  DATADIR=$MY_BASEDIR_VERSION/data
# Check if this is a 'moved install directory'
elif test -f ./var/mysql/db.frm -a -f ./share/mysql/english/errmsg.sys -a \
 -x ./libexec/mysqld
then
  MY_BASEDIR_VERSION=$MY_PWD		# Where libexec, share and var are
  ledir=$MY_BASEDIR_VERSION/libexec	# Where mysqld is
  DATADIR=$MY_BASEDIR_VERSION/var
else
  MY_BASEDIR_VERSION=@prefix@
  DATADIR=@localstatedir@
  ledir=@libexecdir@
fi

88 89
MYSQL_UNIX_PORT=${MYSQL_UNIX_PORT:-@MYSQL_UNIX_ADDR@}
MYSQL_TCP_PORT=${MYSQL_TCP_PORT:-@MYSQL_TCP_PORT@}
bk@work.mysql.com's avatar
bk@work.mysql.com committed
90
user=@MYSQLD_USER@
91
MYSQLD=mysqld
bk@work.mysql.com's avatar
bk@work.mysql.com committed
92

93 94 95 96
# these rely on $DATADIR by default, so we'll set them later on
pid_file=
err_log=

bk@work.mysql.com's avatar
bk@work.mysql.com committed
97 98
# Get first arguments from the my.cfg file, groups [mysqld] and [safe_mysqld]
# and then merge with the command line arguments
99 100
if test -x ./bin/my_print_defaults
then
bk@work.mysql.com's avatar
bk@work.mysql.com committed
101
  print_defaults="./bin/my_print_defaults"
102 103
elif test -x @bindir@/my_print_defaults
then
bk@work.mysql.com's avatar
bk@work.mysql.com committed
104
  print_defaults="@bindir@/my_print_defaults"
105 106
elif test -x @bindir@/mysql_print_defaults
then
bk@work.mysql.com's avatar
bk@work.mysql.com committed
107 108 109 110
  print_defaults="@bindir@/mysql_print_defaults"
else
  print_defaults="my_print_defaults"
fi
111 112

args=
bk@work.mysql.com's avatar
bk@work.mysql.com committed
113
parse_arguments `$print_defaults $defaults mysqld safe_mysqld`
114
parse_arguments PICK-ARGS-FROM-ARGV "$@"
bk@work.mysql.com's avatar
bk@work.mysql.com committed
115

116
if test ! -x $ledir/$MYSQLD
bk@work.mysql.com's avatar
bk@work.mysql.com committed
117
then
118
  echo "The file $ledir/$MYSQLD doesn't exist or is not executable"
bk@work.mysql.com's avatar
bk@work.mysql.com committed
119 120 121
  echo "Please do a cd to the mysql installation directory and restart"
  echo "this script from there as follows:"
  echo "./bin/safe_mysqld".
122
  exit 1
bk@work.mysql.com's avatar
bk@work.mysql.com committed
123 124
fi

125 126 127 128 129 130 131 132 133
if test -z "$pid_file"
then
  pid_file=$DATADIR/`@HOSTNAME@`.pid
else
  case "$pid_file" in
    /* ) ;;
    * )  pid_file="$DATADIR/$pid_file" ;;
  esac
fi
134 135 136 137 138
test -z "$err_log"  && err_log=$DATADIR/`@HOSTNAME@`.err

export MYSQL_UNIX_PORT
export MYSQL_TCP_PORT

bk@work.mysql.com's avatar
bk@work.mysql.com committed
139

140 141 142
NOHUP_NICENESS="nohup"
if test -w /
then
143
  NOHUP_NICENESS=`nohup nice 2>&1`
144 145
 if test $? -eq 0 && test x"$NOHUP_NICENESS" != x0 && nice --1 echo foo > /dev/null 2>&1
 then
146
    NOHUP_NICENESS="nice --$NOHUP_NICENESS nohup"
147 148
  else
    NOHUP_NICENESS="nohup"
149
  fi
bk@work.mysql.com's avatar
bk@work.mysql.com committed
150 151
fi

152 153 154 155
if test -w /
then
  # If we are root, change the err log to the right user.
  touch $err_log; chown $user $err_log
156 157 158 159 160 161 162 163
  if test -n "$open_files"
  then
    ulimit -n $open_files
  fi
  if test -n "$core_file_size"
  then
    ulimit -c $core_file_size
  fi
164
fi
bk@work.mysql.com's avatar
bk@work.mysql.com committed
165 166 167 168 169 170 171 172 173 174 175 176 177

#
# If there exists an old pid file, check if the daemon is already running
# Note: The switches to 'ps' may depend on your operating system
if test -f $pid_file
then
  PID=`cat $pid_file`
  if @CHECK_PID@
  then
    if @FIND_PROC@
    then    # The pid contains a mysqld process
      echo "A mysqld process already exists"
      echo "A mysqld process already exists at " `date` >> $err_log
178
      exit 1
bk@work.mysql.com's avatar
bk@work.mysql.com committed
179 180 181 182 183 184 185 186 187
    fi
  fi
  rm -f $pid_file
  if test -f $pid_file
  then
    echo "Fatal error: Can't remove the pid file: $pid_file"
    echo "Fatal error: Can't remove the pid file: $pid_file at " `date` >> $err_log
    echo "Please remove it manually and start $0 again"
    echo "mysqld daemon not started"
188
    exit 1
bk@work.mysql.com's avatar
bk@work.mysql.com committed
189 190 191 192 193 194 195 196
  fi
fi

#
# Uncomment the following lines if you want all tables to be automaticly
# checked and repaired at start
#
# echo "Checking tables in $DATADIR"
197 198
# $MY_BASEDIR_VERSION/bin/myisamchk --silent --force --fast --medium-check -O key_buffer=64M -O sort_buffer=64M $DATADIR/*/*.MYI
# $MY_BASEDIR_VERSION/bin/isamchk --silent --force -O sort_buffer=64M $DATADIR/*/*.ISM
bk@work.mysql.com's avatar
bk@work.mysql.com committed
199

200
echo "Starting $MYSQLD daemon with databases from $DATADIR"
bk@work.mysql.com's avatar
bk@work.mysql.com committed
201 202 203 204 205 206 207 208 209 210 211

# Does this work on all systems?
#if type ulimit | grep "shell builtin" > /dev/null
#then
#  ulimit -n 256 > /dev/null 2>&1		# Fix for BSD and FreeBSD systems
#fi

echo "`date +'%y%m%d %H:%M:%S  mysqld started'`" >> $err_log
while true
do
  rm -f $MYSQL_UNIX_PORT $pid_file	# Some extra safety
212
  if test -z "$args"
bk@work.mysql.com's avatar
bk@work.mysql.com committed
213
  then
214
    $NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR --user=$user --pid-file=$pid_file @MYSQLD_DEFAULT_SWITCHES@ >> $err_log 2>&1
bk@work.mysql.com's avatar
bk@work.mysql.com committed
215
  else
216
    eval "$NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR --user=$user --pid-file=$pid_file @MYSQLD_DEFAULT_SWITCHES@ $args >> $err_log 2>&1"
bk@work.mysql.com's avatar
bk@work.mysql.com committed
217 218 219
  fi
  if test ! -f $pid_file		# This is removed if normal shutdown
  then
220
    break
bk@work.mysql.com's avatar
bk@work.mysql.com committed
221
  fi
222

bk@work.mysql.com's avatar
bk@work.mysql.com committed
223 224 225 226 227 228 229
  if @IS_LINUX@
  then
    # Test if one process was hanging.
    # This is only a fix for Linux (running as base 3 mysqld processes)
    # but should work for the rest of the servers.
    # The only thing is ps x => redhat 5 gives warnings when using ps -x.
    # kill -9 is used or the process won't react on the kill.
230
    numofproces=`ps xa | grep -v "grep" | grep -c $ledir/$MYSQLD`
bk@work.mysql.com's avatar
bk@work.mysql.com committed
231 232 233 234
    echo -e "\nNumber of processes running now: $numofproces" | tee -a $err_log
    I=1
    while test "$I" -le "$numofproces"
    do 
235
      PROC=`ps xa | grep $ledir/$MYSQLD | grep -v "grep" | tail -1` 
bk@work.mysql.com's avatar
bk@work.mysql.com committed
236 237 238 239 240 241 242
	for T in $PROC
	do
	  break
	done
	#    echo "TEST $I - $T **"
	if kill -9 $T
	then
243
	  echo "$MYSQLD process hanging, pid $T - killed" | tee -a $err_log
bk@work.mysql.com's avatar
bk@work.mysql.com committed
244 245 246 247 248 249
	else 
	  break
	fi
	I=`expr $I + 1`
    done
  fi
250

bk@work.mysql.com's avatar
bk@work.mysql.com committed
251 252 253
  echo "`date +'%y%m%d %H:%M:%S  mysqld restarted'`" | tee -a $err_log
done

254
echo "`date +'%y%m%d %H:%M:%S  mysqld ended'`" | tee -a $err_log
255
echo "" | tee -a $err_log