From: Date: May 5 2007 3:06am Subject: bk commit into 5.1 tree (tsmith:1.2506) List-Archive: http://lists.mysql.com/commits/26157 Message-Id: <20070505010645.151E8D83DB@siva.hindu.god> Below is the list of changes that have just been committed into a local 5.1 repository of tsmith. When tsmith does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet@stripped, 2007-05-04 19:06:36-06:00, tsmith@stripped +1 -0 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@stripped, 2007-05-04 19:06:29-06:00, tsmith@stripped +153 -102 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 ' 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. # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: tsmith # Host: siva.hindu.god # Root: /home/tsmith/m/bk/maint/b4858/51 --- 1.87/scripts/mysqld_safe.sh 2006-12-15 03:21:40 -07:00 +++ 1.88/scripts/mysqld_safe.sh 2007-05-04 19:06:29 -06:00 @@ -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"