]> git.pld-linux.org Git - packages/mysql.git/blob - mysql.init
751829255e020d2db7e246d3d2302effcdf286bc
[packages/mysql.git] / mysql.init
1 #!/bin/sh
2 # $Id$
3 #
4 # mysql         A very fast and reliable SQL database engine
5 #
6 # chkconfig:    2345 84 25
7 #
8 # description:  A very fast and reliable SQL database engine.
9 #
10 # Source function library
11 . /etc/rc.d/init.d/functions
12
13 # Get network config
14 . /etc/sysconfig/network
15
16 # Get service config
17 if [ -f /etc/sysconfig/mysql ]; then
18         . /etc/sysconfig/mysql
19 else
20         nls "Error: %s not found" /etc/sysconfig/mysql
21         nls "%s can't be run." MySQL
22         exit 1
23 fi
24
25 if [ -n "$MYSQL_DB_CLUSTERS" ]; then
26         nls "Warning: MYSQL_DB_CLUSTERS is set. It's obsolete. Use %s instead." /etc/mysql/clusters.conf
27 fi
28
29 if [ -f /etc/mysql/clusters.conf ]; then
30         MYSQL_DB_CLUSTERS=$(awk -F= '!/^#/{print $2}' /etc/mysql/clusters.conf)
31         if [ -z "$MYSQL_DB_CLUSTERS"  ]; then
32                 nls "Warning: there are no configured clusters."
33         fi
34
35 else
36         nls "Warning: Missing clusters config file %s" /etc/mysql/clusters.conf
37         if [ -z "$MYSQL_DB_CLUSTERS"  ]; then
38                 nls "Warning: there are no configured clusters."
39                 nls "Using default cluster /var/lib/mysql (compatibility mode)"
40                 MYSQL_DB_CLUSTERS=/var/lib/mysql
41         fi
42 fi
43
44
45 # Check that networking is up
46 if is_yes "${NETWORKING}"; then
47         if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
48                 msg_network_down MySQL
49                 exit 1
50         fi
51 else
52         exit 0
53 fi
54
55 action="$1"
56
57 # any db cluster as command line argument?
58 if [ $# -gt 1 ]; then
59         shift
60         # perform action for specified clusters only
61         for a in "$@"; do
62                 # try auto resolving from /etc/mysql/clusters.conf
63                 if [[ "$a" != /* ]]; then
64                         m=$(awk -va="$a" -F= 'substr($0, 1, length(a)) == a {print $1}' /etc/mysql/clusters.conf)
65                         if [ -z "$m" ]; then
66                                 echo >&2 "Cluster name '$a' did not match anything!"
67                                 exit 1
68                         fi
69                         if [ $(echo "$m" | wc -l) -gt 1 ]; then
70                                 echo >&2 "Cluster name '$a' ambiguous:" $m
71                                 exit 1
72                         fi
73                         a=$(awk -va="$a" -F= 'substr($0, 1, length(a)) == a {print $2}' /etc/mysql/clusters.conf)
74                 fi
75                 DB_CLUSTERS="$DB_CLUSTERS $a"
76         done
77 else
78         DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
79 fi
80
81 MYSQL_ERRLOG=/var/log/mysql/err
82 MYSQL_START_WAIT_TIME=${MYSQL_START_WAIT_TIME:-15}
83 MYSQL_STOP_WAIT_TIME=${MYSQL_STOP_WAIT_TIME:-900}
84
85 #
86 # Useful functions.
87 #
88
89 #
90 # check for mysql status
91 #
92 # arguments:
93 # $1 - db cluster
94 # $2 - start|stop
95 #
96 # sets variables:
97 # MYSQL_STATUS = starting | running | not running | died
98 # MYSQL_PID    = pid of mysqld process
99 #
100 mysqlstatus() {
101         clusterdir="$1"
102         mode="$2"
103         
104         mysqlgetconfig "$clusterdir"
105
106         MYSQL_STATUS="not running"
107         MYSQL_PID="unknown"
108         MYSQL_PIDFILE_PID=""
109         MYSQL_GREP_PID=""
110
111         if [ -f "$MYSQL_PIDFILE" ]; then
112                 MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
113         fi
114         
115         if [ -n "$MYSQL_PIDFILE_PID" ]; then
116                 MYSQL_PID=$MYSQL_PIDFILE_PID
117                 if [ ! -d "/proc/$MYSQL_PID" ]; then
118                         MYSQL_STATUS="died"
119                         return
120                 elif (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null); then
121                         MYSQL_STATUS="running"
122                         return
123                 fi
124         fi
125
126         if [ "$mode" = "start" ]; then
127                 MYSQL_GREP_PID=$(grep -lE "^/usr/sbin/mysqld.*${MYSQL_PIDFILE}" /proc/[0-9]*/cmdline 2> /dev/null | awk -F "/" '{ print $3; exit; }')
128                 if [ -n "$MYSQL_GREP_PID" ]; then
129                         MYSQL_PID=$MYSQL_GREP_PID
130                         if grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null; then
131                                 if [ -f "$MYSQL_PIDFILE" ]; then
132                                         MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
133                                 fi
134                                 if [ -n "$MYSQL_PIDFILE_PID" ]; then
135                                         MYSQL_PID=$MYSQL_PIDFILE_PID
136                                         MYSQL_STATUS="running"
137                                         return
138                                 else
139                                         MYSQL_STATUS="starting"
140                                         return
141                                 fi
142                         fi
143                 fi
144         fi
145
146         # else default, "not running"
147 }
148
149 # get mysql configuration in variables
150 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE
151 #
152 # arguments
153 # $1 - db cluster
154
155 mysqlgetconfig() {
156         clusterdir="$1"
157
158         # emulate old behaviour if only one cluster specified
159         if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
160                 MYSQL_RA_COMPAT=yes
161                 config_file=/etc/mysqld.conf
162         else
163                 config=$(awk -F= -vclusterdir="$clusterdir" '!/^#/{ if (clusterdir == $2) print $1}' /etc/mysql/clusters.conf)
164                 if [[ $config = /* ]]; then
165                         config_file="$config"
166                 elif [ -f "/etc/mysql/$config" ]; then
167                         config_file="/etc/mysql/$config"
168                 else
169                         config_file="$clusterdir/mysqld.conf"
170                 fi
171         fi
172
173         MYSQL_CLUSTER_DIR="$clusterdir"
174
175         if [ -z "$config_file" ]; then
176                 nls "Error: Can't find config file for %s cluster" "$clusterdir"
177                 exit 6
178         else
179                 MYSQL_CONFIG="$config_file"
180         fi
181
182         if [ ! -f "$config_file" ]; then
183                 nls "Error: config file %s not found" "$config_file"
184                 nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
185                 exit 6
186         fi
187
188         eval `awk '
189 /^[ \t]*\[.*\][ \t]*$/ {
190         match($0,/\[.*\]/)
191         section=substr($0, RSTART + 1, RSTART + RLENGTH - 3)
192 }
193 section == "mysqld" && $2 ~ "=" {
194         if ($1 == "datadir") {
195                 printf("MYSQL_DATA_DIR=%s;", $3)
196         } else if ($1 == "user") {
197                 printf("MYSQL_USER=%s;", $3)
198         } else if ($1 == "pid-file") {
199                 printf("MYSQL_PIDFILE=%s;", $3)
200         } else if ($1 == "socket") {
201                 printf("MYSQL_SOCKET=%s;", $3)
202         }
203 }
204 ' $config_file`
205
206
207         if is_yes "$MYSQL_RA_COMPAT"; then
208                 MYSQL_DATA_DIR_SUB=""
209         else
210                 MYSQL_DATA_DIR_SUB="/mysqldb"
211         fi
212
213         if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then
214                 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
215                 nls " MySQL can't be run."
216                 exit 6
217         fi
218
219         if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then
220                 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid"
221                 nls " MySQL can't be run."
222                 exit 6
223         fi
224
225         if [ -z $MYSQL_USER ]; then
226                 echo "$(nls 'MySQL user not configured properly')"'!' >&2
227                 nls "Edit %s and configure it." "$config_file" >&2
228                 exit 6
229         fi
230 }
231
232 # start mysql
233 mysqlstart() {
234         clusterdir="$1"
235         mysqlgetconfig "$clusterdir"
236         if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
237                 nls "MySQL cluster %s not initialized." "$clusterdir"
238                 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
239                 exit 6
240         fi
241
242         msg_starting "MySQL $clusterdir"
243         busy
244         [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
245         rm -f "$MYSQL_PIDFILE"
246
247         TMPDIR=/tmp nice -n ${SERVICE_RUN_NICE_LEVEL:-$DEFAULT_SERVICE_RUN_NICE_LEVEL} \
248                 /usr/bin/setsid /usr/sbin/mysqld \
249                         --defaults-file=$MYSQL_CONFIG \
250                         --datadir=$MYSQL_DATA_DIR \
251                         --pid-file=$MYSQL_PIDFILE $MYSQL_OPTIONS \
252                 >> $MYSQL_ERRLOG 2>&1 &
253         pid=$!
254
255         sleep 0.1
256         mysqlstatus "$clusterdir" start
257         # it takes longer for mysqld to start and create pidfile if it has to recover innodb transactions
258         if [ "$MYSQL_STATUS" = "starting" ]; then
259                 echo ""
260                 show "Waiting for MySQL to start"
261                 busy
262
263                 # while the pid is running, mysql is starting up
264                 # if the pidfile was created, it started up successfully
265                 # if either case fails we break and report status
266                 while true; do
267                         [ -d /proc/$pid ] || break
268                         [ -f "$MYSQL_PIDFILE" ] && break
269                         sleep 0.2
270                 done
271         fi
272
273         mysqlstatus "$clusterdir" start
274         if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
275                 ok
276         elif [ "$MYSQL_STATUS" = "died" ]; then
277                 RETVAL=1
278                 died
279         else
280                 RETVAL=1
281                 fail
282         fi
283 }
284
285 # stop mysql
286 mysqlstop() {
287         clusterdir="$1"
288         mysqlstatus "$clusterdir" stop
289         msg_stopping "MySQL $clusterdir"
290         busy
291
292         # try graceful shutdown -- send shutdown command
293         # requires mysql_logrotate user proper privs
294         /usr/bin/mysqladmin --defaults-file=$MYSQL_CONFIG ${MYSQL_SOCKET:+--socket=$MYSQL_SOCKET} shutdown >/dev/null 2>&1
295         mysqlstatus "$clusterdir" stop
296
297         if [ "$MYSQL_PID" != "unknown" ]; then
298                 kill -TERM "$MYSQL_PID" 2> /dev/null
299                 for nr in $(seq 1 $(($MYSQL_STOP_WAIT_TIME*10))); do
300                         [ -d "/proc/$MYSQL_PID" ] || break
301                         sleep 0.1
302                 done
303         fi
304         
305         mysqlstatus "$clusterdir" stop
306         if [ "$MYSQL_STATUS" = "died" ]; then
307                 died
308         elif [ "$MYSQL_STATUS" = "running" -o "$MYSQL_STATUS" = "starting" ]; then
309                 fail
310         else
311                 ok
312         fi
313 }
314
315 #
316 # check for running mysql instances; if any instance is running then
317 # create subsys lock file
318 #
319 mysqlsubsys() {
320         # check for every defined db cluster in sysconfig file
321         for mysqldir in $DB_CLUSTERS; do
322                 mysqlstatus "$mysqldir"
323                 if [ "$MYSQL_STATUS" = "running" ]; then
324                         touch /var/lock/subsys/mysql
325                         return
326                 fi
327         done
328         rm -f /var/lock/subsys/mysql
329 }
330
331 mysqlinit() {
332         clusterdir="$1"
333
334         if [ -f /etc/mysqld.conf ]; then
335                 nls "Running in \`no cluster compat' mode: can't initialize database."
336                 nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
337                 exit 1
338         fi
339
340         if [ -f "$clusterdir/mysqld.conf" ]; then
341                 mysqlgetconfig "$clusterdir"
342         else
343                 MYSQL_USER="mysql"
344                 MYSQL_CLUSTER_DIR="$clusterdir"
345                 MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
346                 MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
347                 MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
348
349                 # this $MYSQL_CONFIG will be created later
350                 MYSQL_CONFIG="$MYSQL_CLUSTER_DIR/mysqld.conf"
351         fi
352
353         show "Initializing cluster %s" "$clusterdir"; echo
354
355         # Check if not exist init database
356         if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
357                 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysql"
358                 nls "before initializing database."
359                 nls "For now skipping cluster %s." "$clusterdir"
360                 return
361         fi
362
363         show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
364         busy
365         TMP=/tmp TMPDIR=/tmp
366
367         # Install this in the user table, too
368         hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`"
369         [ -z "$hostname" ] && hostname="localhost-unknown"
370
371         # Check if hostname is valid
372         if [ -z "$hostname" ]; then
373                 deltext
374                 fail
375                 nls "Sorry, the host name is not configured."
376                 nls "Please configure the 'hostname' command to return a hostname."
377                 exit 1
378         elif ! hostname -i >/dev/null 2>&1; then
379                 deltext
380                 fail
381                 nls "Sorry, the host '%s' could not be looked up." "$hostname"
382                 nls "Please configure the 'hostname' command to return a correct hostname."
383                 exit 1
384         fi
385
386         mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1
387         # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
388         chown root:root "$MYSQL_CLUSTER_DIR"
389     chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
390         chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
391
392         if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
393             sed -e "
394                 s#\(datadir.*\)=.*#\1= $MYSQL_DATA_DIR#g;
395                 s#\(pid-file.*\)=.*#\1= $MYSQL_PIDFILE#g;
396                 s#\(socket.*\)=.*#\1= $MYSQL_SOCKET#g;
397                 s#@clusterdir@#$MYSQL_CLUSTER_DIR#g;
398                 " /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
399             chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
400             chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
401         fi
402
403         if [ ! -e /var/lib/mysql/mysql.sock ] || [ -L /var/lib/mysql/mysql.sock ] && [ -z "$(readlink /var/lib/mysql/mysql.sock)" ]; then
404                 sock=${MYSQL_SOCKET#/var/lib/mysql/} # make it relative if possible
405             ln -s "$sock" /var/lib/mysql/mysql.sock
406         fi
407
408         cat > $MYSQL_DATA_DIR/mysql-init.sql <<-EOF
409                 CREATE DATABASE mysql;
410                 use mysql;
411                 $(cat /usr/share/mysql/mysql_system_tables.sql)
412                 $(sed -e "s,@@hostname,'$hostname',g;s,'root','mysql',g" /usr/share/mysql/mysql_system_tables_data.sql)
413 EOF
414
415         ok=0
416         /usr/sbin/mysqld --bootstrap --skip-grant-tables \
417                 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER \
418                 --slave-load-tmpdir=$MYSQL_DATA_DIR --tmpdir=$MYSQL_DATA_DIR < \
419                 $MYSQL_DATA_DIR/mysql-init.sql 2>> /var/log/mysql/err && ok=1
420         [ -f $MYSQL_DATA_DIR/mysql/host.frm ] || ok=0
421
422         if [ "$ok" = 1 ]; then
423                 rm -f $MYSQL_DATA_DIR/mysql-init.sql
424             ok
425         cat << END_OF_MSG
426
427 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
428 This is done (after starting database; press enter when asked for password) with:
429
430 mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
431 mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password'
432 mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
433
434 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
435 mysqladmin section. See the manual for more instructions.
436
437 If you want to use new help tables in MySQL 4.1.x then you'll need to import the help data:
438 mysql -u mysql -p -S $MYSQL_SOCKET mysql < /usr/share/mysql/fill_help_tables.sql
439
440 END_OF_MSG
441       else
442             fail
443             cat << END_OF_MSG
444 Installation of grant tables FAILED!
445
446 The initialization SQL script was preserved at $MYSQL_DATA_DIR/mysql-init.sql
447
448 Examine the logs in /var/log/mysql for more information.  You can
449 also try to start the mysqld daemon with:
450
451 /usr/sbin/mysqld --skip-grant &
452
453 You can use the command line tool mysql to connect to the mysql
454 database and look at the grant tables:
455
456 shell> mysql -u mysql mysql
457 mysql> show tables
458
459 Try 'mysqld --help' if you have problems with paths. Setting on
460 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
461 may be helpful. The latest information about MySQL is available on the
462 web at http://www.mysql.com/.
463
464 Please check PLD Linux ftp site for newer versions of this package.
465
466 Please consult the MySQL manual section: 'Problems running
467 mysql_install_db', and the manual section that describes problems on
468 your OS.  Another information source is the MySQL email archive.
469 Please check all of the above before mailing us!  And if you do mail
470 us, you MUST use the mysqlbug script!
471
472 END_OF_MSG
473
474         exit 1
475         fi
476 }
477
478 #
479 # End of useful functions.
480 #
481
482 start() {
483         if [ ! -f $MYSQL_ERRLOG ]; then
484                 touch $MYSQL_ERRLOG
485         fi
486         chown mysql:mysql $MYSQL_ERRLOG
487         chmod 640 $MYSQL_ERRLOG
488
489         for mysqldir in $DB_CLUSTERS; do
490                 mysqlstatus "$mysqldir" start
491                 if [ "$MYSQL_STATUS" = "running" ]; then
492                         msg_already_running "MySQL $mysqldir"
493                 else
494                         mysqlstart "$mysqldir"
495                 fi
496         done
497         mysqlsubsys
498 }
499
500 stop() {
501         for mysqldir in $DB_CLUSTERS; do
502                 mysqlstatus "$mysqldir" stop
503                 if [ "$MYSQL_STATUS" = "not running" ]; then
504                         msg_not_running "MySQL $mysqldir"
505                 else
506                         mysqlstop "$mysqldir"
507                 fi
508         done
509         mysqlsubsys
510 }
511
512 RETVAL=0
513 case "$action" in
514   start)
515         start
516         ;;
517   stop)
518         stop
519         ;;
520   status)
521         for mysqldir in $DB_CLUSTERS; do
522                 mysqlstatus "$mysqldir"
523                 if [ "$MYSQL_STATUS" = "running" ]; then
524                         show "MySQL cluster %s, PID %s" "$mysqldir" "$MYSQL_PID"
525                         progress "$MYSQL_STATUS"
526                 else
527                         show "MySQL cluster %s" "$mysqldir"
528                         progress "$MYSQL_STATUS" "$CFAIL"
529                 fi
530                 echo
531         done
532         exit $?
533         ;;
534   restart|force-reload)
535         stop
536         start
537         ;;
538   init)
539         for mysqldir in $DB_CLUSTERS; do
540                 mysqlinit "$mysqldir"
541         done
542         exit $?
543         ;;
544   flush-logs)
545         for mysqldir in $DB_CLUSTERS; do
546             mysqlgetconfig "$mysqldir"
547                 # just if mysqld is really running
548                 if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
549                         /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
550                 fi
551         done
552         ;;
553   *)
554         msg_usage "$0 {start|stop|init|restart|force-reload|status}"
555         exit 3
556 esac
557
558 exit $RETVAL
559
560 # vi: shiftwidth=4 tabstop=4
This page took 0.09197 seconds and 3 git commands to generate.