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