Logoj0ke.net Open Build Service > Projects > internetx:mysql5 > mysql-community-server-55 > rc.mysql-multi
Sign Up | Log In

File rc.mysql-multi of Package mysql-community-server-55

x
 
1
#!/bin/bash
2
# Copyright (c) 1995-2011 SuSE Linux AG Nuernberg, Germany.
3
#
4
# Author:     Lenz Grimmer
5
# Maintainer: Michal Hrusecky <mhrusecky@suse.cz>
6
#
7
# mysqld_multi extension added by Richard Bos, 2008
8
#
9
# /etc/init.d/mysql
10
#
11
#   and its symbolic link
12
#
13
# /usr/sbin/rcmysql
14
#
15
### BEGIN INIT INFO
16
# Provides:       mysql
17
# Required-Start: $network $remote_fs
18
# Required-Stop: $network $remote_fs
19
# Default-Start:  2 3 5
20
# Default-Stop:
21
# Short-Description: Start the MySQL database server
22
# Description:    Start the MySQL database server
23
### END INIT INFO
24
25
# Shell functions sourced from /etc/rc.status:
26
#      rc_check         check and set local and overall rc status
27
#      rc_status        check and set local and overall rc status
28
#      rc_status -v     ditto but be verbose in local rc status
29
#      rc_status -v -r  ditto and clear the local rc status
30
#      rc_failed        set local and overall rc status to failed
31
#      rc_failed <num>  set local and overall rc status to <num>
32
#      rc_reset         clear local rc status (overall remains)
33
#      rc_exit          exit appropriate to overall rc status
34
. /etc/rc.status
35
36
# First reset status of this service
37
rc_reset
38
39
# Return values acc. to LSB for all commands but status:
40
# 0 - success
41
# 1 - generic or unspecified error
42
# 2 - invalid or excess argument(s)
43
# 3 - unimplemented feature (e.g. "reload")
44
# 4 - insufficient privilege
45
# 5 - program is not installed
46
# 6 - program is not configured
47
# 7 - program is not running
48
# 
49
# Note that starting an already running service, stopping
50
# or restarting a not-running service as well as the restart
51
# with force-reload (in case signalling is not supported) are
52
# considered a success.
53
54
# Check for the location of initscript
55
if [ "`echo "$0" | grep "^\."`" ] || [ "`echo "$0" | grep "^[^/].*/"`" ]; then
56
    MYSELF="`pwd`/$0"
57
else
58
    MYSELF="$0"
59
fi
60
61
parse_arguments() {
62
  for arg do
63
    case "$arg" in
64
      --basedir=*)   basedir="`echo "$arg"            | sed -e 's/^[^=]*=//'`" ;;
65
      --datadir=*)   datadir="`echo "$arg"            | sed -e 's/^[^=]*=//'`" ;;
66
      --pid-file=*)  pid_file="`echo "$arg"           | sed -e 's/^[^=]*=//'`" ;;
67
      --socket=*)    socket="`echo "$arg"             | sed -e 's/^[^=]*=//'`" ;;
68
      --log-error=*) log_error="`echo "$arg"          | sed -e 's/^[^=]*=//'`" ;;
69
      --user=*)      mysql_daemon_user="`echo "$arg"  | sed -e 's/^[^=]*=//'`" ;;
70
      --group=*)     mysql_daemon_group="`echo "$arg" | sed -e 's/^[^=]*=//'`" ;;
71
    esac
72
  done
