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