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