Commit aca2b28e authored by unknown's avatar unknown

Bug #4858: mysql_safe logs to syslog instead of stderr

mysqld_safe.sh: Overhaul the logging design, to allow logging
mysqld messages to syslog.  Add --syslog and --skip-syslog
arguments for mysqld_safe.


scripts/mysqld_safe.sh:
  Overhaul the logging design, to allow logging mysqld messages to syslog.
  
  Add two new options:  --syslog and --skip-syslog.  --syslog is the default,
  unless --log-error is also specified.
  
  If --log-error is specified (for mysqld_safe, mysqld, server, etc. - any
  group which mysqld_safe checks for arguments), then syslog is turned off.
  This is because mysqld will get the --log-error argument and log to a file
  anyways, which will be confusing to the user.  If the user requests both
  --syslog and --log-error, a warning is printed (to mysqld_safe's stderr and
  to syslog), and we then behave as if --skip-syslog had been specified.
  
  Also, logging messages have been normalized somewhat: mysqld_safe now always
  prefixes messages with '<TIMESTAMP> mysqld_safe '.  All messages go to the
  the console (stdout or stderr, depending on if it's a notice or an error) and
  to (the error log OR syslog).
  
  Also, a few cleanups while I'm here.
parent 1fe6d151
......@@ -2,16 +2,23 @@
# 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
# Script 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.
# binary installation that is not installed in its compile-time default
# location
#
# mysql.server works by first doing a cd to the base directory and from there
# executing mysqld_safe
KILL_MYSQLD=1;
MYSQLD=
niceness=0
# Default on, unless --log-err is specified (and before options are parsed)
syslog=2
user=@MYSQLD_USER@
pid_file=
err_log=
trap '' 1 2 3 15 # we shouldn't let anyone kill us
......@@ -38,6 +45,8 @@ Usage: $0 [OPTIONS]
--mysqld-version=VERSION Use "mysqld-VERSION" as mysqld
--nice=NICE Set the scheduling priority of mysqld
--skip-kill-mysqld Don't try to kill stray mysqld processes
--syslog Log messages to syslog with 'logger'
--skip-syslog Log messages to error log
All other options are passed to the mysqld program.
......@@ -45,6 +54,43 @@ EOF
exit 1
}
log_generic () {
priority="$1"
shift
msg="`date +'%y%m%d %H:%M:%S'` mysqld_safe $*"
echo "$msg"
if [ $syslog -eq 0 ]
then
echo "$msg" >> "$err_log"
else
logger -i -t mysqld_safe -p "$priority" "$*"
fi
}
log_error () {
log_generic daemon.error "$@" >&2
}
log_notice () {
log_generic daemon.notice "$@"
}
eval_log_error () {
cmd="$1"
if [ $syslog -eq 0 ]
then
cmd="$cmd >> "`shell_quote_string "$err_log"`" 2>&1"
else
# mysqld often (not always) prefixes messages on stdout with a
# timestamp in the form of '%y%m%d %H:%M:%S '; this is redundant
# when logging via syslog, so strip it
cmd="$cmd 2>&1 | sed -e 's/^[0-9]\{6\} [0-9:]\{8\} *//' | logger -i -t mysqld -p daemon.error"
fi
#echo "Running mysqld: [$cmd]"
eval "$cmd"
}
shell_quote_string() {
# This sed command makes sure that any special chars are quoted,
# so the arg gets passed exactly to the server.
......@@ -63,41 +109,41 @@ parse_arguments() {
fi
for arg do
val=`echo "$arg" | sed -e "s;--[^=]*=;;"`
case "$arg" in
--skip-kill-mysqld*)
KILL_MYSQLD=0;
;;
# these get passed explicitly to mysqld
--basedir=*) MY_BASEDIR_VERSION=`echo "$arg" | sed -e "s;--basedir=;;"` ;;
--datadir=*) DATADIR=`echo "$arg" | sed -e "s;--datadir=;;"` ;;
--pid-file=*) pid_file=`echo "$arg" | sed -e "s;--pid-file=;;"` ;;
--user=*) user=`echo "$arg" | sed -e "s;--[^=]*=;;"` ; SET_USER=1 ;;
--basedir=*) MY_BASEDIR_VERSION="$val" ;;
--datadir=*) DATADIR="$val" ;;
--pid-file=*) pid_file="$val" ;;
--user=*) user="$val"; SET_USER=1 ;;
# these might have been set in a [mysqld_safe] section of my.cnf
# they are added to mysqld command line to override settings from my.cnf
--log-error=*) err_log=`echo "$arg" | sed -e "s;--log-error=;;"` ;;
--socket=*) mysql_unix_port=`echo "$arg" | sed -e "s;--socket=;;"` ;;
--port=*) mysql_tcp_port=`echo "$arg" | sed -e "s;--port=;;"` ;;
--log-error=*) err_log="$val" ;;
--port=*) mysql_tcp_port="$val" ;;
--socket=*) mysql_unix_port="$val" ;;
# mysqld_safe-specific options - must be set in my.cnf ([mysqld_safe])!
--ledir=*) ledir=`echo "$arg" | sed -e "s;--ledir=;;"` ;;
--open-files-limit=*) open_files=`echo "$arg" | sed -e "s;--open-files-limit=;;"` ;;
--core-file-size=*) core_file_size=`echo "$arg" | sed -e "s;--core-file-size=;;"` ;;
--timezone=*) TZ=`echo "$arg" | sed -e "s;--timezone=;;"` ; export TZ; ;;
--mysqld=*) MYSQLD=`echo "$arg" | sed -e "s;--mysqld=;;"` ;;
--core-file-size=*) core_file_size="$val" ;;
--ledir=*) ledir="$val" ;;
--mysqld=*) MYSQLD="$val" ;;
--mysqld-version=*)
tmp=`echo "$arg" | sed -e "s;--mysqld-version=;;"`
if test -n "$tmp"
then
MYSQLD="mysqld-$tmp"
else
MYSQLD="mysqld"
fi
;;
--nice=*) niceness=`echo "$arg" | sed -e "s;--nice=;;"` ;;
--help)
usage
if test -n "$val"
then
MYSQLD="mysqld-$val"
else
MYSQLD="mysqld"
fi
;;
--nice=*) niceness="$val" ;;
--open-files-limit=*) open_files="$val" ;;
--skip-kill-mysqld*) KILL_MYSQLD=0 ;;
--syslog) syslog=1 ;;
--skip-syslog) syslog=0 ;;
--timezone=*) TZ="$val"; export TZ; ;;
--help) usage ;;
*)
if test -n "$pick_args"
then
......@@ -120,8 +166,7 @@ then
MY_BASEDIR_VERSION=$MY_PWD # Where bin, share and data are
ledir=$MY_BASEDIR_VERSION/bin # Where mysqld is
# Check for the directories we would expect from a source install
elif test -f ./share/mysql/english/errmsg.sys -a \
-x ./libexec/mysqld
elif test -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
......@@ -156,17 +201,17 @@ if test -z "$MYSQL_HOME"
then
if test -r "$MY_BASEDIR_VERSION/my.cnf" && test -r "$DATADIR/my.cnf"
then
echo "WARNING: Found two instances of my.cnf -"
echo "$MY_BASEDIR_VERSION/my.cnf and"
echo "$DATADIR/my.cnf"
echo "IGNORING $DATADIR/my.cnf"
echo
log_error "WARNING: Found two instances of my.cnf -
$MY_BASEDIR_VERSION/my.cnf and
$DATADIR/my.cnf
IGNORING $DATADIR/my.cnf"
MYSQL_HOME=$MY_BASEDIR_VERSION
elif test -r "$DATADIR/my.cnf"
then
echo "WARNING: Found $DATADIR/my.cnf"
echo "Datadir is deprecated place for my.cnf, please move it to $MY_BASEDIR_VERSION"
echo
log_error "WARNING: Found $DATADIR/my.cnf
The data directory is a deprecated location for my.cnf, please move it to
$MY_BASEDIR_VERSION/my.cnf"
MYSQL_HOME=$DATADIR
else
MYSQL_HOME=$MY_BASEDIR_VERSION
......@@ -174,12 +219,6 @@ then
fi
export MYSQL_HOME
user=@MYSQLD_USER@
niceness=0
# these rely on $DATADIR by default, so we'll set them later on
pid_file=
err_log=
# Get first arguments from the my.cnf file, groups [mysqld] and [mysqld_safe]
# and then merge with the command line arguments
......@@ -201,16 +240,56 @@ append_arg_to_args () {
}
args=
SET_USER=2
parse_arguments `$print_defaults $defaults --loose-verbose mysqld server`
if test $SET_USER -eq 2
then
SET_USER=0
fi
parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysqld`
parse_arguments PICK-ARGS-FROM-ARGV "$@"
safe_mysql_unix_port=${mysql_unix_port:-${MYSQL_UNIX_PORT:-@MYSQL_UNIX_ADDR@}}
# Determine what logging facility to use
if [ -n "$err_log" -o $syslog -eq 0 ]
then
if [ -n "$err_log" ]
then
# mysqld adds ".err" if there is no extension on the --log-err
# argument; must match that here, or mysqld_safe will write to a
# different log file than mysqld
# mysqld does not add ".err" to "--log-error=foo."; it considers a
# trailing "." as an extension
if expr "$err_log" : '.*\.[^/]*$' > /dev/null
then
:
else
err_log="$err_log".err
fi
case "$err_log" in
/* ) ;;
* ) err_log="$DATADIR/$err_log" ;;
esac
else
err_log=$DATADIR/`@HOSTNAME@`.err
fi
append_arg_to_args "--log-error=$err_log"
if [ $syslog -eq 1 ]
then
# User explicitly asked for syslog, so warn that it isn't used
log_error "Can't log to error log and syslog at the same time. Remove all --log-error configuration options for --syslog to take effect. Logging to '$err_log'."
fi
# Don't use syslog since syslog and error log don't mix well
syslog=0
fi
safe_mysql_unix_port=${mysql_unix_port:-${MYSQL_UNIX_PORT:-@MYSQL_UNIX_ADDR@}}
# Make sure that directory for $safe_mysql_unix_port exists
mysql_unix_port_dir=`dirname $safe_mysql_unix_port`
if [ ! -d $mysql_unix_port_dir ]
......@@ -228,12 +307,11 @@ fi
if test ! -x $ledir/$MYSQLD
then
echo "The file $ledir/$MYSQLD doesn't exist or is not executable"
echo "Please do a cd to the mysql installation directory and restart"
echo "this script from there as follows:"
echo "./bin/mysqld_safe".
echo "See http://dev.mysql.com/doc/mysql/en/mysqld_safe.html for more"
echo "information"
log_error "The file $ledir/$MYSQLD
does not exist or is not executable. Please cd to the mysql installation
directory and restart this script from there as follows:
./bin/mysqld_safe&
See http://dev.mysql.com/doc/mysql/en/mysqld_safe.html for more information"
exit 1
fi
......@@ -248,30 +326,6 @@ else
fi
append_arg_to_args "--pid-file=$pid_file"
if [ -n "$err_log" ]
then
# mysqld adds ".err" if there is no extension on the --log-err
# argument; must match that here, or mysqld_safe will write to a
# different log file than mysqld
# mysqld does not add ".err" to "--log-error=foo."; it considers a
# trailing "." as an extension
if expr "$err_log" : '.*\.[^/]*$' > /dev/null
then
:
else
err_log="$err_log".err
fi
case "$err_log" in
/* ) ;;
* ) err_log="$DATADIR/$err_log" ;;
esac
else
err_log=$DATADIR/`@HOSTNAME@`.err
fi
append_arg_to_args "--log-error=$err_log"
if test -n "$mysql_unix_port"
then
append_arg_to_args "--socket=$mysql_unix_port"
......@@ -296,7 +350,7 @@ fi
if nohup nice > /dev/null 2>&1
then
normal_niceness=`nice`
nohup_niceness=`nohup nice`
nohup_niceness=`nohup nice 2>/dev/null`
numeric_nice_values=1
for val in $normal_niceness $nohup_niceness
......@@ -366,18 +420,17 @@ then
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
log_error "A mysqld process already exists"
exit 1
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"
log_error "Fatal error: Can't remove the pid file:
$pid_file
Please remove it manually and start $0 again;
mysqld daemon not started"
exit 1
fi
fi
......@@ -394,33 +447,32 @@ fi
# $MY_BASEDIR_VERSION/bin/myisamchk --silent --force --fast --medium-check $DATADIR/*/*.MYI
# $MY_BASEDIR_VERSION/bin/isamchk --silent --force $DATADIR/*/*.ISM
echo "Starting $MYSQLD daemon with databases from $DATADIR"
# 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
cmd="$NOHUP_NICENESS"
for i in "$ledir/$MYSQLD" "$defaults" "--basedir=$MY_BASEDIR_VERSION" \
"--datadir=$DATADIR" "$USER_OPTION"
do
cmd="$cmd "`shell_quote_string "$i"`
done
cmd="$cmd $args"
# Avoid 'nohup: ignoring input' warning
test -n "$NOHUP_NICENESS" && cmd="$cmd < /dev/null"
log_notice "Starting $MYSQLD daemon with databases from $DATADIR"
while true
do
rm -f $safe_mysql_unix_port $pid_file # Some extra safety
cmd="$NOHUP_NICENESS"
for i in "$ledir/$MYSQLD" "$defaults" "--basedir=$MY_BASEDIR_VERSION" \
"--datadir=$DATADIR" "$USER_OPTION"
do
cmd="$cmd "`shell_quote_string "$i"`
done
cmd="$cmd $args >> "`shell_quote_string "$err_log"`" 2>&1"
#echo "Running mysqld: [$cmd]"
eval "$cmd"
eval_log_error "$cmd"
if test ! -f $pid_file # This is removed if normal shutdown
then
echo "STOPPING server from pid file $pid_file"
break
fi
......@@ -433,7 +485,7 @@ do
# kill -9 is used or the process won't react on the kill.
numofproces=`ps xaww | grep -v "grep" | grep "$ledir/$MYSQLD\>" | grep -c "pid-file=$pid_file"`
echo -e "\nNumber of processes running now: $numofproces" | tee -a $err_log
log_notice "Number of processes running now: $numofproces"
I=1
while test "$I" -le "$numofproces"
do
......@@ -446,16 +498,15 @@ do
# echo "TEST $I - $T **"
if kill -9 $T
then
echo "$MYSQLD process hanging, pid $T - killed" | tee -a $err_log
else
log_error "$MYSQLD process hanging, pid $T - killed"
else
break
fi
I=`expr $I + 1`
done
fi
echo "`date +'%y%m%d %H:%M:%S'` mysqld restarted" | tee -a $err_log
log_notice "mysqld restarted"
done
echo "`date +'%y%m%d %H:%M:%S'` mysqld ended" | tee -a $err_log
echo "" | tee -a $err_log
log_notice "mysqld from pid file $pid_file ended"
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment