]> git.pld-linux.org Git - packages/mysql.git/blob - mysql.init
- drop BASE_TABLETYPE, was bad idea
[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         mkdir -p "$MYSQL_DATA_DIR"
351         # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
352         chown root:root "$MYSQL_CLUSTER_DIR"
353     chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
354         chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
355
356         if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
357             sed -e "
358                 s#\(datadir.*\)=.*#\1= $MYSQL_DATA_DIR#g;
359                 s#\(pid-file.*\)=.*#\1= $MYSQL_PIDFILE#g;
360                 s#\(socket.*\)=.*#\1= $MYSQL_SOCKET#g;
361                 s#@clusterdir@#$MYSQL_CLUSTER_DIR#g;
362                 " /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
363             chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
364             chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
365         fi
366
367         if [ ! -e /var/lib/mysql/mysql.sock ] || [ -L /var/lib/mysql/mysql.sock ] && [ -z "$(readlink /var/lib/mysql/mysql.sock)" ]; then
368                 sock=${MYSQL_SOCKET#/var/lib/mysql/} # make it relative if possible
369             ln -s "$sock" /var/lib/mysql/mysql.sock
370         fi
371
372         cat > $MYSQL_DATA_DIR/mysql-init.sql <<-EOF
373                 CREATE DATABASE mysql;
374                 $(/usr/sbin/mysql_create_system_tables real)
375 EOF
376
377         ok=0
378         /usr/sbin/mysqld --bootstrap --skip-grant-tables \
379                 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER < $MYSQL_DATA_DIR/mysql-init.sql && ok=1
380         [ -f $MYSQL_DATA_DIR/mysql/host.frm ] || ok=0
381         if [ "$ok" = 1 ]; then
382                 rm -f $MYSQL_DATA_DIR/mysql-init.sql
383             ok
384         cat << END_OF_MSG
385
386 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
387 This is done (after starting database; press enter when asked for password) with:
388
389 /usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
390 /usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
391
392 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
393 mysqladmin section. See the manual for more instructions.
394
395 If you want to use new help tables in MySQL 4.1.x then you'll need to import the help data:
396 /usr/bin/mysql -u mysql -p -S $MYSQL_SOCKET mysql < /usr/share/mysql/fill_help_tables.sql
397
398 END_OF_MSG
399       else
400             fail
401             cat << END_OF_MSG
402 Installation of grant tables FAILED!
403
404 The initialization SQL script was preserved at $MYSQL_DATA_DIR/mysql-init.sql
405
406 Examine the logs in /var/log/mysql for more information.  You can
407 also try to start the mysqld daemon with:
408
409 /usr/sbin/mysqld --skip-grant &
410
411 You can use the command line tool /usr/bin/mysql to connect to the mysql
412 database and look at the grant tables:
413
414 shell> /usr/bin/mysql -u mysql mysql
415 mysql> show tables
416
417 Try 'mysqld --help' if you have problems with paths. Setting on
418 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
419 may be helpful. The latest information about MySQL is available on the
420 web at http://www.mysql.com/.
421
422 Please check PLD Linux ftp site for newer versions of this package.
423
424 Please consult the MySQL manual section: 'Problems running
425 mysql_install_db', and the manual section that describes problems on
426 your OS.  Another information source is the MySQL email archive.
427 Please check all of the above before mailing us!  And if you do mail
428 us, you MUST use the /usr/bin/mysqlbug script!
429
430 END_OF_MSG
431
432         exit 1
433         fi
434 }
435
436 #
437 # End of useful functions.
438 #
439
440 start() {
441         if [ ! -f $MYSQL_ERRLOG ]; then
442                 touch $MYSQL_ERRLOG
443         fi
444         chown mysql:mysql $MYSQL_ERRLOG
445         chmod 640 $MYSQL_ERRLOG
446
447         for mysqldir in $DB_CLUSTERS; do
448                 mysqlstatus "$mysqldir" start
449                 if [ "$MYSQL_STATUS" = "running" ]; then
450                         msg_already_running "MySQL $mysqldir"
451                 else
452                         mysqlstart "$mysqldir"
453                 fi
454         done
455         mysqlsubsys
456 }
457
458 stop() {
459         for mysqldir in $DB_CLUSTERS; do
460                 mysqlstatus "$mysqldir" stop
461                 if [ "$MYSQL_STATUS" = "not running" ]; then
462                         msg_not_running "MySQL $mysqldir"
463                 else
464                         mysqlstop "$mysqldir"
465                 fi
466         done
467         mysqlsubsys
468 }
469
470 RETVAL=0
471 case "$action" in
472   start)
473         start
474         ;;
475   stop)
476         stop
477         ;;
478   status)
479         for mysqldir in $DB_CLUSTERS; do
480                 mysqlstatus "$mysqldir"
481                 if [ "$MYSQL_STATUS" = "running" ]; then
482                         show "MySQL cluster %s, PID %s" "$mysqldir" "$MYSQL_PID"
483                         progress "$MYSQL_STATUS"
484                 else
485                         show "MySQL cluster %s" "$mysqldir"
486                         progress "$MYSQL_STATUS" "$CFAIL"
487                 fi
488                 echo
489         done
490         exit $?
491         ;;
492   restart|force-reload)
493         stop
494         start
495         ;;
496   init)
497         for mysqldir in $DB_CLUSTERS; do
498                 mysqlinit "$mysqldir"
499         done
500         exit $?
501         ;;
502   flush-logs)
503         for mysqldir in $DB_CLUSTERS; do
504             mysqlgetconfig "$mysqldir"
505                 # just if mysqld is really running
506                 if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
507                         /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
508                 fi
509         done
510         ;;
511   *)
512         msg_usage "$0 {start|stop|init|restart|force-reload|status}"
513         exit 3
514 esac
515
516 exit $RETVAL
517
518 # vi: shiftwidth=4 tabstop=4
This page took 0.084857 seconds and 4 git commands to generate.