]> git.pld-linux.org Git - packages/mysql.git/blob - mysql.init
- merge initscript improvements from HEAD
[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         # Initialize variables
370         c_d="" i_d="" c_ht=""  c_tz=""
371         c_h="" i_h="" c_hc=""  c_tzt=""
372         c_u="" i_u="" c_hk=""  c_tztt=""
373         c_f="" i_f="" c_hr=""  c_tzls=""
374         c_t="" c_c="" c_tzn=""
375
376         # Check for old tables
377         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/db.frm
378         then
379           # mysqld --bootstrap wants one command/line
380           c_d="$c_d CREATE TABLE db ("
381           c_d="$c_d   Host char(60) DEFAULT '' NOT NULL,"
382           c_d="$c_d   Db char(64) DEFAULT '' NOT NULL,"
383           c_d="$c_d   User char(16) DEFAULT '' NOT NULL,"
384           c_d="$c_d   Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
385           c_d="$c_d   Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
386           c_d="$c_d   Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
387           c_d="$c_d   Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
388           c_d="$c_d   Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
389           c_d="$c_d   Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
390           c_d="$c_d   Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
391           c_d="$c_d   References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
392           c_d="$c_d   Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
393           c_d="$c_d   Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
394           c_d="$c_d   Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
395           c_d="$c_d   Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
396           c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
397           c_d="$c_d KEY User (User)"
398           c_d="$c_d )"
399           c_d="$c_d CHARACTER SET utf8 COLLATE utf8_bin"
400           c_d="$c_d comment='Database privileges';"
401
402           i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
403           INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');"
404
405         fi
406
407         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/host.frm
408         then
409           c_h="$c_h CREATE TABLE host ("
410           c_h="$c_h  Host char(60) DEFAULT '' NOT NULL,"
411           c_h="$c_h  Db char(64) DEFAULT '' NOT NULL,"
412           c_h="$c_h  Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
413           c_h="$c_h  Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
414           c_h="$c_h  Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
415           c_h="$c_h  Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
416           c_h="$c_h  Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
417           c_h="$c_h  Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
418           c_h="$c_h  Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
419           c_h="$c_h  References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
420           c_h="$c_h  Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
421           c_h="$c_h  Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
422           c_h="$c_h  Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
423           c_h="$c_h  Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
424           c_h="$c_h  PRIMARY KEY Host (Host,Db)"
425           c_h="$c_h )"
426           c_h="$c_h CHARACTER SET utf8 COLLATE utf8_bin"
427           c_h="$c_h comment='Host privileges;  Merged with database privileges';"
428         fi
429
430         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/user.frm
431         then
432           c_u="$c_u CREATE TABLE user ("
433           c_u="$c_u   Host char(60) DEFAULT '' NOT NULL,"
434           c_u="$c_u   User char(16) DEFAULT '' NOT NULL,"
435           c_u="$c_u   Password char(41) DEFAULT '' NOT NULL,"
436           c_u="$c_u   Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
437           c_u="$c_u   Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
438           c_u="$c_u   Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
439           c_u="$c_u   Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
440           c_u="$c_u   Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
441           c_u="$c_u   Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
442           c_u="$c_u   Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
443           c_u="$c_u   Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
444           c_u="$c_u   Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
445           c_u="$c_u   File_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
446           c_u="$c_u   Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
447           c_u="$c_u   References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
448           c_u="$c_u   Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
449           c_u="$c_u   Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
450           c_u="$c_u   Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
451           c_u="$c_u   Super_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
452           c_u="$c_u   Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
453           c_u="$c_u   Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
454           c_u="$c_u   Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
455           c_u="$c_u   Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
456           c_u="$c_u   Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
457           c_u="$c_u   ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL,"
458           c_u="$c_u   ssl_cipher BLOB NOT NULL,"
459           c_u="$c_u   x509_issuer BLOB NOT NULL,"
460           c_u="$c_u   x509_subject BLOB NOT NULL,"
461           c_u="$c_u   max_questions int(11) unsigned DEFAULT 0  NOT NULL,"
462           c_u="$c_u   max_updates int(11) unsigned DEFAULT 0  NOT NULL,"
463           c_u="$c_u   max_connections int(11) unsigned DEFAULT 0  NOT NULL,"
464           c_u="$c_u   PRIMARY KEY Host (Host,User)"
465           c_u="$c_u )"
466           c_u="$c_u CHARACTER SET utf8 COLLATE utf8_bin"
467           c_u="$c_u comment='Users and global privileges';"
468
469           i_u="INSERT INTO user VALUES ('localhost','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
470           INSERT INTO user VALUES ('$hostname','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
471
472           REPLACE INTO user VALUES ('localhost','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
473           REPLACE INTO user VALUES ('$hostname','mysql','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
474
475           INSERT INTO user VALUES ('localhost','mysql_logrotate','','N','N','N','N','N','N','Y','N','N','N','N','N','N','N','N','N','N','N','N','N','N','','','','',0,0,0);"
476         fi
477
478         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/func.frm
479         then
480           c_f="$c_f CREATE TABLE func ("
481           c_f="$c_f   name char(64) DEFAULT '' NOT NULL,"
482           c_f="$c_f   ret tinyint(1) DEFAULT '0' NOT NULL,"
483           c_f="$c_f   dl char(128) DEFAULT '' NOT NULL,"
484           c_f="$c_f   type enum ('function','aggregate') NOT NULL,"
485           c_f="$c_f   PRIMARY KEY (name)"
486           c_f="$c_f )"
487           c_f="$c_f CHARACTER SET utf8 COLLATE utf8_bin"
488           c_f="$c_f comment='User defined functions';"
489         fi
490
491         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/tables_priv.frm
492         then
493           c_t="$c_t CREATE TABLE tables_priv ("
494           c_t="$c_t   Host char(60) DEFAULT '' NOT NULL,"
495           c_t="$c_t   Db char(64) DEFAULT '' NOT NULL,"
496           c_t="$c_t   User char(16) DEFAULT '' NOT NULL,"
497           c_t="$c_t   Table_name char(60) DEFAULT '' NOT NULL,"
498           c_t="$c_t   Grantor char(77) DEFAULT '' NOT NULL,"
499           c_t="$c_t   Timestamp timestamp(14),"
500           c_t="$c_t   Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL,"
501           c_t="$c_t   Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
502           c_t="$c_t   PRIMARY KEY (Host,Db,User,Table_name),"
503           c_t="$c_t   KEY Grantor (Grantor)"
504           c_t="$c_t )"
505           c_t="$c_t CHARACTER SET utf8 COLLATE utf8_bin"
506           c_t="$c_t comment='Table privileges';"
507         fi
508
509         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/columns_priv.frm
510         then
511           c_c="$c_c CREATE TABLE columns_priv ("
512           c_c="$c_c   Host char(60) DEFAULT '' NOT NULL,"
513           c_c="$c_c   Db char(64) DEFAULT '' NOT NULL,"
514           c_c="$c_c   User char(16) DEFAULT '' NOT NULL,"
515           c_c="$c_c   Table_name char(64) DEFAULT '' NOT NULL,"
516           c_c="$c_c   Column_name char(64) DEFAULT '' NOT NULL,"
517           c_c="$c_c   Timestamp timestamp(14),"
518           c_c="$c_c   Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
519           c_c="$c_c   PRIMARY KEY (Host,Db,User,Table_name,Column_name)"
520           c_c="$c_c )"
521           c_c="$c_c CHARACTER SET utf8 COLLATE utf8_bin"
522           c_c="$c_c comment='Column privileges';"
523         fi
524
525         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_topic.frm
526         then
527           c_ht="$c_ht CREATE TABLE help_topic ("
528           c_ht="$c_ht   help_topic_id    int unsigned not null,"
529           c_ht="$c_ht   name             varchar(64) not null,"
530       c_ht="$c_ht   help_category_id smallint unsigned not null,"
531           c_ht="$c_ht   description      text not null,"
532           c_ht="$c_ht   example          text not null,"
533           c_ht="$c_ht   url              varchar(128) not null,"
534           c_ht="$c_ht   primary key      (help_topic_id),"
535           c_ht="$c_ht   unique index     (name)"
536           c_ht="$c_ht )"
537           c_ht="$c_ht CHARACTER SET utf8"
538           c_ht="$c_ht comment='help topics';"
539         fi
540
541         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_category.frm
542         then
543           c_hc="$c_hc CREATE TABLE help_category ("
544           c_hc="$c_hc   help_category_id   smallint unsigned not null,"
545           c_hc="$c_hc   name               varchar(64) not null,"
546           c_hc="$c_hc   parent_category_id smallint unsigned null,"
547           c_hc="$c_hc   url                varchar(128) not null,"
548           c_hc="$c_hc   primary key        (help_category_id),"
549           c_hc="$c_hc   unique index       (name)"
550           c_hc="$c_hc )"
551           c_hc="$c_hc   CHARACTER SET utf8"
552           c_hc="$c_hc comment='help categories';"
553         fi
554
555         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_keyword.frm
556         then
557           c_hk="$c_hk CREATE TABLE help_keyword ("
558           c_hk="$c_hk   help_keyword_id  int unsigned not null,"
559           c_hk="$c_hk   name             varchar(64) not null,"
560           c_hk="$c_hk   primary key      (help_keyword_id),"
561           c_hk="$c_hk   unique index     (name)"
562           c_hk="$c_hk )"
563           c_hk="$c_hk   CHARACTER SET utf8"
564           c_hk="$c_hk comment='help keywords';"
565         fi
566
567         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_relation.frm
568         then
569           c_hr="$c_hr CREATE TABLE help_relation ("
570           c_hr="$c_hr   help_topic_id    int unsigned not null references help_topic,"
571           c_hr="$c_hr   help_keyword_id  int unsigned not null references help_keyword,"
572           c_hr="$c_hr   primary key      (help_keyword_id, help_topic_id)"
573           c_hr="$c_hr )"
574           c_hr="$c_hr   CHARACTER SET utf8"
575           c_hr="$c_hr comment='keyword-topic relation';"
576         fi
577
578         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_name.frm
579         then
580           c_tzn="$c_tzn CREATE TABLE time_zone_name ("
581           c_tzn="$c_tzn   Name char(64) NOT NULL,"
582           c_tzn="$c_tzn   Time_zone_id int unsigned NOT NULL,"
583           c_tzn="$c_tzn   PRIMARY KEY Name (Name)"
584           c_tzn="$c_tzn )"
585           c_tzn="$c_tzn   CHARACTER SET utf8"
586           c_tzn="$c_tzn comment='Time zone names';"
587         fi
588
589         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone.frm
590         then
591           c_tz="$c_tz CREATE TABLE time_zone ("
592           c_tz="$c_tz   Time_zone_id int unsigned NOT NULL auto_increment,"
593           c_tz="$c_tz   Use_leap_seconds enum('Y','N') DEFAULT 'N' NOT NULL,"
594           c_tz="$c_tz   PRIMARY KEY TzId (Time_zone_id)"
595           c_tz="$c_tz )"
596           c_tz="$c_tz   CHARACTER SET utf8"
597           c_tz="$c_tz comment='Time zones';"
598         fi
599
600         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_transition.frm
601         then
602           c_tzt="$c_tzt CREATE TABLE time_zone_transition ("
603           c_tzt="$c_tzt   Time_zone_id int unsigned NOT NULL,"
604           c_tzt="$c_tzt   Transition_time bigint signed NOT NULL,"
605           c_tzt="$c_tzt   Transition_type_id int unsigned NOT NULL,"
606           c_tzt="$c_tzt   PRIMARY KEY TzIdTranTime (Time_zone_id, Transition_time)"
607           c_tzt="$c_tzt )"
608           c_tzt="$c_tzt   CHARACTER SET utf8"
609           c_tzt="$c_tzt comment='Time zone transitions';"
610         fi
611
612         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_transition_type.frm
613         then
614           c_tztt="$c_tztt CREATE TABLE time_zone_transition_type ("
615           c_tztt="$c_tztt   Time_zone_id int unsigned NOT NULL,"
616           c_tztt="$c_tztt   Transition_type_id int unsigned NOT NULL,"
617           c_tztt="$c_tztt   Offset int signed DEFAULT 0 NOT NULL,"
618           c_tztt="$c_tztt   Is_DST tinyint unsigned DEFAULT 0 NOT NULL,"
619           c_tztt="$c_tztt   Abbreviation char(8) DEFAULT '' NOT NULL,"
620           c_tztt="$c_tztt   PRIMARY KEY TzIdTrTId (Time_zone_id, Transition_type_id)"
621           c_tztt="$c_tztt )"
622           c_tztt="$c_tztt   CHARACTER SET utf8"
623           c_tztt="$c_tztt comment='Time zone transition types';"
624         fi
625
626         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_leap_second.frm
627         then
628           c_tzls="$c_tzls CREATE TABLE time_zone_leap_second ("
629           c_tzls="$c_tzls   Transition_time bigint signed NOT NULL,"
630           c_tzls="$c_tzls   Correction int signed NOT NULL,"
631           c_tzls="$c_tzls   PRIMARY KEY TranTime (Transition_time)"
632           c_tzls="$c_tzls )"
633           c_tzls="$c_tzls CHARACTER SET utf8"
634           c_tzls="$c_tzls   comment='Leap seconds information for time zones';"
635         fi
636
637         mkdir -p "$MYSQL_DATA_DIR"
638         # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
639         chown root:root "$MYSQL_CLUSTER_DIR"
640     chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
641         chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
642
643         if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
644             sed -e "
645                 s#\(datadir.*\)=.*#\1= $MYSQL_DATA_DIR#g;
646                 s#\(pid-file.*\)=.*#\1= $MYSQL_PIDFILE#g;
647                 s#\(socket.*\)=.*#\1= $MYSQL_SOCKET#g;
648                 s#@clusterdir@#$MYSQL_CLUSTER_DIR#g;
649                 " /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
650             chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
651             chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
652         fi
653
654         if [ ! -e /var/lib/mysql/mysql.sock ] || [ -L /var/lib/mysql/mysql.sock ] && [ -z "$(readlink /var/lib/mysql/mysql.sock)" ]; then
655                 sock=${MYSQL_SOCKET#/var/lib/mysql/} # make it relative if possible
656             ln -s "$sock" /var/lib/mysql/mysql.sock
657         fi
658
659         if /usr/sbin/mysqld --bootstrap --skip-grant-tables \
660             --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER << END_OF_DATA
661 CREATE DATABASE mysql;
662 use mysql;
663 $c_d
664 $i_d
665
666 $c_h
667 $i_h
668
669 $c_u
670 $i_u
671
672 $c_f
673 $i_f
674
675 $c_t
676 $c_c
677
678 $c_ht
679 $c_hc
680 $c_hk
681 $c_hr
682
683 $c_tzn
684 $c_tz
685 $c_tzt
686 $c_tztt
687 $c_tzls
688 END_OF_DATA
689         then
690             ok
691         cat << END_OF_MSG
692
693 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
694 This is done (after starting database; press enter when asked for password) with:
695
696 /usr/bin/mysqladmin -u mysql -p -S $MYSQL_SOCKET password 'password'
697 /usr/bin/mysqladmin -h $hostname -u mysql -p -S $MYSQL_SOCKET password 'password'
698 /usr/bin/mysqladmin -u mysql_logrotate -p -S $MYSQL_SOCKET password 'password'
699
700 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
701 mysqladmin section. See the manual for more instructions.
702
703 END_OF_MSG
704       else
705             fail
706             cat << END_OF_MSG
707 Installation of grant tables FAILED!
708
709 Examine the logs in $MYSQL_DATA_DIR for more information.  You can
710 also try to start the mysqld demon with:
711
712 /usr/sbin/mysqld --skip-grant &
713
714 You can use the command line tool /usr/bin/mysql to connect to the mysql
715 database and look at the grant tables:
716
717 shell> /usr/bin/mysql -u mysql mysql
718 mysql> show tables
719
720 Try 'mysqld --help' if you have problems with paths. Setting on
721 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
722 may be helpful. The latest information about MySQL is available on the
723 web at http://www.mysql.com/.
724
725 Please check PLD Linux ftp site for newer versions of this package.
726
727 Please consult the MySQL manual section: 'Problems running
728 mysql_install_db', and the manual section that describes problems on
729 your OS.  Another information source is the MySQL email archive.
730 Please check all of the above before mailing us!  And if you do mail
731 us, you MUST use the /usr/bin/mysqlbug script!
732
733 END_OF_MSG
734
735         exit 1
736         fi
737 }
738
739 #
740 # End of useful functions.
741 #
742
743 start() {
744         if [ ! -f $MYSQL_ERRLOG ]; then
745                 touch $MYSQL_ERRLOG
746         fi
747         chown mysql:mysql $MYSQL_ERRLOG
748         chmod 640 $MYSQL_ERRLOG
749
750         for mysqldir in $DB_CLUSTERS; do
751                 mysqlstatus "$mysqldir" start
752                 if [ "$MYSQL_STATUS" = "running" ]; then
753                         msg_already_running "MySQL $mysqldir"
754                 else
755                         mysqlstart "$mysqldir"
756                 fi
757         done
758         mysqlsubsys
759 }
760
761 stop() {
762         for mysqldir in $DB_CLUSTERS; do
763                 mysqlstatus "$mysqldir" stop
764                 if [ "$MYSQL_STATUS" = "not running" ]; then
765                         msg_not_running "MySQL $mysqldir"
766                 else
767                         mysqlstop "$mysqldir"
768                 fi
769         done
770         mysqlsubsys
771 }
772
773 RETVAL=0
774 case "$action" in
775   start)
776         start
777         ;;
778   stop)
779         stop
780         ;;
781   status)
782         for mysqldir in $DB_CLUSTERS; do
783                 mysqlstatus "$mysqldir"
784                 if [ "$MYSQL_STATUS" = "running" ]; then
785                         show "MySQL cluster %s, PID %s" "$mysqldir" "$MYSQL_PID"
786                         progress "$MYSQL_STATUS"
787                 else
788                         show "MySQL cluster %s" "$mysqldir"
789                         progress "$MYSQL_STATUS" "$CFAIL"
790                 fi
791                 echo
792         done
793         exit $?
794         ;;
795   restart|force-reload)
796         stop
797         start
798         ;;
799   init)
800         for mysqldir in $DB_CLUSTERS; do
801                 mysqlinit "$mysqldir"
802         done
803         exit $?
804         ;;
805   flush-logs)
806         for mysqldir in $DB_CLUSTERS; do
807             mysqlgetconfig "$mysqldir"
808                 # just if mysqld is really running
809                 if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
810                         /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
811                 fi
812         done
813         ;;
814   *)
815         msg_usage "$0 {start|stop|init|restart|force-reload|status}"
816         exit 3
817 esac
818
819 exit $RETVAL
820
821 # vi: shiftwidth=4 tabstop=4
This page took 0.097902 seconds and 4 git commands to generate.