3 # mysql A very fast and reliable SQL database engine
5 # chkconfig: 2345 84 25
7 # description: A very fast and reliable SQL database engine.
9 # Source function library
10 . /etc/rc.d/init.d/functions
13 . /etc/sysconfig/network
16 if [ -f /etc/sysconfig/mysql ]; then
17 . /etc/sysconfig/mysql
19 nls "Error: %s not found" /etc/sysconfig/mysql
20 nls "%s can't be run." MySQL
24 [ -z "$BASE_TABLETYPE" ] && BASE_TABLETYPE="InnoDB"
26 if [ -n "$MYSQL_DB_CLUSTERS" ]; then
27 nls "Warning: MYSQL_DB_CLUSTERS is set. It's obsolete. Use %s instead." /etc/mysql/clusters.conf
30 if [ -f /etc/mysql/clusters.conf ]; then
31 MYSQL_DB_CLUSTERS=$(awk -F= '!/^#/{print $2}' /etc/mysql/clusters.conf)
32 if [ -z "$MYSQL_DB_CLUSTERS" ]; then
33 nls "Warning: there are no configured clusters."
37 nls "Warning: Missing clusters config file %s" /etc/mysql/clusters.conf
38 if [ -z "$MYSQL_DB_CLUSTERS" ]; then
39 nls "Warning: there are no configured clusters."
40 nls "Using default cluster /var/lib/mysql (compatibility mode)"
41 MYSQL_DB_CLUSTERS=/var/lib/mysql
46 # Check that networking is up
47 if is_yes "${NETWORKING}"; then
48 if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
49 msg_network_down MySQL
58 # any db cluster as command line argument?
61 # perform action for specified clusters only
64 DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
67 MYSQL_ERRLOG=/var/log/mysql/err
68 MYSQL_START_WAIT_TIME=${MYSQL_START_WAIT_TIME:-15}
69 MYSQL_STOP_WAIT_TIME=${MYSQL_STOP_WAIT_TIME:-900}
76 # check for mysql status
83 # MYSQL_STATUS = starting | running | not running | died
84 # MYSQL_PID = pid of mysqld process
90 mysqlgetconfig "$clusterdir"
92 MYSQL_STATUS="not running"
97 if [ -f "$MYSQL_PIDFILE" ]; then
98 MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
101 if [ -n "$MYSQL_PIDFILE_PID" ]; then
102 MYSQL_PID=$MYSQL_PIDFILE_PID
103 if [ ! -d "/proc/$MYSQL_PID" ]; then
106 elif (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null); then
107 MYSQL_STATUS="running"
112 if [ "$mode" = "start" ]; then
113 MYSQL_GREP_PID=$(grep -lE "^/usr/sbin/mysqld.*${MYSQL_PIDFILE}" /proc/[0-9]*/cmdline 2> /dev/null | awk -F "/" '{ print $3; exit; }')
114 if [ -n "$MYSQL_GREP_PID" ]; then
115 MYSQL_PID=$MYSQL_GREP_PID
116 if grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null; then
117 if [ -f "$MYSQL_PIDFILE" ]; then
118 MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
120 if [ -n "$MYSQL_PIDFILE_PID" ]; then
121 MYSQL_PID=$MYSQL_PIDFILE_PID
122 MYSQL_STATUS="running"
125 MYSQL_STATUS="starting"
132 # else default, "not running"
135 # get mysql configuration in variables
136 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE
144 # emulate old behaviour if only one cluster specified
145 if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
147 config_file=/etc/mysqld.conf
149 config=$(awk -F= -vclusterdir="$clusterdir" '!/^#/{ if (clusterdir == $2) print $1}' /etc/mysql/clusters.conf)
150 if [[ $config = /* ]]; then
151 config_file="$config"
152 elif [ -f "/etc/mysql/$config" ]; then
153 config_file="/etc/mysql/$config"
155 config_file="$clusterdir/mysqld.conf"
159 MYSQL_CLUSTER_DIR="$clusterdir"
161 if [ -z "$config_file" ]; then
162 nls "Error: Can't find config file for %s cluster" "$clusterdir"
165 MYSQL_CONFIG="$config_file"
168 if [ ! -f "$config_file" ]; then
169 nls "Error: config file %s not found" "$config_file"
170 nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
175 /^[ \t]*\[.*\][ \t]*$/ {
177 section=substr($0, RSTART + 1, RSTART + RLENGTH - 3)
179 section == "mysqld" && $2 ~ "=" {
180 if ($1 == "datadir") {
181 printf("MYSQL_DATA_DIR=%s;", $3)
182 } else if ($1 == "user") {
183 printf("MYSQL_USER=%s;", $3)
184 } else if ($1 == "pid-file") {
185 printf("MYSQL_PIDFILE=%s;", $3)
186 } else if ($1 == "socket") {
187 printf("MYSQL_SOCKET=%s;", $3)
193 if is_yes "$MYSQL_RA_COMPAT"; then
194 MYSQL_DATA_DIR_SUB=""
196 MYSQL_DATA_DIR_SUB="/mysqldb"
199 if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then
200 nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
201 nls " MySQL can't be run."
205 if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then
206 nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid"
207 nls " MySQL can't be run."
211 if [ -z $MYSQL_USER ]; then
212 echo "$(nls 'MySQL user not configured properly')"'!' >&2
213 nls "Edit %s and configure it." "$config_file" >&2
221 mysqlgetconfig "$clusterdir"
222 if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
223 nls "MySQL cluster %s not initialized." "$clusterdir"
224 nls "Try \`%s init %s' before start." "$0" "$clusterdir"
228 msg_starting "MySQL $clusterdir"
230 [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
231 rm -f "$MYSQL_PIDFILE"
232 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 &
234 mysqlstatus "$clusterdir" start
235 # it takes longer for mysqld to start and create pidfile if it has to recover innodb transactions
236 if [ "$MYSQL_STATUS" = "starting" ]; then
237 for nr in $(seq 1 $(($MYSQL_START_WAIT_TIME*10))); do
238 [ -f "$MYSQL_PIDFILE" ] && break
243 mysqlstatus "$clusterdir" start
244 if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
246 elif [ "$MYSQL_STATUS" = "died" ]; then
258 mysqlstatus "$clusterdir" stop
259 msg_stopping "MySQL $clusterdir"
262 # try graceful shutdown -- send shutdown command
263 # requires mysql_logrotate user proper privs
264 /usr/bin/mysqladmin --defaults-file=$MYSQL_CONFIG ${MYSQL_SOCKET:+--socket=$MYSQL_SOCKET} shutdown >/dev/null 2>&1
265 mysqlstatus "$clusterdir" stop
267 if [ "$MYSQL_PID" != "unknown" ]; then
268 kill -TERM "$MYSQL_PID" 2> /dev/null
269 for nr in $(seq 1 $(($MYSQL_STOP_WAIT_TIME*10))); do
270 [ -d "/proc/$MYSQL_PID" ] || break
275 mysqlstatus "$clusterdir" stop
276 if [ "$MYSQL_STATUS" = "died" ]; then
278 elif [ "$MYSQL_STATUS" = "running" -o "$MYSQL_STATUS" = "starting" ]; then
286 # check for running mysql instances; if any instance is running then
287 # create subsys lock file
290 # check for every defined db cluster in sysconfig file
291 for mysqldir in $DB_CLUSTERS; do
292 mysqlstatus "$mysqldir"
293 if [ "$MYSQL_STATUS" = "running" ]; then
294 touch /var/lock/subsys/mysql
298 rm -f /var/lock/subsys/mysql
304 if [ -f /etc/mysqld.conf ]; then
305 nls "Running in \`no cluster compat' mode: can't initialize database."
306 nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
310 if [ -f "$clusterdir/mysqld.conf" ]; then
311 mysqlgetconfig "$clusterdir"
314 MYSQL_CLUSTER_DIR="$clusterdir"
315 MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
316 MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
317 MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
319 # this $MYSQL_CONFIG will be created later
320 MYSQL_CONFIG="$MYSQL_CLUSTER_DIR/mysqld.conf"
323 nls "Initializing cluster %s" "$clusterdir"
325 # Check if not exist init database
326 if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
327 nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysql"
328 nls "before initializing database."
329 nls "For now skipping cluster %s." "$clusterdir"
333 show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
337 # Install this in the user table, too
338 hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`"
339 [ -z "$hostname" ] && hostname="localhost-unknown"
341 # Check if hostname is valid
342 if [ -z "$hostname" ]; then
345 nls "Sorry, the host name is not configured."
346 nls "Please configure the 'hostname' command to return a hostname."
348 elif ! hostname -i >/dev/null 2>&1; then
351 nls "Sorry, the host '%s' could not be looked up." "$hostname"
352 nls "Please configure the 'hostname' command to return a correct hostname."
356 # Initialize variables
357 c_d="" i_d="" c_ht="" c_tz=""
358 c_h="" i_h="" c_hc="" c_tzt=""
359 c_u="" i_u="" c_hk="" c_tztt=""
360 c_f="" i_f="" c_hr="" c_tzls=""
361 c_t="" c_c="" c_tzn="" c_p=""
364 # Check for old tables
365 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/db.frm
367 # mysqld --bootstrap wants one command/line
368 c_d="$c_d CREATE TABLE db ("
369 c_d="$c_d Host char(60) DEFAULT '' NOT NULL,"
370 c_d="$c_d Db char(64) DEFAULT '' NOT NULL,"
371 c_d="$c_d User char(16) DEFAULT '' NOT NULL,"
372 c_d="$c_d Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
373 c_d="$c_d Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
374 c_d="$c_d Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
375 c_d="$c_d Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
376 c_d="$c_d Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
377 c_d="$c_d Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
378 c_d="$c_d Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
379 c_d="$c_d References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
380 c_d="$c_d Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
381 c_d="$c_d Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
382 c_d="$c_d Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
383 c_d="$c_d Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
384 c_d="$c_d Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
385 c_d="$c_d Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
386 c_d="$c_d Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
387 c_d="$c_d Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
388 c_d="$c_d Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
389 c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
390 c_d="$c_d KEY User (User)"
391 c_d="$c_d ) engine=${BASE_TABLETYPE} "
392 c_d="$c_d CHARACTER SET utf8 COLLATE utf8_bin"
393 c_d="$c_d comment='Database privileges';"
395 i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N');
396 INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N');"
400 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/host.frm
402 c_h="$c_h CREATE TABLE host ("
403 c_h="$c_h Host char(60) DEFAULT '' NOT NULL,"
404 c_h="$c_h Db char(64) DEFAULT '' NOT NULL,"
405 c_h="$c_h Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
406 c_h="$c_h Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
407 c_h="$c_h Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
408 c_h="$c_h Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
409 c_h="$c_h Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
410 c_h="$c_h Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
411 c_h="$c_h Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
412 c_h="$c_h References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
413 c_h="$c_h Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
414 c_h="$c_h Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
415 c_h="$c_h Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
416 c_h="$c_h Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
417 c_h="$c_h Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
418 c_h="$c_h Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
419 c_h="$c_h Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
420 c_h="$c_h Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
421 c_h="$c_h Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
422 c_h="$c_h PRIMARY KEY Host (Host,Db)"
423 c_h="$c_h ) engine=${BASE_TABLETYPE} "
424 c_h="$c_h CHARACTER SET utf8 COLLATE utf8_bin"
425 c_h="$c_h comment='Host privileges; Merged with database privileges';"
428 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/user.frm
430 c_u="$c_u CREATE TABLE user ("
431 c_u="$c_u Host char(60) binary DEFAULT '' NOT NULL,"
432 c_u="$c_u User char(16) binary DEFAULT '' NOT NULL,"
433 c_u="$c_u Password char(41) character set latin1 collate latin1_bin DEFAULT '' NOT NULL,"
434 c_u="$c_u Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
435 c_u="$c_u Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
436 c_u="$c_u Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
437 c_u="$c_u Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
438 c_u="$c_u Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
439 c_u="$c_u Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
440 c_u="$c_u Reload_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
441 c_u="$c_u Shutdown_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
442 c_u="$c_u Process_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
443 c_u="$c_u File_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
444 c_u="$c_u Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
445 c_u="$c_u References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
446 c_u="$c_u Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
447 c_u="$c_u Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
448 c_u="$c_u Show_db_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
449 c_u="$c_u Super_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
450 c_u="$c_u Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
451 c_u="$c_u Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
452 c_u="$c_u Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
453 c_u="$c_u Repl_slave_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
454 c_u="$c_u Repl_client_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
455 c_u="$c_u Create_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
456 c_u="$c_u Show_view_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
457 c_u="$c_u Create_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
458 c_u="$c_u Alter_routine_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
459 c_u="$c_u Create_user_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,"
460 c_u="$c_u ssl_type enum('','ANY','X509', 'SPECIFIED') COLLATE utf8_general_ci DEFAULT '' NOT NULL,"
461 c_u="$c_u ssl_cipher BLOB NOT NULL,"
462 c_u="$c_u x509_issuer BLOB NOT NULL,"
463 c_u="$c_u x509_subject BLOB NOT NULL,"
464 c_u="$c_u max_questions int(11) unsigned DEFAULT 0 NOT NULL,"
465 c_u="$c_u max_updates int(11) unsigned DEFAULT 0 NOT NULL,"
466 c_u="$c_u max_connections int(11) unsigned DEFAULT 0 NOT NULL,"
467 c_u="$c_u max_user_connections int(11) unsigned DEFAULT 0 NOT NULL,"
468 c_u="$c_u PRIMARY KEY Host (Host,User)"
469 c_u="$c_u ) engine=${BASE_TABLETYPE} "
470 c_u="$c_u CHARACTER SET utf8 COLLATE utf8_bin"
471 c_u="$c_u comment='Users and global privileges';"
474 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);
475 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);
476 INSERT INTO user (host,user) values ('localhost','');
477 INSERT INTO user (host,user) values ('$hostname','');
478 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);"
481 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/func.frm
483 c_f="$c_f CREATE TABLE func ("
484 c_f="$c_f name char(64) DEFAULT '' NOT NULL,"
485 c_f="$c_f ret tinyint(1) DEFAULT '0' NOT NULL,"
486 c_f="$c_f dl char(128) DEFAULT '' NOT NULL,"
487 c_f="$c_f type enum ('function','aggregate') COLLATE utf8_general_ci NOT NULL,"
488 c_f="$c_f PRIMARY KEY (name)"
489 c_f="$c_f ) engine=${BASE_TABLETYPE} "
490 c_f="$c_f CHARACTER SET utf8 COLLATE utf8_bin"
491 c_f="$c_f comment='User defined functions';"
494 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/tables_priv.frm
496 c_t="$c_t CREATE TABLE tables_priv ("
497 c_t="$c_t Host char(60) DEFAULT '' NOT NULL,"
498 c_t="$c_t Db char(64) DEFAULT '' NOT NULL,"
499 c_t="$c_t User char(16) DEFAULT '' NOT NULL,"
500 c_t="$c_t Table_name char(60) DEFAULT '' NOT NULL,"
501 c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL,"
502 c_t="$c_t Timestamp timestamp(14),"
503 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,"
504 c_t="$c_t Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL,"
505 c_t="$c_t PRIMARY KEY (Host,Db,User,Table_name),"
506 c_t="$c_t KEY Grantor (Grantor)"
507 c_t="$c_t ) engine=${BASE_TABLETYPE} "
508 c_t="$c_t CHARACTER SET utf8 COLLATE utf8_bin"
509 c_t="$c_t comment='Table privileges';"
512 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/columns_priv.frm
514 c_c="$c_c CREATE TABLE columns_priv ("
515 c_c="$c_c Host char(60) DEFAULT '' NOT NULL,"
516 c_c="$c_c Db char(64) DEFAULT '' NOT NULL,"
517 c_c="$c_c User char(16) DEFAULT '' NOT NULL,"
518 c_c="$c_c Table_name char(64) DEFAULT '' NOT NULL,"
519 c_c="$c_c Column_name char(64) DEFAULT '' NOT NULL,"
520 c_c="$c_c Timestamp timestamp(14),"
521 c_c="$c_c Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL,"
522 c_c="$c_c PRIMARY KEY (Host,Db,User,Table_name,Column_name)"
523 c_c="$c_c ) engine=${BASE_TABLETYPE} "
524 c_c="$c_c CHARACTER SET utf8 COLLATE utf8_bin"
525 c_c="$c_c comment='Column privileges';"
528 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/procs_priv.frm
530 c_pp="$c_pp CREATE TABLE procs_priv ("
531 c_pp="$c_pp Host char(60) binary DEFAULT '' NOT NULL,"
532 c_pp="$c_pp Db char(64) binary DEFAULT '' NOT NULL,"
533 c_pp="$c_pp User char(16) binary DEFAULT '' NOT NULL,"
534 c_pp="$c_pp Routine_name char(64) binary DEFAULT '' NOT NULL,"
535 c_pp="$c_pp Routine_type enum('FUNCTION','PROCEDURE') NOT NULL,"
536 c_pp="$c_pp Grantor char(77) DEFAULT '' NOT NULL,"
537 c_pp="$c_pp Proc_priv set('Execute','Alter Routine','Grant') COLLATE utf8_general_ci DEFAULT '' NOT NULL,"
538 c_pp="$c_pp Timestamp timestamp(14),"
539 c_pp="$c_pp PRIMARY KEY (Host,Db,User,Routine_name,Routine_type),"
540 c_pp="$c_pp KEY Grantor (Grantor)"
541 c_pp="$c_pp ) engine=${BASE_TABLETYPE} "
542 c_pp="$c_pp CHARACTER SET utf8 COLLATE utf8_bin"
543 c_pp="$c_pp comment='Procedure privileges';"
547 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_topic.frm
549 c_ht="$c_ht CREATE TABLE help_topic ("
550 c_ht="$c_ht help_topic_id int unsigned not null,"
551 c_ht="$c_ht name varchar(64) not null,"
552 c_ht="$c_ht help_category_id smallint unsigned not null,"
553 c_ht="$c_ht description text not null,"
554 c_ht="$c_ht example text not null,"
555 c_ht="$c_ht url varchar(128) not null,"
556 c_ht="$c_ht primary key (help_topic_id),"
557 c_ht="$c_ht unique index (name)"
558 c_ht="$c_ht ) engine=${BASE_TABLETYPE} "
559 c_ht="$c_ht CHARACTER SET utf8"
560 c_ht="$c_ht comment='help topics';"
563 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_category.frm
565 c_hc="$c_hc CREATE TABLE help_category ("
566 c_hc="$c_hc help_category_id smallint unsigned not null,"
567 c_hc="$c_hc name varchar(64) not null,"
568 c_hc="$c_hc parent_category_id smallint unsigned null,"
569 c_hc="$c_hc url varchar(128) not null,"
570 c_hc="$c_hc primary key (help_category_id),"
571 c_hc="$c_hc unique index (name)"
572 c_hc="$c_hc ) engine=${BASE_TABLETYPE} "
573 c_hc="$c_hc CHARACTER SET utf8"
574 c_hc="$c_hc comment='help categories';"
577 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_keyword.frm
579 c_hk="$c_hk CREATE TABLE help_keyword ("
580 c_hk="$c_hk help_keyword_id int unsigned not null,"
581 c_hk="$c_hk name varchar(64) not null,"
582 c_hk="$c_hk primary key (help_keyword_id),"
583 c_hk="$c_hk unique index (name)"
584 c_hk="$c_hk ) engine=${BASE_TABLETYPE} "
585 c_hk="$c_hk CHARACTER SET utf8"
586 c_hk="$c_hk comment='help keywords';"
589 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_relation.frm
591 c_hr="$c_hr CREATE TABLE help_relation ("
592 c_hr="$c_hr help_topic_id int unsigned not null references help_topic,"
593 c_hr="$c_hr help_keyword_id int unsigned not null references help_keyword,"
594 c_hr="$c_hr primary key (help_keyword_id, help_topic_id)"
595 c_hr="$c_hr ) engine=${BASE_TABLETYPE} "
596 c_hr="$c_hr CHARACTER SET utf8"
597 c_hr="$c_hr comment='keyword-topic relation';"
600 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_name.frm
602 c_tzn="$c_tzn CREATE TABLE time_zone_name ("
603 c_tzn="$c_tzn Name char(64) NOT NULL,"
604 c_tzn="$c_tzn Time_zone_id int unsigned NOT NULL,"
605 c_tzn="$c_tzn PRIMARY KEY Name (Name)"
606 c_tzn="$c_tzn ) engine=${BASE_TABLETYPE} "
607 c_tzn="$c_tzn CHARACTER SET utf8"
608 c_tzn="$c_tzn comment='Time zone names';"
611 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone.frm
613 c_tz="$c_tz CREATE TABLE time_zone ("
614 c_tz="$c_tz Time_zone_id int unsigned NOT NULL auto_increment,"
615 c_tz="$c_tz Use_leap_seconds enum('Y','N') DEFAULT 'N' NOT NULL,"
616 c_tz="$c_tz PRIMARY KEY TzId (Time_zone_id)"
617 c_tz="$c_tz ) engine=${BASE_TABLETYPE} "
618 c_tz="$c_tz CHARACTER SET utf8"
619 c_tz="$c_tz comment='Time zones';"
622 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_transition.frm
624 c_tzt="$c_tzt CREATE TABLE time_zone_transition ("
625 c_tzt="$c_tzt Time_zone_id int unsigned NOT NULL,"
626 c_tzt="$c_tzt Transition_time bigint signed NOT NULL,"
627 c_tzt="$c_tzt Transition_type_id int unsigned NOT NULL,"
628 c_tzt="$c_tzt PRIMARY KEY TzIdTranTime (Time_zone_id, Transition_time)"
629 c_tzt="$c_tzt ) engine=${BASE_TABLETYPE} "
630 c_tzt="$c_tzt CHARACTER SET utf8"
631 c_tzt="$c_tzt comment='Time zone transitions';"
634 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_transition_type.frm
636 c_tztt="$c_tztt CREATE TABLE time_zone_transition_type ("
637 c_tztt="$c_tztt Time_zone_id int unsigned NOT NULL,"
638 c_tztt="$c_tztt Transition_type_id int unsigned NOT NULL,"
639 c_tztt="$c_tztt Offset int signed DEFAULT 0 NOT NULL,"
640 c_tztt="$c_tztt Is_DST tinyint unsigned DEFAULT 0 NOT NULL,"
641 c_tztt="$c_tztt Abbreviation char(8) DEFAULT '' NOT NULL,"
642 c_tztt="$c_tztt PRIMARY KEY TzIdTrTId (Time_zone_id, Transition_type_id)"
643 c_tztt="$c_tztt ) engine=${BASE_TABLETYPE} "
644 c_tztt="$c_tztt CHARACTER SET utf8"
645 c_tztt="$c_tztt comment='Time zone transition types';"
648 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_leap_second.frm
650 c_tzls="$c_tzls CREATE TABLE time_zone_leap_second ("
651 c_tzls="$c_tzls Transition_time bigint signed NOT NULL,"
652 c_tzls="$c_tzls Correction int signed NOT NULL,"
653 c_tzls="$c_tzls PRIMARY KEY TranTime (Transition_time)"
654 c_tzls="$c_tzls ) engine=${BASE_TABLETYPE} "
655 c_tzls="$c_tzls CHARACTER SET utf8"
656 c_tzls="$c_tzls comment='Leap seconds information for time zones';"
659 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/proc.frm
661 c_p="$c_p CREATE TABLE proc ("
662 c_p="$c_p db char(64) collate utf8_bin DEFAULT '' NOT NULL,"
663 c_p="$c_p name char(64) DEFAULT '' NOT NULL,"
664 c_p="$c_p type enum('FUNCTION','PROCEDURE') NOT NULL,"
665 c_p="$c_p specific_name char(64) DEFAULT '' NOT NULL,"
666 c_p="$c_p language enum('SQL') DEFAULT 'SQL' NOT NULL,"
667 c_p="$c_p sql_data_access enum('CONTAINS_SQL',"
669 c_p="$c_p 'READS_SQL_DATA',"
670 c_p="$c_p 'MODIFIES_SQL_DATA'"
671 c_p="$c_p ) DEFAULT 'CONTAINS_SQL' NOT NULL,"
672 c_p="$c_p is_deterministic enum('YES','NO') DEFAULT 'NO' NOT NULL,"
673 c_p="$c_p security_type enum('INVOKER','DEFINER') DEFAULT 'DEFINER' NOT NULL,"
674 c_p="$c_p param_list blob DEFAULT '' NOT NULL,"
675 c_p="$c_p returns char(64) DEFAULT '' NOT NULL,"
676 c_p="$c_p body longblob DEFAULT '' NOT NULL,"
677 c_p="$c_p definer char(77) collate utf8_bin DEFAULT '' NOT NULL,"
678 c_p="$c_p created timestamp,"
679 c_p="$c_p modified timestamp,"
680 c_p="$c_p sql_mode set("
681 c_p="$c_p 'REAL_AS_FLOAT',"
682 c_p="$c_p 'PIPES_AS_CONCAT',"
683 c_p="$c_p 'ANSI_QUOTES',"
684 c_p="$c_p 'IGNORE_SPACE',"
685 c_p="$c_p 'NOT_USED',"
686 c_p="$c_p 'ONLY_FULL_GROUP_BY',"
687 c_p="$c_p 'NO_UNSIGNED_SUBTRACTION',"
688 c_p="$c_p 'NO_DIR_IN_CREATE',"
689 c_p="$c_p 'POSTGRESQL',"
694 c_p="$c_p 'NO_KEY_OPTIONS',"
695 c_p="$c_p 'NO_TABLE_OPTIONS',"
696 c_p="$c_p 'NO_FIELD_OPTIONS',"
697 c_p="$c_p 'MYSQL323',"
698 c_p="$c_p 'MYSQL40',"
700 c_p="$c_p 'NO_AUTO_VALUE_ON_ZERO',"
701 c_p="$c_p 'NO_BACKSLASH_ESCAPES',"
702 c_p="$c_p 'STRICT_TRANS_TABLES',"
703 c_p="$c_p 'STRICT_ALL_TABLES',"
704 c_p="$c_p 'NO_ZERO_IN_DATE',"
705 c_p="$c_p 'NO_ZERO_DATE',"
706 c_p="$c_p 'INVALID_DATES',"
707 c_p="$c_p 'ERROR_FOR_DIVISION_BY_ZERO',"
708 c_p="$c_p 'TRADITIONAL',"
709 c_p="$c_p 'NO_AUTO_CREATE_USER',"
710 c_p="$c_p 'HIGH_NOT_PRECEDENCE'"
711 c_p="$c_p ) DEFAULT '' NOT NULL,"
712 c_p="$c_p comment char(64) collate utf8_bin DEFAULT '' NOT NULL,"
713 c_p="$c_p PRIMARY KEY (db,name,type)"
714 c_p="$c_p ) engine=${BASE_TABLETYPE} "
715 c_p="$c_p character set utf8"
716 c_p="$c_p comment='Stored Procedures';"
719 mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1
720 # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
721 chown root:root "$MYSQL_CLUSTER_DIR"
722 chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
723 chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
725 if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
727 s#\(datadir.*\)=.*#\1= $MYSQL_DATA_DIR#g;
728 s#\(pid-file.*\)=.*#\1= $MYSQL_PIDFILE#g;
729 s#\(socket.*\)=.*#\1= $MYSQL_SOCKET#g;
730 s#@clusterdir@#$MYSQL_CLUSTER_DIR#g;
731 " /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
732 chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
733 chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
736 if [ ! -e /var/lib/mysql/mysql.sock ] || [ -L /var/lib/mysql/mysql.sock ] && [ -z "$(readlink /var/lib/mysql/mysql.sock)" ]; then
737 sock=${MYSQL_SOCKET#/var/lib/mysql/} # make it relative if possible
738 ln -s "$sock" /var/lib/mysql/mysql.sock
741 if /usr/sbin/mysqld --bootstrap --skip-grant-tables \
742 --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER << END_OF_DATA
743 CREATE DATABASE mysql;
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:
781 /usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
782 /usr/bin/mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password'
783 /usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
785 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
786 mysqladmin section. See the manual for more instructions.
788 If you want to use new help tables in MySQL 4.1.x then you'll need to import the help data:
789 /usr/bin/mysql -u mysql -p -S $MYSQL_SOCKET mysql < /usr/share/mysql/fill_help_tables.sql
795 Installation of grant tables FAILED!
797 Examine the logs in $MYSQL_DATA_DIR for more information. You can
798 also try to start the mysqld demon with:
800 /usr/sbin/mysqld --skip-grant &
802 You can use the command line tool /usr/bin/mysql to connect to the mysql
803 database and look at the grant tables:
805 shell> /usr/bin/mysql -u mysql mysql
808 Try 'mysqld --help' if you have problems with paths. Setting on
809 logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
810 may be helpful. The latest information about MySQL is available on the
811 web at http://www.mysql.com/.
813 Please check PLD Linux ftp site for newer versions of this package.
815 Please consult the MySQL manual section: 'Problems running
816 mysql_install_db', and the manual section that describes problems on
817 your OS. Another information source is the MySQL email archive.
818 Please check all of the above before mailing us! And if you do mail
819 us, you MUST use the /usr/bin/mysqlbug script!
828 # End of useful functions.
832 if [ ! -f $MYSQL_ERRLOG ]; then
835 chown mysql:mysql $MYSQL_ERRLOG
836 chmod 640 $MYSQL_ERRLOG
838 for mysqldir in $DB_CLUSTERS; do
839 mysqlstatus "$mysqldir" start
840 if [ "$MYSQL_STATUS" = "running" ]; then
841 msg_already_running "MySQL $mysqldir"
843 mysqlstart "$mysqldir"
850 for mysqldir in $DB_CLUSTERS; do
851 mysqlstatus "$mysqldir" stop
852 if [ "$MYSQL_STATUS" = "not running" ]; then
853 msg_not_running "MySQL $mysqldir"
855 mysqlstop "$mysqldir"
870 for mysqldir in $DB_CLUSTERS; do
871 mysqlstatus "$mysqldir"
872 if [ "$MYSQL_STATUS" = "running" ]; then
873 show "MySQL cluster %s, PID %s" "$mysqldir" "$MYSQL_PID"
874 progress "$MYSQL_STATUS"
876 show "MySQL cluster %s" "$mysqldir"
877 progress "$MYSQL_STATUS" "$CFAIL"
883 restart|force-reload)
888 for mysqldir in $DB_CLUSTERS; do
889 mysqlinit "$mysqldir"
894 for mysqldir in $DB_CLUSTERS; do
895 mysqlgetconfig "$mysqldir"
896 # just if mysqld is really running
897 if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
898 /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
903 msg_usage "$0 {start|stop|init|restart|force-reload|status}"
909 # vi: shiftwidth=4 tabstop=4