]> git.pld-linux.org Git - packages/mysql.git/blob - mysql.init
- reworked starting/stopping/status checking (arekm && glen)
[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=$(grep -v '^#' /etc/mysql/clusters.conf | cut -s -f 2 -d '=')
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         DB_CLUSTERS="$@"
61 else
62         DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
63 fi
64
65 MYSQL_ERRLOG=/var/log/mysql/err
66 MYSQL_START_WAIT_TIME=${MYSQL_START_WAIT_TIME:-15}
67 MYSQL_STOP_WAIT_TIME=${MYSQL_STOP_WAIT_TIME:-900}
68
69 #
70 # Useful functions.
71 #
72
73 #
74 # check for mysql status
75 #
76 # arguments:
77 # $1 - db cluster
78 # $2 - start|stop
79 #
80 # sets variables:
81 # MYSQL_STATUS = starting | running | not running | died
82 # MYSQL_PID    = pid of mysqld process
83 #
84 mysqlstatus() {
85         clusterdir="$1"
86         mode="$2"
87         
88         mysqlgetconfig "$clusterdir"
89
90         MYSQL_STATUS="not running"
91         MYSQL_PID="unknown"
92         MYSQL_PIDFILE_PID=""
93         MYSQL_GREP_PID=""
94
95         if [ -f "$MYSQL_PIDFILE" ]; then
96                 MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
97         fi
98         
99         if [ -n "$MYSQL_PIDFILE_PID" ]; then
100                 MYSQL_PID=$MYSQL_PIDFILE_PID
101                 if [ ! -d "/proc/$MYSQL_PID" ]; then
102                         MYSQL_STATUS="died"
103                         return
104                 elif (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline); then
105                         MYSQL_STATUS="running"
106                         return
107                 fi
108         fi
109
110         if [ "$mode" = "start" ]; then
111                 MYSQL_GREP_PID=$(grep -lE "^/usr/sbin/mysqld.*${MYSQL_PIDFILE}" /proc/[0-9]*/cmdline | awk -F "/" '{ print $3; exit; }')
112                 if [ -n "$MYSQL_GREP_PID" ]; then
113                         MYSQL_PID=$MYSQL_GREP_PID
114                         if (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline); then
115                                 if [ -f "$MYSQL_PIDFILE" ]; then
116                                         MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
117                                 fi
118                                 if [ -n "$MYSQL_PIDFILE_PID" ]; then
119                                         MYSQL_PID=$MYSQL_PIDFILE_PID
120                                         MYSQL_STATUS="running"
121                                         return
122                                 else
123                                         MYSQL_STATUS="starting"
124                                         return
125                                 fi
126                         fi
127                 fi
128         fi
129
130         # else default, "not running"
131 }
132
133 # get mysql configuration in variables
134 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE
135 #
136 # arguments
137 # $1 - db cluster
138
139 mysqlgetconfig() {
140         clusterdir="$1"
141
142         # emulate old behaviour if only one cluster specified
143         if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
144                 MYSQL_RA_COMPAT=yes; export MYSQL_RA_COMPAT
145                 config_file=/etc/mysqld.conf
146         else
147                 # TODO: convert this piece of crap to awk
148                 config=`grep -v "^#" /etc/mysql/clusters.conf | grep "${clusterdir}$" | cut -s -f 1 -d '='`
149                 if echo "$config" | grep -q '^/'; then
150                         config_file="$config"
151                 elif [ -f "/etc/mysql/$config" ]; then
152                         config_file=/etc/mysql/$config
153                 else
154                         config_file="$clusterdir/mysqld.conf"
155                 fi
156         fi
157
158         MYSQL_CLUSTER_DIR="$clusterdir"; export MYSQL_CLUSTER_DIR
159
160         if [ -z "$config_file" ]; then
161                 nls "Error: Can't find config file for %s cluster" "$clusterdir"
162                 exit 6
163         else
164                 MYSQL_CONFIG="$config_file"; export MYSQL_CONFIG
165         fi
166
167         if [ ! -f "$config_file" ]; then
168                 nls "Error: config file %s not found" "$config_file"
169                 nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
170                 exit 6
171         fi
172
173         eval `awk '
174 /^[ \t]*\[.*\][ \t]*$/ {
175         match($0,/\[.*\]/)
176         section=substr($0,RSTART+1,RSTART+RLENGTH-3)
177 }
178 section=="mysqld" && $2~"=" {
179         if ($1=="datadir") {
180                 printf("MYSQL_DATA_DIR=%s;", $3)
181         } else if ($1=="user") {
182                 printf("MYSQL_USER=%s;", $3)
183         } else if ($1=="pid-file") {
184                 printf("MYSQL_PIDFILE=%s;", $3)
185         } else if ($1=="socket") {
186                 printf("MYSQL_SOCKET=%s;", $3)
187         }
188 }
189 END {
190         print "export MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE MYSQL_SOCKET"
191 }
192 ' $config_file`
193
194
195         if is_yes "$MYSQL_RA_COMPAT"; then
196                 MYSQL_DATA_DIR_SUB=""
197         else
198                 MYSQL_DATA_DIR_SUB="/mysqldb"
199         fi
200
201         if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then
202                 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
203                 nls " MySQL can't be run."
204                 exit 6
205         fi
206
207         if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then
208                 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid"
209                 nls " MySQL can't be run."
210                 exit 6
211         fi
212
213         if [ -z $MYSQL_USER ]; then
214                 echo "$(nls 'MySQL user not configured properly')"'!' >&2
215                 nls "Edit %s and configure it." "$config_file" >&2
216                 exit 6
217         fi
218 }
219
220 # start mysql
221 mysqlstart() {
222         clusterdir="$1"
223         mysqlgetconfig "$clusterdir"
224         if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
225                 nls "MySQL cluster %s not initialized." "$clusterdir"
226                 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
227                 exit 6
228         fi
229
230         msg_starting "MySQL $clusterdir"
231         busy
232         [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
233         rm -f "$MYSQL_PIDFILE"
234         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_ERRLOG 2>&1 &
235         sleep 0.2
236         mysqlstatus "$clusterdir" start
237         # it takes longer for mysqld to start and create pidfile if it has to recover innodb transactions
238         if [ "$MYSQL_STATUS" = "starting" ]; then
239                 for nr in $(seq 1 $(($MYSQL_START_WAIT_TIME*10))); do
240                         [ -f "$MYSQL_PIDFILE" ] && break
241                         sleep 0.1
242                 done
243         fi
244
245         mysqlstatus "$clusterdir" start
246         if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
247                 ok
248         elif [ "$MYSQL_STATUS" = "died" ]; then
249                 RETVAL=1
250                 died
251         else
252                 RETVAL=1
253                 fail
254         fi
255 }
256
257 # stop mysql
258 mysqlstop() {
259         clusterdir="$1"
260         mysqlstatus "$clusterdir" stop
261         msg_stopping "MySQL $clusterdir"
262         busy
263
264         # try graceful shutdown -- send shutdown command
265         # requires mysql_logrotate user proper privs
266         /usr/bin/mysqladmin --defaults-file=$MYSQL_CONFIG ${MYSQL_SOCKET:+--socket=$MYSQL_SOCKET} shutdown >/dev/null 2>&1
267         mysqlstatus "$clusterdir" stop
268
269         if [ "$MYSQL_PID" != "unknown" ]; then
270                 kill -TERM "$MYSQL_PID" 2> /dev/null
271                 for nr in $(seq 1 $(($MYSQL_STOP_WAIT_TIME*10))); do
272                         [ -d "/proc/$MYSQL_PID" ] || break
273                         sleep 0.1
274                 done
275         fi
276         
277         mysqlstatus "$clusterdir" stop
278         if [ "$MYSQL_STATUS" = "died" ]; then
279                 died
280         elif [ "$MYSQL_STATUS" = "running" -o "$MYSQL_STATUS" = "starting" ]; then
281                 fail
282         else
283                 ok
284         fi
285 }
286
287 #
288 # check for running mysql instances; if any instance is running then
289 # create subsys lock file
290 #
291 mysqlsubsys() {
292         # check for every defined db cluster in sysconfig file
293         for mysqldir in $DB_CLUSTERS; do
294                 mysqlstatus "$mysqldir"
295                 if [ "$MYSQL_STATUS" = "running" ]; then
296                         touch /var/lock/subsys/mysql
297                         return
298                 fi
299         done
300         rm -f /var/lock/subsys/mysql
301 }
302
303 mysqlinit() {
304         clusterdir="$1"
305
306         if [ -f /etc/mysqld.conf ]; then
307                 nls "Running in \`no cluster compat' mode: can't initialize database."
308                 nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
309                 exit 1
310         fi
311
312         if [ -f "$clusterdir/mysqld.conf" ]; then
313                 mysqlgetconfig "$clusterdir"
314         else
315                 MYSQL_USER="mysql"
316                 MYSQL_CLUSTER_DIR="$clusterdir"
317                 MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
318                 MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
319                 MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
320
321                 # this $MYSQL_CONFIG will be created later
322                 MYSQL_CONFIG="$MYSQL_CLUSTER_DIR/mysqld.conf"
323         fi
324
325         nls "Initializing cluster %s" "$clusterdir"
326
327         # Check if not exist init database
328         if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
329                 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysql"
330                 nls "before initializing database."
331                 nls "For now skipping cluster %s." "$clusterdir"
332                 return
333         fi
334
335         show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
336         busy
337         TMP=/tmp TMPDIR=/tmp
338
339
340         # Install this in the user table, too
341         hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`"
342         [ -z "$hostname" ] && hostname="localhost-unknown"
343
344         # Check if hostname is valid
345         if [ -z "$hostname" ]; then
346                 deltext
347                 fail
348                 nls "Sorry, the host name is not configured."
349                 nls "Please configure the 'hostname' command to return a hostname."
350                 exit 1
351         elif ! hostname -i >/dev/null 2>&1; then
352                 deltext
353                 fail
354                 nls "Sorry, the host '%s' could not be looked up." "$hostname"
355                 nls "Please configure the 'hostname' command to return a correct hostname."
356                 exit 1
357         fi
358
359         # Initialize variables
360         c_d="" i_d="" c_ht=""  c_tz=""
361         c_h="" i_h="" c_hc=""  c_tzt=""
362         c_u="" i_u="" c_hk=""  c_tztt=""
363         c_f="" i_f="" c_hr=""  c_tzls=""
364         c_t="" c_c="" c_tzn="" c_p=""
365         c_pp=""
366
367         # Check for old tables
368         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/db.frm
369         then
370           # mysqld --bootstrap wants one command/line
371           c_d="$c_d CREATE TABLE db ("
372           c_d="$c_d   Host char(60) DEFAULT '' NOT NULL,"
373           c_d="$c_d   Db char(64) DEFAULT '' NOT NULL,"
374           c_d="$c_d   User char(16) DEFAULT '' NOT NULL,"
375           c_d="$c_d   Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
376           c_d="$c_d   Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
377           c_d="$c_d   Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
378           c_d="$c_d   Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
379           c_d="$c_d   Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
380           c_d="$c_d   Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
381           c_d="$c_d   Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
382           c_d="$c_d   References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
383           c_d="$c_d   Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
384           c_d="$c_d   Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
385           c_d="$c_d   Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
386           c_d="$c_d   Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
387           c_d="$c_d   Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
388           c_d="$c_d   Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
389           c_d="$c_d   Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
390           c_d="$c_d   Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
391           c_d="$c_d   Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
392           c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
393           c_d="$c_d KEY User (User)"
394           c_d="$c_d )"
395           c_d="$c_d CHARACTER SET utf8 COLLATE utf8_bin"
396           c_d="$c_d comment='Database privileges';"
397
398           i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N');
399           INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N');"
400
401         fi
402
403         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/host.frm
404         then
405           c_h="$c_h CREATE TABLE host ("
406           c_h="$c_h  Host char(60) DEFAULT '' NOT NULL,"
407           c_h="$c_h  Db char(64) DEFAULT '' NOT NULL,"
408           c_h="$c_h  Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
409           c_h="$c_h  Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
410           c_h="$c_h  Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
411           c_h="$c_h  Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
412           c_h="$c_h  Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
413           c_h="$c_h  Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
414           c_h="$c_h  Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
415           c_h="$c_h  References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
416           c_h="$c_h  Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
417           c_h="$c_h  Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
418           c_h="$c_h  Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
419           c_h="$c_h  Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
420           c_h="$c_h  Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
421           c_h="$c_h  Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
422           c_h="$c_h  Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
423           c_h="$c_h  Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
424           c_h="$c_h  Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
425           c_h="$c_h  PRIMARY KEY Host (Host,Db)"
426           c_h="$c_h )"
427           c_h="$c_h CHARACTER SET utf8 COLLATE utf8_bin"
428           c_h="$c_h comment='Host privileges;  Merged with database privileges';"
429         fi
430
431         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/user.frm
432         then
433           c_u="$c_u CREATE TABLE user ("
434           c_u="$c_u   Host char(60) binary DEFAULT '' NOT NULL,"
435           c_u="$c_u   User char(16) binary DEFAULT '' NOT NULL,"
436           c_u="$c_u   Password char(41) character set latin1 collate latin1_bin DEFAULT '' NOT NULL,"
437           c_u="$c_u   Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
438           c_u="$c_u   Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
439           c_u="$c_u   Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
440           c_u="$c_u   Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
441           c_u="$c_u   Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
442           c_u="$c_u   Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
443           c_u="$c_u   Reload_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
444           c_u="$c_u   Shutdown_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
445           c_u="$c_u   Process_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
446           c_u="$c_u   File_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
447           c_u="$c_u   Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
448           c_u="$c_u   References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
449           c_u="$c_u   Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
450           c_u="$c_u   Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
451           c_u="$c_u   Show_db_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
452           c_u="$c_u   Super_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
453           c_u="$c_u   Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
454           c_u="$c_u   Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
455           c_u="$c_u   Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
456           c_u="$c_u   Repl_slave_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
457           c_u="$c_u   Repl_client_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
458           c_u="$c_u   Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
459           c_u="$c_u   Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
460           c_u="$c_u   Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
461           c_u="$c_u   Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
462           c_u="$c_u   Create_user_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
463           c_u="$c_u   ssl_type enum('','ANY','X509', 'SPECIFIED') COLLATE utf8_general_ci DEFAULT '' NOT NULL,"
464           c_u="$c_u   ssl_cipher BLOB NOT NULL,"
465           c_u="$c_u   x509_issuer BLOB NOT NULL,"
466           c_u="$c_u   x509_subject BLOB NOT NULL,"
467           c_u="$c_u   max_questions int(11) unsigned DEFAULT 0  NOT NULL,"
468           c_u="$c_u   max_updates int(11) unsigned DEFAULT 0  NOT NULL,"
469           c_u="$c_u   max_connections int(11) unsigned DEFAULT 0  NOT NULL,"
470           c_u="$c_u   max_user_connections int(11) unsigned DEFAULT 0  NOT NULL,"
471           c_u="$c_u   PRIMARY KEY Host (Host,User)"
472           c_u="$c_u ) engine=MyISAM"
473           c_u="$c_u CHARACTER SET utf8 COLLATE utf8_bin"
474           c_u="$c_u comment='Users and global privileges';"
475
476
477           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','Y','Y','Y','Y','Y','','','','',0,0,0,0);
478           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','Y','Y','Y','Y','Y','','','','',0,0,0,0);
479           INSERT INTO user (host,user) values ('localhost','');
480           INSERT INTO user (host,user) values ('$hostname','');
481           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','N','N','N','N','N','','','','',0,0,0,0);"
482         fi
483
484         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/func.frm
485         then
486           c_f="$c_f CREATE TABLE func ("
487           c_f="$c_f   name char(64) DEFAULT '' NOT NULL,"
488           c_f="$c_f   ret tinyint(1) DEFAULT '0' NOT NULL,"
489           c_f="$c_f   dl char(128) DEFAULT '' NOT NULL,"
490           c_f="$c_f   type enum ('function','aggregate') COLLATE utf8_general_ci NOT NULL,"
491           c_f="$c_f   PRIMARY KEY (name)"
492           c_f="$c_f )"
493           c_f="$c_f CHARACTER SET utf8 COLLATE utf8_bin"
494           c_f="$c_f comment='User defined functions';"
495         fi
496
497         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/tables_priv.frm
498         then
499           c_t="$c_t CREATE TABLE tables_priv ("
500           c_t="$c_t   Host char(60) DEFAULT '' NOT NULL,"
501           c_t="$c_t   Db char(64) DEFAULT '' NOT NULL,"
502           c_t="$c_t   User char(16) DEFAULT '' NOT NULL,"
503           c_t="$c_t   Table_name char(60) DEFAULT '' NOT NULL,"
504           c_t="$c_t   Grantor char(77) DEFAULT '' NOT NULL,"
505           c_t="$c_t   Timestamp timestamp(14),"
506           c_t="$c_t   Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index', 'Alter','Create View','Show view') COLLATE utf8_general_ci DEFAULT '' NOT NULL,"
507           c_t="$c_t   Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL,"
508           c_t="$c_t   PRIMARY KEY (Host,Db,User,Table_name),"
509           c_t="$c_t   KEY Grantor (Grantor)"
510           c_t="$c_t )"
511           c_t="$c_t CHARACTER SET utf8 COLLATE utf8_bin"
512           c_t="$c_t comment='Table privileges';"
513         fi
514
515         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/columns_priv.frm
516         then
517           c_c="$c_c CREATE TABLE columns_priv ("
518           c_c="$c_c   Host char(60) DEFAULT '' NOT NULL,"
519           c_c="$c_c   Db char(64) DEFAULT '' NOT NULL,"
520           c_c="$c_c   User char(16) DEFAULT '' NOT NULL,"
521           c_c="$c_c   Table_name char(64) DEFAULT '' NOT NULL,"
522           c_c="$c_c   Column_name char(64) DEFAULT '' NOT NULL,"
523           c_c="$c_c   Timestamp timestamp(14),"
524           c_c="$c_c   Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL,"
525           c_c="$c_c   PRIMARY KEY (Host,Db,User,Table_name,Column_name)"
526           c_c="$c_c )"
527           c_c="$c_c CHARACTER SET utf8 COLLATE utf8_bin"
528           c_c="$c_c comment='Column privileges';"
529         fi
530
531         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/procs_priv.frm
532         then
533       c_pp="$c_pp CREATE TABLE procs_priv ("
534           c_pp="$c_pp   Host char(60) binary DEFAULT '' NOT NULL,"
535           c_pp="$c_pp   Db char(64) binary DEFAULT '' NOT NULL,"
536           c_pp="$c_pp   User char(16) binary DEFAULT '' NOT NULL,"
537           c_pp="$c_pp   Routine_name char(64) binary DEFAULT '' NOT NULL,"
538           c_pp="$c_pp   Routine_type enum('FUNCTION','PROCEDURE') NOT NULL,"
539           c_pp="$c_pp   Grantor char(77) DEFAULT '' NOT NULL,"
540           c_pp="$c_pp   Proc_priv set('Execute','Alter Routine','Grant') COLLATE utf8_general_ci DEFAULT '' NOT NULL,"
541           c_pp="$c_pp   Timestamp timestamp(14),"
542           c_pp="$c_pp   PRIMARY KEY (Host,Db,User,Routine_name,Routine_type),"
543           c_pp="$c_pp   KEY Grantor (Grantor)"
544           c_pp="$c_pp )"
545           c_pp="$c_pp CHARACTER SET utf8 COLLATE utf8_bin"
546           c_pp="$c_pp   comment='Procedure privileges';"
547     fi
548
549
550         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_topic.frm
551         then
552           c_ht="$c_ht CREATE TABLE help_topic ("
553           c_ht="$c_ht   help_topic_id    int unsigned not null,"
554           c_ht="$c_ht   name             varchar(64) not null,"
555       c_ht="$c_ht   help_category_id smallint unsigned not null,"
556           c_ht="$c_ht   description      text not null,"
557           c_ht="$c_ht   example          text not null,"
558           c_ht="$c_ht   url              varchar(128) not null,"
559           c_ht="$c_ht   primary key      (help_topic_id),"
560           c_ht="$c_ht   unique index     (name)"
561           c_ht="$c_ht )"
562           c_ht="$c_ht CHARACTER SET utf8"
563           c_ht="$c_ht comment='help topics';"
564         fi
565
566         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_category.frm
567         then
568           c_hc="$c_hc CREATE TABLE help_category ("
569           c_hc="$c_hc   help_category_id   smallint unsigned not null,"
570           c_hc="$c_hc   name               varchar(64) not null,"
571           c_hc="$c_hc   parent_category_id smallint unsigned null,"
572           c_hc="$c_hc   url                varchar(128) not null,"
573           c_hc="$c_hc   primary key        (help_category_id),"
574           c_hc="$c_hc   unique index       (name)"
575           c_hc="$c_hc )"
576           c_hc="$c_hc   CHARACTER SET utf8"
577           c_hc="$c_hc comment='help categories';"
578         fi
579
580         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_keyword.frm
581         then
582           c_hk="$c_hk CREATE TABLE help_keyword ("
583           c_hk="$c_hk   help_keyword_id  int unsigned not null,"
584           c_hk="$c_hk   name             varchar(64) not null,"
585           c_hk="$c_hk   primary key      (help_keyword_id),"
586           c_hk="$c_hk   unique index     (name)"
587           c_hk="$c_hk )"
588           c_hk="$c_hk   CHARACTER SET utf8"
589           c_hk="$c_hk comment='help keywords';"
590         fi
591
592         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_relation.frm
593         then
594           c_hr="$c_hr CREATE TABLE help_relation ("
595           c_hr="$c_hr   help_topic_id    int unsigned not null references help_topic,"
596           c_hr="$c_hr   help_keyword_id  int unsigned not null references help_keyword,"
597           c_hr="$c_hr   primary key      (help_keyword_id, help_topic_id)"
598           c_hr="$c_hr )"
599           c_hr="$c_hr   CHARACTER SET utf8"
600           c_hr="$c_hr comment='keyword-topic relation';"
601         fi
602
603         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_name.frm
604         then
605           c_tzn="$c_tzn CREATE TABLE time_zone_name ("
606           c_tzn="$c_tzn   Name char(64) NOT NULL,"
607           c_tzn="$c_tzn   Time_zone_id int unsigned NOT NULL,"
608           c_tzn="$c_tzn   PRIMARY KEY Name (Name)"
609           c_tzn="$c_tzn )"
610           c_tzn="$c_tzn   CHARACTER SET utf8"
611           c_tzn="$c_tzn comment='Time zone names';"
612         fi
613
614         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone.frm
615         then
616           c_tz="$c_tz CREATE TABLE time_zone ("
617           c_tz="$c_tz   Time_zone_id int unsigned NOT NULL auto_increment,"
618           c_tz="$c_tz   Use_leap_seconds enum('Y','N') DEFAULT 'N' NOT NULL,"
619           c_tz="$c_tz   PRIMARY KEY TzId (Time_zone_id)"
620           c_tz="$c_tz )"
621           c_tz="$c_tz   CHARACTER SET utf8"
622           c_tz="$c_tz comment='Time zones';"
623         fi
624
625         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_transition.frm
626         then
627           c_tzt="$c_tzt CREATE TABLE time_zone_transition ("
628           c_tzt="$c_tzt   Time_zone_id int unsigned NOT NULL,"
629           c_tzt="$c_tzt   Transition_time bigint signed NOT NULL,"
630           c_tzt="$c_tzt   Transition_type_id int unsigned NOT NULL,"
631           c_tzt="$c_tzt   PRIMARY KEY TzIdTranTime (Time_zone_id, Transition_time)"
632           c_tzt="$c_tzt )"
633           c_tzt="$c_tzt   CHARACTER SET utf8"
634           c_tzt="$c_tzt comment='Time zone transitions';"
635         fi
636
637         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_transition_type.frm
638         then
639           c_tztt="$c_tztt CREATE TABLE time_zone_transition_type ("
640           c_tztt="$c_tztt   Time_zone_id int unsigned NOT NULL,"
641           c_tztt="$c_tztt   Transition_type_id int unsigned NOT NULL,"
642           c_tztt="$c_tztt   Offset int signed DEFAULT 0 NOT NULL,"
643           c_tztt="$c_tztt   Is_DST tinyint unsigned DEFAULT 0 NOT NULL,"
644           c_tztt="$c_tztt   Abbreviation char(8) DEFAULT '' NOT NULL,"
645           c_tztt="$c_tztt   PRIMARY KEY TzIdTrTId (Time_zone_id, Transition_type_id)"
646           c_tztt="$c_tztt )"
647           c_tztt="$c_tztt   CHARACTER SET utf8"
648           c_tztt="$c_tztt comment='Time zone transition types';"
649         fi
650
651         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_leap_second.frm
652         then
653           c_tzls="$c_tzls CREATE TABLE time_zone_leap_second ("
654           c_tzls="$c_tzls   Transition_time bigint signed NOT NULL,"
655           c_tzls="$c_tzls   Correction int signed NOT NULL,"
656           c_tzls="$c_tzls   PRIMARY KEY TranTime (Transition_time)"
657           c_tzls="$c_tzls )"
658           c_tzls="$c_tzls CHARACTER SET utf8"
659           c_tzls="$c_tzls   comment='Leap seconds information for time zones';"
660         fi
661
662         if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/proc.frm
663         then
664           c_p="$c_p CREATE TABLE proc ("
665           c_p="$c_p   db                char(64) collate utf8_bin DEFAULT '' NOT NULL,"
666           c_p="$c_p   name              char(64) DEFAULT '' NOT NULL,"
667           c_p="$c_p   type              enum('FUNCTION','PROCEDURE') NOT NULL,"
668           c_p="$c_p   specific_name     char(64) DEFAULT '' NOT NULL,"
669           c_p="$c_p   language          enum('SQL') DEFAULT 'SQL' NOT NULL,"
670           c_p="$c_p   sql_data_access   enum('CONTAINS_SQL',"
671           c_p="$c_p                          'NO_SQL',"
672           c_p="$c_p                          'READS_SQL_DATA',"
673           c_p="$c_p                          'MODIFIES_SQL_DATA'"
674           c_p="$c_p                     ) DEFAULT 'CONTAINS_SQL' NOT NULL,"
675           c_p="$c_p   is_deterministic  enum('YES','NO') DEFAULT 'NO' NOT NULL,"
676           c_p="$c_p   security_type     enum('INVOKER','DEFINER') DEFAULT 'DEFINER' NOT NULL,"
677           c_p="$c_p   param_list        blob DEFAULT '' NOT NULL,"
678           c_p="$c_p   returns           char(64) DEFAULT '' NOT NULL,"
679           c_p="$c_p   body              longblob DEFAULT '' NOT NULL,"
680           c_p="$c_p   definer           char(77) collate utf8_bin DEFAULT '' NOT NULL,"
681           c_p="$c_p   created           timestamp,"
682           c_p="$c_p   modified          timestamp,"
683           c_p="$c_p   sql_mode          set("
684           c_p="$c_p                         'REAL_AS_FLOAT',"
685           c_p="$c_p                         'PIPES_AS_CONCAT',"
686           c_p="$c_p                         'ANSI_QUOTES',"
687           c_p="$c_p                         'IGNORE_SPACE',"
688           c_p="$c_p                         'NOT_USED',"
689           c_p="$c_p                         'ONLY_FULL_GROUP_BY',"
690           c_p="$c_p                         'NO_UNSIGNED_SUBTRACTION',"
691           c_p="$c_p                         'NO_DIR_IN_CREATE',"
692           c_p="$c_p                         'POSTGRESQL',"
693           c_p="$c_p                         'ORACLE',"
694           c_p="$c_p                         'MSSQL',"
695           c_p="$c_p                         'DB2',"
696           c_p="$c_p                         'MAXDB',"
697           c_p="$c_p                         'NO_KEY_OPTIONS',"
698           c_p="$c_p                         'NO_TABLE_OPTIONS',"
699           c_p="$c_p                         'NO_FIELD_OPTIONS',"
700           c_p="$c_p                         'MYSQL323',"
701           c_p="$c_p                         'MYSQL40',"
702           c_p="$c_p                         'ANSI',"
703           c_p="$c_p                         'NO_AUTO_VALUE_ON_ZERO',"
704           c_p="$c_p                         'NO_BACKSLASH_ESCAPES',"
705           c_p="$c_p                         'STRICT_TRANS_TABLES',"
706           c_p="$c_p                         'STRICT_ALL_TABLES',"
707           c_p="$c_p                         'NO_ZERO_IN_DATE',"
708           c_p="$c_p                         'NO_ZERO_DATE',"
709           c_p="$c_p                         'INVALID_DATES',"
710           c_p="$c_p                         'ERROR_FOR_DIVISION_BY_ZERO',"
711           c_p="$c_p                         'TRADITIONAL',"
712           c_p="$c_p                         'NO_AUTO_CREATE_USER',"
713           c_p="$c_p                         'HIGH_NOT_PRECEDENCE'"
714           c_p="$c_p                     ) DEFAULT '' NOT NULL,"
715           c_p="$c_p   comment           char(64) collate utf8_bin DEFAULT '' NOT NULL,"
716           c_p="$c_p   PRIMARY KEY (db,name,type)"
717           c_p="$c_p )"
718           c_p="$c_p character set utf8"
719           c_p="$c_p comment='Stored Procedures';"
720         fi
721
722         mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1
723         # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
724         chown root:root "$MYSQL_CLUSTER_DIR"
725     chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
726         chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
727
728         if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
729             sed -e "s#\(datadir.*\)=.*#\1= $MYSQL_DATA_DIR#g" \
730                 -e "s#\(pid-file.*\)=.*#\1= $MYSQL_PIDFILE#g" \
731                 -e "s#\(socket.*\)=.*#\1= $MYSQL_SOCKET#g" \
732                 /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
733             chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
734             chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
735         fi
736
737         if [ ! -e /var/lib/mysql/mysql.sock ]; then
738             ln -s "$MYSQL_SOCKET" /var/lib/mysql/mysql.sock
739         fi
740
741         if /usr/sbin/mysqld --bootstrap --skip-grant-tables \
742             --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER << END_OF_DATA
743 CREATE DATABASE mysql;
744 use mysql;
745 $c_d
746 $i_d
747
748 $c_h
749 $i_h
750
751 $c_u
752 $i_u
753
754 $c_f
755 $i_f
756
757 $c_t
758 $c_c
759
760 $c_ht
761 $c_hc
762 $c_hk
763 $c_hr
764
765 $c_tzn
766 $c_tz
767 $c_tzt
768 $c_tztt
769 $c_tzls
770
771 $c_p
772 $c_pp
773 END_OF_DATA
774         then
775             ok
776         cat << END_OF_MSG
777
778 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
779 This is done (after starting database; press enter when asked for password) with:
780
781 /usr/bin/mysqladmin -u mysql -p -S $MYSQL_SOCKET password 'password'
782 /usr/bin/mysqladmin -h $hostname -u mysql -p -S $MYSQL_SOCKET password 'password'
783 /usr/bin/mysqladmin -u mysql_logrotate -p -S $MYSQL_SOCKET password 'password'
784
785 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
786 mysqladmin section. See the manual for more instructions.
787
788 END_OF_MSG
789       else
790             fail
791             cat << END_OF_MSG
792 Installation of grant tables FAILED!
793
794 Examine the logs in $MYSQL_DATA_DIR for more information.  You can
795 also try to start the mysqld demon with:
796
797 /usr/sbin/mysqld --skip-grant &
798
799 You can use the command line tool /usr/bin/mysql to connect to the mysql
800 database and look at the grant tables:
801
802 shell> /usr/bin/mysql -u mysql mysql
803 mysql> show tables
804
805 Try 'mysqld --help' if you have problems with paths. Setting on
806 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
807 may be helpful. The latest information about MySQL is available on the
808 web at http://www.mysql.com/.
809
810 Please check PLD Linux ftp site for newer versions of this package.
811
812 Please consult the MySQL manual section: 'Problems running
813 mysql_install_db', and the manual section that describes problems on
814 your OS.  Another information source is the MySQL email archive.
815 Please check all of the above before mailing us!  And if you do mail
816 us, you MUST use the /usr/bin/mysqlbug script!
817
818 END_OF_MSG
819
820         exit 1
821         fi
822 }
823
824 #
825 # End of useful functions.
826 #
827
828 RETVAL=0
829 case "$action" in
830   start)
831         if [ ! -f $MYSQL_ERRLOG ]; then
832                 touch $MYSQL_ERRLOG
833         fi
834         chown mysql:mysql $MYSQL_ERRLOG
835         chmod 640 $MYSQL_ERRLOG
836
837         for mysqldir in $DB_CLUSTERS; do
838                 mysqlstatus "$mysqldir" start
839                 if [ "$MYSQL_STATUS" = "running" ]; then
840                         msg_already_running "MySQL $mysqldir"
841                 else
842                         mysqlstart "$mysqldir"
843                 fi
844         done
845         mysqlsubsys
846         ;;
847   stop)
848         for mysqldir in $DB_CLUSTERS; do
849                 mysqlstatus "$mysqldir" stop
850                 if [ "$MYSQL_STATUS" = "not running" ]; then
851                         msg_not_running "MySQL $mysqldir"
852                 else
853                         mysqlstop "$mysqldir"
854                 fi
855         done
856         mysqlsubsys
857         ;;
858   status)
859         status mysqld
860         for mysqldir in $DB_CLUSTERS; do
861                 mysqlstatus "$mysqldir"
862                 echo "MySQL cluster $mysqldir: $MYSQL_STATUS"
863         done
864         exit $?
865         ;;
866   restart|force-reload)
867         $0 stop $DB_CLUSTERS
868         $0 start $DB_CLUSTERS
869         exit $?
870         ;;
871   init)
872         for mysqldir in $DB_CLUSTERS; do
873                 mysqlinit "$mysqldir"
874         done
875         exit $?
876         ;;
877   flush-logs)
878         for mysqldir in $DB_CLUSTERS; do
879             mysqlgetconfig "$mysqldir"
880                 # just if mysqld is really running
881                 if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
882                         /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
883                 fi
884         done
885         ;;
886   *)
887         msg_usage "$0 {start|stop|init|restart|force-reload|status}"
888         exit 3
889 esac
890
891 exit $RETVAL
892
893 # vi: shiftwidth=4 tabstop=4
This page took 0.18346 seconds and 4 git commands to generate.