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