]> git.pld-linux.org Git - packages/mysql.git/blob - mysql.init
- pass to mysql_create_system_tables to preserver previous init compatability (do...
[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                 $(/usr/sbin/mysql_create_system_tables real $MYSQL_DATA_DIR/mysql "$hostname")
394 EOF
395
396         ok=0
397         /usr/sbin/mysqld --bootstrap --skip-grant-tables \
398                 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER < $MYSQL_DATA_DIR/mysql-init.sql && ok=1
399         [ -f $MYSQL_DATA_DIR/mysql/host.frm ] || ok=0
400         if [ "$ok" = 1 ]; then
401                 rm -f $MYSQL_DATA_DIR/mysql-init.sql
402             ok
403         cat << END_OF_MSG
404
405 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
406 This is done (after starting database; press enter when asked for password) with:
407
408 /usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
409 /usr/bin/mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password'
410 /usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
411
412 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
413 mysqladmin section. See the manual for more instructions.
414
415 If you want to use new help tables in MySQL 4.1.x then you'll need to import the help data:
416 /usr/bin/mysql -u mysql -p -S $MYSQL_SOCKET mysql < /usr/share/mysql/fill_help_tables.sql
417
418 END_OF_MSG
419       else
420             fail
421             cat << END_OF_MSG
422 Installation of grant tables FAILED!
423
424 The initialization SQL script was preserved at $MYSQL_DATA_DIR/mysql-init.sql
425
426 Examine the logs in /var/log/mysql for more information.  You can
427 also try to start the mysqld daemon with:
428
429 /usr/sbin/mysqld --skip-grant &
430
431 You can use the command line tool /usr/bin/mysql to connect to the mysql
432 database and look at the grant tables:
433
434 shell> /usr/bin/mysql -u mysql mysql
435 mysql> show tables
436
437 Try 'mysqld --help' if you have problems with paths. Setting on
438 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
439 may be helpful. The latest information about MySQL is available on the
440 web at http://www.mysql.com/.
441
442 Please check PLD Linux ftp site for newer versions of this package.
443
444 Please consult the MySQL manual section: 'Problems running
445 mysql_install_db', and the manual section that describes problems on
446 your OS.  Another information source is the MySQL email archive.
447 Please check all of the above before mailing us!  And if you do mail
448 us, you MUST use the /usr/bin/mysqlbug script!
449
450 END_OF_MSG
451
452         exit 1
453         fi
454 }
455
456 #
457 # End of useful functions.
458 #
459
460 start() {
461         if [ ! -f $MYSQL_ERRLOG ]; then
462                 touch $MYSQL_ERRLOG
463         fi
464         chown mysql:mysql $MYSQL_ERRLOG
465         chmod 640 $MYSQL_ERRLOG
466
467         for mysqldir in $DB_CLUSTERS; do
468                 mysqlstatus "$mysqldir" start
469                 if [ "$MYSQL_STATUS" = "running" ]; then
470                         msg_already_running "MySQL $mysqldir"
471                 else
472                         mysqlstart "$mysqldir"
473                 fi
474         done
475         mysqlsubsys
476 }
477
478 stop() {
479         for mysqldir in $DB_CLUSTERS; do
480                 mysqlstatus "$mysqldir" stop
481                 if [ "$MYSQL_STATUS" = "not running" ]; then
482                         msg_not_running "MySQL $mysqldir"
483                 else
484                         mysqlstop "$mysqldir"
485                 fi
486         done
487         mysqlsubsys
488 }
489
490 RETVAL=0
491 case "$action" in
492   start)
493         start
494         ;;
495   stop)
496         stop
497         ;;
498   status)
499         for mysqldir in $DB_CLUSTERS; do
500                 mysqlstatus "$mysqldir"
501                 if [ "$MYSQL_STATUS" = "running" ]; then
502                         show "MySQL cluster %s, PID %s" "$mysqldir" "$MYSQL_PID"
503                         progress "$MYSQL_STATUS"
504                 else
505                         show "MySQL cluster %s" "$mysqldir"
506                         progress "$MYSQL_STATUS" "$CFAIL"
507                 fi
508                 echo
509         done
510         exit $?
511         ;;
512   restart|force-reload)
513         stop
514         start
515         ;;
516   init)
517         for mysqldir in $DB_CLUSTERS; do
518                 mysqlinit "$mysqldir"
519         done
520         exit $?
521         ;;
522   flush-logs)
523         for mysqldir in $DB_CLUSTERS; do
524             mysqlgetconfig "$mysqldir"
525                 # just if mysqld is really running
526                 if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
527                         /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
528                 fi
529         done
530         ;;
531   *)
532         msg_usage "$0 {start|stop|init|restart|force-reload|status}"
533         exit 3
534 esac
535
536 exit $RETVAL
537
538 # vi: shiftwidth=4 tabstop=4
This page took 0.121709 seconds and 4 git commands to generate.