73
}
74
75
wait_for_socket()
76
{
77
    local i
78
    for((i=0; i<150; i++)); do
79
        sleep 0.2
80
        test -S $1 && i='' && break
81
    done
82
    test -z "$i" || return 1
83
    return 0
84
}
85
86
# Don't run killproc -TERM, as it could send a SIGKILL as well, possibly
87
# resulting in database corruption. Run kill -TERM manually instead,  wait
88
# approximately 300 seconds and fail if mysql doesn't respond. This will at
89
# least prevent the SIGKILL when doing 'rcmysql stop' manually. During system
90
# shutdown, we are out of luck...
91
# See https://bugzilla.novell.com/show_bug.cgi?id=223209
92
kill_mysql ()
93
{
94
    local pid exe
95
    test -e "$pid_file" || return 7  # not running
96
    pid=`cat "$pid_file"` || return 4  # insufficient privileges
97
    if ! test -e /proc/version; then
98
        mount -n -t proc proc /proc
99
        test -e /proc/version || return 100
100
    fi
101
    test -L "/proc/$pid/exe" || return 7
102
    exe=`readlink "/proc/$pid/exe"` || return 4
103
    test "`echo "$exe" | grep "^$MYSQLD"`" || return 7
104
    kill -STOP "$pid"
105
    kill -TERM "$pid" || return 4 # suboptimal
106
    kill -CONT "$pid"
107
    for i in `seq 3000`; do
108
        # mysqld removes its pid file
109
        test -e "$pid_file" || return 0
110
        LC_ALL=C sleep 0.1
111
    done
112
    test -e "$pid_file" || return 0
113
    return 1
114
}
115
116
# Helper function which can end with any status
117
set_return_value() {
118
    return $1
119
}
120
121
# Checks for obsolete database
122
check_obsolete() {
123
    # check for ISAM tables
124
    tables="`find "$datadir" -name '*.ISM' 2> /dev/null | sed "s@$datadir/*@@; s@.ISM@@; s@/@.@;"`"
125
    if test "$tables" ; then
126
        echo
127
        echo "Some tables still use ISAM format, which is NO LONGER SUPPORTED"
128
        echo "since mysql 5.0. To use these tables, you would need to open them"
129
        echo "from an older mysql server and convert to something better (eg. MyISAM)."
130
        echo
131
        echo "Tables using ISAM are: "
132
        echo "  $tables "
133
        echo
134
    fi
135
    # check for bdb tables
136
    tables="`find "$datadir" -name '*.db' 2> /dev/null | sed "s@$datadir/*@@; s@.db@@; s@/@.@;"`"
137
    if test -n "$tables" ; then
138
        echo
139
        echo "Some tables still use BerkeleyDB format, which is NO LONGER SUPPORTED"
140
        echo "since mysql 5.1. To use these tables, you would need to open them"
141
        echo "from an older mysql server and convert to something better (eg. MyISAM)."
142
        echo
143
        echo "Tables using BerkeleyDB are: "
144
        echo "  $tables "
145
        echo
146
    fi
147
}
148
149
# Check if we want to run multiple instances.
150
[[ "`cat /etc/my.cnf | sed -n 's|^[[:blank:]]*\[mysqld[0-9]\+\]|yes|p'`" ]] && MYSQLD_MULTI=yes
151
152
# This was old way how to specify this, left for backward compatibility.
153
[[ -f /etc/sysconfig/mysql ]] && . /etc/sysconfig/mysql
154
155
if [[ "$MYSQLD_MULTI" == "yes" ]]; then
156
157
  [[ -x /usr/bin/mysqld_multi ]] || {
158
    echo -n "MySQL: /usr/bin/mysqld_multi not found" 
159
    rc_failed 5; rc_status -v; rc_exit;
160
  }
161
162
  case "$1" in
163
      start)
164
165
        # FIXME:
166
    # We assume a fresh install if the directory $datadir/mysql
167
    # does not exist and create the privilege database
168
        # if ! test -d $datadir/mysql; then
169
        #   echo -n "Creating MySQL privilege database... "
170
        #   mysql_install_db --user=$mysql_daemon_user --datadir=$datadir || {
171
        #     rc_failed;  rc_status -v; rc_exit
172
        #   }
173
        # fi
174
    echo -n "Starting service multi MySQL "
175
        mysqld_multi start
176
177
    # Remember status and be verbose
178
    rc_status -v
179
    ;;
180
181
      stop)
182
    echo -n "Shutting down service multi MySQL "
183
        mysqld_multi stop
184
185
    # Remember status and be verbose
186
    rc_status -v
187
    ;;
188
189
      try-restart)
190
    ## Stop the service and if this succeeds (i.e. the 
191
    ## service was running before), start it again.
192
    ## Note: try-restart is not (yet) part of LSB (as of 0.7.5)
193
    "$MYSELF" status >/dev/null &&  "$MYSELF" restart
194
195
    # Remember status and be quiet
196
    rc_status
197
    ;;
198
199
      restart|force-reload)
200
    echo "Restarting service multi MySQL "
201
    "$MYSELF" stop
202
    "$MYSELF" start
203
204
    rc_status
205
    ;;
206
207
      reload)
208
    echo -n "Reloading service multi MySQL "
209
    mysqld_multi reload
210
    rc_status -v
211
    ;;
212
    
213
      status)
214
    STATUS=$(mysqld_multi report)
215
        echo -n "$STATUS"
216
    # Set the status for rc_status
217
    echo "$STATUS" | grep -q "is running"
218
    rc_status -v
219
    ;;
220
221
      *)
222
    echo "Usage: $MYSELF {start|stop|status|reload|restart|try-restart|force-reload}"
223
    exit 1
224
    ;;
225
  esac
226
227
else
228
    # Test, if mysqld or mysql-max actually exist
229
    unset MYSQLD
230
231
    # use mysqld-debug only if explicitly requested (TODO: sysconfig variable?)
232
    if test "$MYSQLD_DEBUG" = yes -a -x /usr/sbin/mysqld-debug
233
    then
234
        MYSQLD=/usr/sbin/mysqld-debug
235
    elif test -x /usr/sbin/mysqld-max
236
    then
237
            MYSQLD=/usr/sbin/mysqld-max
238
    elif test -x /usr/sbin/mysqld
239
    then
240
            MYSQLD=/usr/sbin/mysqld
241
    fi
242
        test "$MYSQLD" || {
243
        echo -n "Nor /usr/sbin/mysqld nor /usr/sbin/mysqld-max exists";
244
        rc_failed 5; rc_status -v; rc_exit;
245
    }
246
247
248
    # The following section has been taken from
249
    # the original MySQL init script
250
    # Note: If you want to change these variables, you'll make your life easier
251
    # if you do so in /etc/my.cnf, which is preserved during upgrades
252
    basedir=/usr
253
    datadir=/var/lib/mysql
254
    mysql_daemon_user=mysql
255
    mysql_daemon_group=mysql
256
    pid_file=/var/run/mysql/mysqld.pid
257
    socket=/var/run/mysql/mysql.sock
258
    print_defaults=/usr/bin/my_print_defaults
259
    log_error=/var/log/mysql/mysqld.log
260
261
    mode=$1 # start or stop
262
263
    log_base="`echo "$log_error" | sed 's|\.log$||'`"
264
    [ "$log_base" \!= "$log_error" ] || log_base="/var/log/mysql/mysql"
265
    log_upgrade="${log_base}-upgrade.log"
266
    log_upgrade_run="${log_base}-upgrade-run.log"
267
    log_query="${log_base}-query.log"
268
269
    parse_arguments `$print_defaults $defaults mysqld mysql_server`
270
    mkdir -m 755 -p /var/run/mysql
271
    chown $mysql_daemon_user:$mysql_daemon_group /var/run/mysql
272
    export TMPDIR="`cat /var/run/mysql/tmpdir 2> /dev/null`"
273
274
    # Safeguard (relative paths, core dumps..)
275
    cd "$basedir"
276
277
    case "$1" in
278
        start)
279
        # exit gracefully, if we are already running
280
        "$MYSELF" status >/dev/null && echo -n "Starting service MySQL " && \
281
        rc_status -v && rc_exit
282
283
        # prepare tmp dir
284
        if [ "$TMPDIR" ] && [ -d "$TMPDIR" ] && \
285
            [ "`ls -ld "$TMPDIR" | grep "^drwx------[[:blank:]]\+[0-9]\+[[:blank:]]\+$mysql_daemon_user[[:blank:]]\+$mysql_daemon_group[[:blank:]]\+.*"`" ]; then
286
            rm -rf "$TMPDIR"
287
        fi
288
        TMPDIR="`mktemp -d -p /var/tmp mysql.XXXXXX | tee /var/run/mysql/tmpdir`"
289
        [ -z "$TMPDIR" ] || chown "$mysql_daemon_user:$mysql_daemon_group" "$TMPDIR"
290
        [ "`ls -ld "$TMPDIR" | grep "^drwx------[[:blank:]]\+[0-9]\+[[:blank:]]\+$mysql_daemon_user[[:blank:]]\+$mysql_daemon_group[[:blank:]]\+.*"`" ] || {
291
            echo "Can't create secure $TMPDIR"
292
            rc_failed; rc_status -v; rc_exit;
293
        }
294
295
        # Test, if safe_mysqld actually exists
296
        SAFE_MYSQLD=/usr/bin/mysqld_safe
297
        test -x $SAFE_MYSQLD || {
298
            echo "$SAFE_MYSQLD does not exist ";
299
            rc_failed 5; rc_status -v; rc_exit;
300
        }
301
        debug_flags=""
302
        if test "$MYSQLD_DEBUG" = yes; then
303
            # add --log, --core-file and --debug
304
            # but only if not already set in my.cnf
305
            if ! $print_defaults mysqld | \
306
                grep -q -e '--log$' -e '--log[[:blank:]=]'
307
            then
308
                debug_flags="--log=${log_query}"
309
            fi
310
            if ! $print_defaults mysqld | grep -q -e '^--debug\>' &&
311
                test "$MYSQLD" = /usr/sbin/mysqld-debug
312
            then
313
                debug_flags="$debug_flags --debug=d:t:F:L:o,$datadir/mysqld.trace"
314
            fi
315
            if ! $print_defaults mysqld | grep -q -e '^--core-file\>'
316
            then
317
                debug_flags="$debug_flags --core-file"
318
            fi
319
        fi
320
321
        # Creating parent directories for logs
322
        for i in "$log_upgrade" "$log_query" "$log_error"; do
323
            log_dir="`dirname "$i"`"
324
            if [ \! -d "$log_dir" ]; then
325
                mkdir -p "$log_dir"
326
                chmod 660 "$log_dir"
327
            fi
328
        done
329
330
        # We assume a fresh install if the directory $datadir/mysql
331
        # does not exist and create the privilege database
332
        if ! test -d "$datadir/mysql"; then
333
            echo "Creating MySQL privilege database... "
334
            mysql_install_db --user="$mysql_daemon_user" --datadir="$datadir" ||{
335
                rc_failed;  rc_status -v; rc_exit
336
            }
337
        fi
338
        check_obsolete
339
        # Run mysql_upgrade on every package install/upgrade. Not allways
340
        # necessary, but doesn't do any harm.
341
        if test -f "$datadir/.run-mysql_upgrade" ; then
342
            echo >> "$log_upgrade"
343
            echo "`LANG="" date` - upgrading MySQL..." >> "$log_upgrade"
344
            echo >> "$log_upgrade"
345
            echo "Will update MySQL now, if you encounter any problems, please read following file:" | tee -a "$log_upgrade"
346
            echo "  /usr/share/doc/packages/mysql/README.SuSE" | tee -a "$log_upgrade"
347
            # Check logs for inconsistencies
348
            SRCLOGS=""
349
            ALL_SRCLOGS=""
350
            for i in "$log_error" /var/lib/mysql/mysqld.log \
351
                 /var/log/mysqld.log ; do
352
                    if test -f "$i"; then
353
                        SRCLOGS="$i"
354
                        ALL_SRCLOGS="${ALL_SRCLOGS} ${i}"
355
                    fi
356
            done
357
            if [ "${ALL_SRCLOGS}" \!= " ${SRCLOGS}"  ]; then
358
                echo "Log files inconsistency, please merge following files manually:"
359
                echo $ALL_SRCLOGS | sed 's|[[:blank:]]\+|\n|' | sed 's|^|\t|'
360
            else
361
                if [ "$SRCLOGS" ]; then
362
                    [ "$SRCLOGS" = "$log_error" ] || mv "$SRCLOGS" "$log_error"
363
                fi
364
            fi
365
            check_obsolete >> "$log_upgrade"
366
            # instead of running mysqld --bootstrap, which wouldn't allow
367
            # us to run mysql_upgrade, we start a full-featured server with
368
            # --skip-grant-tables and restict access to it by unix
369
            # permissions of the named socket
370
            protected="`cat /var/run/mysql/protecteddir 2> /dev/null`"
371
            if [ -d "$protected" ]; then
372
                pid="`cat "$protected/mysqld.pid" 2> /dev/null`"
373
                if [ "$pid" ] && [ -d "/proc/$pid" ] &&
374
                    [ "`readlink "/proc/$pid/exe" | grep "mysql"`" ]; then
375
                        echo "Can't update as another updating process is currently running" | tee -a "$log_upgrade"
376
                        echo "Please check process $pid and terminate it before restarting MySQL" | tee -a "$log_upgrade"
377
                        rc_failed; rc_status -v; rc_exit;
378
                else
379
                    rm -rf "$protected"
380
                fi
381
            fi
382
            protected="`mktemp -d -p /var/tmp mysql-protected.XXXXXX | tee /var/run/mysql/protecteddir`"
383
            [ -z "$protected" ] || chown "$mysql_daemon_user:$mysql_daemon_group" "$protected"
384
            [ "`ls -ld "$protected" | grep "^drwx------[[:blank:]]\+[0-9]\+[[:blank:]]\+$mysql_daemon_user[[:blank:]]\+$mysql_daemon_group[[:blank:]]\+.*"`" ] || {
385
                echo "Can't create secure $protected" | tee -a "$log_upgrade"
386
                rc_failed; rc_status -v; rc_exit;
387
            }
388
389
            echo "Running protected MySQL... " | tee -a "$log_upgrade"
390
            $SAFE_MYSQLD \
391
                --mysqld=${MYSQLD#/usr/sbin/} \
392
                $debug_flags \
393
                --skip-networking \
394
                --skip-grant-tables \
395
                --datadir="$datadir" \
396
                --user="$mysql_daemon_user" \
397
                --log-error="$log_upgrade_run" \
398
                --socket="$protected/mysql.sock" \
399
                --pid-file="$protected/mysqld.pid" \
400
                --group="$mysql_daemon_group" &>/dev/null &
401
            wait_for_socket "$protected/mysql.sock" || {
402
                echo "error: $protected/mysql.sock file didn't appeared... " | tee -a "$log_upgrade"
403
                echo "       Try checking \"$log_upgrade_run\"... " | tee -a "$log_upgrade"
404
                rc_failed; rc_status -v; rc_exit;
405
            }
406
            echo "Upgrading MySQL... " | tee -a "$log_upgrade"
407
            /usr/bin/mysql_upgrade \
408
                --socket="$protected/mysql.sock" | tee -a "$log_upgrade"
409
            [ "$PIPESTATUS" -ne 0 ] && {
410
                rc_failed; rc_status -v;
411
                kill -TERM "`cat $protected/mysqld.pid`"
412
                rc_exit; }
413
            kill -TERM "`cat $protected/mysqld.pid`"
414
            rm -rf "$protected"
415
            # Fix ownerships and permissions for $datadir
416
            chmod 750 "$datadir"
417
            chown -R "$mysql_daemon_user:$mysql_daemon_group" "$datadir"
418
            rm -f "$datadir/.run-mysql_upgrade" \
419
            "$datadir"/{update-stamp-*,mysql/stamp-4.1} # used in the past
420
            chown "$mysql_daemon_user:$mysql_daemon_group" "$log_upgrade"
421
            chmod 640 "$log_upgrade"
422
        fi 
423
424
425
        echo -n "Starting service MySQL "
426
        
427
        $SAFE_MYSQLD \
428
            --mysqld=${MYSQLD#/usr/sbin/} \
429
            $debug_flags \
430
            --user="$mysql_daemon_user" \
431
            --pid-file="$pid_file" \
432
            --socket="$socket" \
433
            --datadir="$datadir" &>/dev/null &
434
435
        wait_for_socket "$socket" || {
436
            # let's not treat this as a fatal error
437
            echo "warning: $socket didn't appear within 30 seconds"
438
        }
439
        chmod a+r "$pid_file"
440
441
        # Rmember status and be verbose
442
        rc_status -v
443
        ;;
444
445
        stop)
446
        echo -n "Shutting down service MySQL "
447
        kill_mysql
448
        if [ "$TMPDIR" ] && [ -d "$TMPDIR" ] && \
449
            [ "`ls -ld "$TMPDIR" | grep "^drwx------[[:blank:]]\+[0-9]\+[[:blank:]]\+$mysql_daemon_user[[:blank:]]\+$mysql_daemon_group[[:blank:]]\+.*"`" ]; then
450
            rm -rf "$TMPDIR"
451
        fi
452
        # Remember status and be verbose
453
        rc_status -v
454
        ;;
455
456
        try-restart)
457
        ## Stop the service and if this succeeds (i.e. the 
458
        ## service was running before), start it again.
459
        ## Note: try-restart is not (yet) part of LSB (as of 0.7.5)
460
        "$MYSELF" status >/dev/null &&  "$MYSELF" restart
461
462
        # Remember status and be quiet
463
        rc_status
464
        ;;
465
466
        restart|force-reload)
467
        echo "Restarting service MySQL "
468
        "$MYSELF" stop
469
        "$MYSELF" start
470
471
        rc_status
472
        ;;
473
474
        reload)
475
        echo -n "Reloading service MySQL "
476
        kill -HUP "`cat "$pid_file"`"
477
        touch "$pid_file"
478
        rc_status -v
479
        ;;
480
        
481
        check|status)
482
        echo -n "Checking for service MySQL: "
483
        ## Check status with checkproc(8), if process is running
484
        ## checkproc will return with exit status 0.
485
486
        # Status has a slightly different for the status command:
487
        # 0 - service running
488
        # 1 - service dead, but /var/run/  pid  file exists
489
        # 2 - service dead, but /var/lock/ lock file exists
490
        # 3 - service not running
491
492
        # NOTE: checkproc returns LSB compliant status values,
493
        #       but it checks for running binary first and only
494
        #       if it doesn't find running process with proper
495
        #       name it checks pidfile. So we can't use it because
496
        #       akonadi runs it's own database.
497
        # checkproc -p $pid_file $MYSQLD
498
        if [ -f "$pid_file" ]; then
499
            if ! [ -e /proc/version ]; then
500
                mount -n -t proc proc /proc
501
                test -e /proc/version || set_return_value 100
502
            fi
503
            pid="`cat "$pid_file"`"
504
            if [ "$pid" ] && [ -d "/proc/$pid" ]; then
505
                cmd=`cat "/proc/$pid/cmdline" 2> /dev/null`
506
                exe=`readlink "/proc/$pid/exe" 2> /dev/null`
507
                if [ "`echo "$exe" | grep "^$MYSQLD"`" ] || [ "`echo "$cmd" | grep "^$MYSQLD"`" ]; then
508
                    set_return_value 0
509
                else
510
                    set_return_value 1
511
                fi
512
            else
513
                set_return_value 1
514
            fi
515
        else
516
            set_return_value 3
517
        fi
518
        rc_status -v
519
        ;;
520
521
        *)
522
        echo "Usage: $MYSELF {start|stop|status|reload|restart|try-restart|force-reload}"
523
        exit 1
524
        ;;
525
    esac
526
fi
527
528
rc_exit
529
530
# vim: ft=sh
531