]> git.pld-linux.org Git - packages/mysql.git/blobdiff - mysql.init
- merge initscript improvements from HEAD
[packages/mysql.git] / mysql.init
index 418c6e50a7e16ee834174516b68904da001ed027..9d3354cf20eb5ce5bbe7acf19fca1de581ba157b 100644 (file)
@@ -1,12 +1,11 @@
 #!/bin/sh
 #
-# mysql                A very fast and reliable SQL database engine
+# mysql         A very fast and reliable SQL database engine
 #
-# chkconfig:   2345 84 25
+# chkconfig:    2345 84 25
 #
-# description: A very fast and reliable SQL database engine.
+# description:  A very fast and reliable SQL database engine.
 #
-
 # Source function library
 . /etc/rc.d/init.d/functions
 
 
 # Get service config
 if [ -f /etc/sysconfig/mysql ]; then
-        . /etc/sysconfig/mysql
+       . /etc/sysconfig/mysql
 else
-        nls "Error: %s not found" /etc/sysconfig/mysql
-        nls " MySQL can't be run."
-        exit 1
+       nls "Error: %s not found" /etc/sysconfig/mysql
+       nls "%s can't be run." MySQL
+       exit 1
+fi
+
+if [ -n "$MYSQL_DB_CLUSTERS" ]; then
+       nls "Warning: MYSQL_DB_CLUSTERS is set. It's obsolete. Use %s instead." /etc/mysql/clusters.conf
 fi
 
-if [ -z "$MYSQL_DB_CLUSTERS" ]; then
-        nls "Warning: MYSQL_DB_CLUSTERS not found or is empty"
-       nls "defaulting to /var/lib/mysql (compatiblity mode)"
-       MYSQL_DB_CLUSTERS="/var/lib/mysql"
+if [ -f /etc/mysql/clusters.conf ]; then
+       MYSQL_DB_CLUSTERS=$(awk -F= '!/^#/{print $2}' /etc/mysql/clusters.conf)
+       if [ -z "$MYSQL_DB_CLUSTERS"  ]; then
+               nls "Warning: there are no configured clusters."
+       fi
+
+else
+       nls "Warning: Missing clusters config file %s" /etc/mysql/clusters.conf
+       if [ -z "$MYSQL_DB_CLUSTERS"  ]; then
+               nls "Warning: there are no configured clusters."
+               nls "Using default cluster /var/lib/mysql (compatibility mode)"
+               MYSQL_DB_CLUSTERS=/var/lib/mysql
+       fi
 fi
 
+
 # Check that networking is up
 if is_yes "${NETWORKING}"; then
        if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
@@ -42,14 +55,31 @@ action="$1"
 
 # any db cluster as command line argument?
 if [ $# -gt 1 ]; then
-        shift
-        # perform action for specified clusters only
-        DB_CLUSTERS="$@"
+       shift
+       # perform action for specified clusters only
+       for a in "$@"; do
+               # try auto resolving from /etc/mysql/clusters.conf
+               if [[ "$a" != /* ]]; then
+                       m=$(awk -va="$a" -F= 'substr($0, 1, length(a)) == a {print $1}' /etc/mysql/clusters.conf)
+                       if [ -z "$m" ]; then
+                               echo >&2 "Cluster name '$a' did not match anything!"
+                               exit 1
+                       fi
+                       if [ $(echo "$m" | wc -l) -gt 1 ]; then
+                               echo >&2 "Cluster name '$a' ambiguous:" $m
+                               exit 1
+                       fi
+                       a=$(awk -va="$a" -F= 'substr($0, 1, length(a)) == a {print $2}' /etc/mysql/clusters.conf)
+               fi
+               DB_CLUSTERS="$DB_CLUSTERS $a"
+       done
 else
-        DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
+       DB_CLUSTERS="$MYSQL_DB_CLUSTERS"
 fi
 
 MYSQL_ERRLOG=/var/log/mysql/err
+MYSQL_START_WAIT_TIME=${MYSQL_START_WAIT_TIME:-15}
+MYSQL_STOP_WAIT_TIME=${MYSQL_STOP_WAIT_TIME:-900}
 
 #
 # Useful functions.
@@ -60,24 +90,59 @@ MYSQL_ERRLOG=/var/log/mysql/err
 #
 # arguments:
 # $1 - db cluster
+# $2 - start|stop
 #
 # sets variables:
-# MYSQL_STATUS = running | not running
+# MYSQL_STATUS = starting | running | not running | died
 # MYSQL_PID    = pid of mysqld process
 #
 mysqlstatus() {
        clusterdir="$1"
+       mode="$2"
+       
        mysqlgetconfig "$clusterdir"
-        MYSQL_STATUS="not running"
-        MYSQL_PID="unknown"
 
-       [ -f "$MYSQL_PIDFILE" ] && MYSQL_PID=$(cat "$MYSQL_PIDFILE")
+       MYSQL_STATUS="not running"
+       MYSQL_PID="unknown"
+       MYSQL_PIDFILE_PID=""
+       MYSQL_GREP_PID=""
+
+       if [ -f "$MYSQL_PIDFILE" ]; then
+               MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
+       fi
+       
+       if [ -n "$MYSQL_PIDFILE_PID" ]; then
+               MYSQL_PID=$MYSQL_PIDFILE_PID
+               if [ ! -d "/proc/$MYSQL_PID" ]; then
+                       MYSQL_STATUS="died"
+                       return
+               elif (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null); then
+                       MYSQL_STATUS="running"
+                       return
+               fi
+       fi
 
-       if [ ! -d "/proc/$MYSQL_PID" -a "$MYSQL_PID" != "unknown" ]; then
-           MYSQL_STATUS="died"
-       elif [ -d "/proc/$MYSQL_PID" ]; then
-           grep -q "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline && MYSQL_STATUS="running" || MYSQL_STATUS="not running"
+       if [ "$mode" = "start" ]; then
+               MYSQL_GREP_PID=$(grep -lE "^/usr/sbin/mysqld.*${MYSQL_PIDFILE}" /proc/[0-9]*/cmdline 2> /dev/null | awk -F "/" '{ print $3; exit; }')
+               if [ -n "$MYSQL_GREP_PID" ]; then
+                       MYSQL_PID=$MYSQL_GREP_PID
+                       if (grep -qa "$MYSQL_PIDFILE" /proc/$MYSQL_PID/cmdline 2> /dev/null); then
+                               if [ -f "$MYSQL_PIDFILE" ]; then
+                                       MYSQL_PIDFILE_PID=$(cat "$MYSQL_PIDFILE")
+                               fi
+                               if [ -n "$MYSQL_PIDFILE_PID" ]; then
+                                       MYSQL_PID=$MYSQL_PIDFILE_PID
+                                       MYSQL_STATUS="running"
+                                       return
+                               else
+                                       MYSQL_STATUS="starting"
+                                       return
+                               fi
+                       fi
+               fi
        fi
+
+       # else default, "not running"
 }
 
 # get mysql configuration in variables
@@ -88,57 +153,68 @@ mysqlstatus() {
 
 mysqlgetconfig() {
        clusterdir="$1"
-       config_file="$clusterdir/mysqld.conf"
 
        # emulate old behaviour if only one cluster specified
        if [ "$clusterdir" = "$MYSQL_DB_CLUSTERS" -a "$clusterdir" = "/var/lib/mysql" -a -f /etc/mysqld.conf ]; then
-               MYSQL_NO_CLUSTER_COMPAT=yes; export MYSQL_NO_CLUSTER_COMPAT
+               MYSQL_RA_COMPAT=yes
                config_file=/etc/mysqld.conf
+       else
+               config=$(awk -F= -vclusterdir="$clusterdir" '!/^#/{ if (clusterdir == $2) print $1}' /etc/mysql/clusters.conf)
+               if [[ $config = /* ]]; then
+                       config_file="$config"
+               elif [ -f "/etc/mysql/$config" ]; then
+                       config_file="/etc/mysql/$config"
+               else
+                       config_file="$clusterdir/mysqld.conf"
+               fi
        fi
 
-       MYSQL_CLUSTER_DIR="$clusterdir"; export MYSQL_CLUSTER_DIR
-        MYSQL_CONFIG="$config_file"; export MYSQL_CONFIG
+       MYSQL_CLUSTER_DIR="$clusterdir"
+
+       if [ -z "$config_file" ]; then
+               nls "Error: Can't find config file for %s cluster" "$clusterdir"
+               exit 6
+       else
+               MYSQL_CONFIG="$config_file"
+       fi
 
        if [ ! -f "$config_file" ]; then
                nls "Error: config file %s not found" "$config_file"
-               nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
-               exit 6
+               nls "MySQL can't be run. Did you initialize DB by doing \`$0 init'?"
+               exit 6
        fi
 
        eval `awk '
 /^[ \t]*\[.*\][ \t]*$/ {
        match($0,/\[.*\]/)
-       section=substr($0,RSTART+1,RSTART+RLENGTH-3)
+       section=substr($0, RSTART + 1, RSTART + RLENGTH - 3)
 }
-section=="mysqld" && $2~"=" {
-       if ($1=="datadir") {
+section == "mysqld" && $2 ~ "=" {
+       if ($1 == "datadir") {
                printf("MYSQL_DATA_DIR=%s;", $3)
-       } else if ($1=="user") {
+       } else if ($1 == "user") {
                printf("MYSQL_USER=%s;", $3)
-       } else if ($1=="pid-file") {
+       } else if ($1 == "pid-file") {
                printf("MYSQL_PIDFILE=%s;", $3)
-       } else if ($1=="socket") {
+       } else if ($1 == "socket") {
                printf("MYSQL_SOCKET=%s;", $3)
        }
 }
-END {
-       print "export MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE MYSQL_SOCKET"
-}
 ' $config_file`
 
 
-       if is_yes "$MYSQL_NO_CLUSTER_COMPAT"; then
-               MYSQL_DATA_DIR_SUB=""
+       if is_yes "$MYSQL_RA_COMPAT"; then
+               MYSQL_DATA_DIR_SUB=""
        else
-               MYSQL_DATA_DIR_SUB="/mysqldb"
+               MYSQL_DATA_DIR_SUB="/mysqldb"
        fi
-               
+
        if [ -z "$MYSQL_DATA_DIR" -o "$MYSQL_DATA_DIR" != "${clusterdir}${MYSQL_DATA_DIR_SUB}/db" ]; then
-               nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
-               nls " MySQL can't be run."
-               exit 6
+               nls "Error: datadir specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/db"
+               nls " MySQL can't be run."
+               exit 6
        fi
-       
+
        if [ -z "$MYSQL_PIDFILE" -o "$MYSQL_PIDFILE" != "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid" ]; then
                nls "Error: pid-file specified in %s should be %s" "$config_file" "$clusterdir${MYSQL_DATA_DIR_SUB}/mysql.pid"
                nls " MySQL can't be run."
@@ -146,9 +222,9 @@ END {
        fi
 
        if [ -z $MYSQL_USER ]; then
-               echo "$(nls 'MySQL user not configured properly')"'!' >&2
-               nls "Edit %s and configure it." "$config_file" >&2
-               exit 6
+               echo "$(nls 'MySQL user not configured properly')"'!' >&2
+               nls "Edit %s and configure it." "$config_file" >&2
+               exit 6
        fi
 }
 
@@ -159,19 +235,29 @@ mysqlstart() {
        if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then
                nls "MySQL cluster %s not initialized." "$clusterdir"
                nls "Try \`%s init %s' before start." "$0" "$clusterdir"
-                exit 6
-        fi
+               exit 6
+       fi
 
        msg_starting "MySQL $clusterdir"
        busy
        [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0
-       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 &
-       sleep 2
-       mysqlstatus "$clusterdir"
+       rm -f "$MYSQL_PIDFILE"
+       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 &
+       sleep 0.2
+       mysqlstatus "$clusterdir" start
+       # it takes longer for mysqld to start and create pidfile if it has to recover innodb transactions
+       if [ "$MYSQL_STATUS" = "starting" ]; then
+               for nr in $(seq 1 $(($MYSQL_START_WAIT_TIME*10))); do
+                       [ -f "$MYSQL_PIDFILE" ] && break
+                       sleep 0.1
+               done
+       fi
+
+       mysqlstatus "$clusterdir" start
        if [ "$MYSQL_STATUS" = "running" -a "$MYSQL_PID" != "unknown" ]; then
                ok
        elif [ "$MYSQL_STATUS" = "died" ]; then
-               RETVAL=1
+               RETVAL=1
                died
        else
                RETVAL=1
@@ -182,23 +268,31 @@ mysqlstart() {
 # stop mysql
 mysqlstop() {
        clusterdir="$1"
-       mysqlstatus "$clusterdir"
+       mysqlstatus "$clusterdir" stop
        msg_stopping "MySQL $clusterdir"
        busy
-       [ "$MYSQL_PID" != "unknown" ] && kill -TERM "$MYSQL_PID" 2> /dev/null
-       # 3 seconds
-       for nr in 1 2 3; do
-               [ -d "/proc/$MYSQL_PID" ] && sleep 1
-       done
-       mysqlstatus "$clusterdir"
+
+       # try graceful shutdown -- send shutdown command
+       # requires mysql_logrotate user proper privs
+       /usr/bin/mysqladmin --defaults-file=$MYSQL_CONFIG ${MYSQL_SOCKET:+--socket=$MYSQL_SOCKET} shutdown >/dev/null 2>&1
+       mysqlstatus "$clusterdir" stop
+
+       if [ "$MYSQL_PID" != "unknown" ]; then
+               kill -TERM "$MYSQL_PID" 2> /dev/null
+               for nr in $(seq 1 $(($MYSQL_STOP_WAIT_TIME*10))); do
+                       [ -d "/proc/$MYSQL_PID" ] || break
+                       sleep 0.1
+               done
+       fi
+       
+       mysqlstatus "$clusterdir" stop
        if [ "$MYSQL_STATUS" = "died" ]; then
-               died
-       elif [ "$MYSQL_STATUS" = "running" ]; then
+               died
+       elif [ "$MYSQL_STATUS" = "running" -o "$MYSQL_STATUS" = "starting" ]; then
                fail
        else
                ok
        fi
-       rm -f "$MYSQL_PIDFILE"
 }
 
 #
@@ -206,41 +300,44 @@ mysqlstop() {
 # create subsys lock file
 #
 mysqlsubsys() {
-        # check for every defined db cluster in sysconfig file
-        for mysqldir in $DB_CLUSTERS; do
-                mysqlstatus "$mysqldir"
-                if [ "$MYSQL_STATUS" = "running" ]; then
-                        touch /var/lock/subsys/mysql
-                        return
-                fi
-        done
-        rm -f /var/lock/subsys/mysql
+       # check for every defined db cluster in sysconfig file
+       for mysqldir in $DB_CLUSTERS; do
+               mysqlstatus "$mysqldir"
+               if [ "$MYSQL_STATUS" = "running" ]; then
+                       touch /var/lock/subsys/mysql
+                       return
+               fi
+       done
+       rm -f /var/lock/subsys/mysql
 }
 
 mysqlinit() {
        clusterdir="$1"
 
        if [ -f /etc/mysqld.conf ]; then
-           nls "Running in \`no cluster compat' mode: can't initialize database."
-           nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
-           exit 1
+               nls "Running in \`no cluster compat' mode: can't initialize database."
+               nls "Move /etc/mysqld.conf away and rerun \`$0 init' (new config will be in $clusterdir)."
+               exit 1
        fi
 
        if [ -f "$clusterdir/mysqld.conf" ]; then
-           mysqlgetconfig "$clusterdir"
+               mysqlgetconfig "$clusterdir"
        else
-           MYSQL_USER="mysql"
-           MYSQL_CLUSTER_DIR="$clusterdir"
-           MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
-           MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
-           MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
+               MYSQL_USER="mysql"
+               MYSQL_CLUSTER_DIR="$clusterdir"
+               MYSQL_DATA_DIR="$clusterdir/mysqldb/db"
+               MYSQL_PIDFILE="$clusterdir/mysqldb/mysql.pid"
+               MYSQL_SOCKET="$clusterdir/mysqldb/mysql.sock"
+
+               # this $MYSQL_CONFIG will be created later
+               MYSQL_CONFIG="$MYSQL_CLUSTER_DIR/mysqld.conf"
        fi
 
        nls "Initializing cluster %s" "$clusterdir"
 
        # Check if not exist init database
        if [ -d "$MYSQL_DATA_DIR/mysql" ]; then
-               nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysqldb/mysql"
+               nls "Seems that database is initialized now. Remove by hand %s" "$MYSQL_DATA_DIR/mysql"
                nls "before initializing database."
                nls "For now skipping cluster %s." "$clusterdir"
                return
@@ -248,13 +345,12 @@ mysqlinit() {
 
        show "Creating privilege mysql tables for $MYSQL_DATA_DIR"
        busy
-       TMP=/tmp TMPDIR=/tmp 
+       TMP=/tmp TMPDIR=/tmp
 
-               
        # Install this in the user table, too
        hostname="`hostname --fqdn 2> /dev/null | tr -d '[:space:]'`"
        [ -z "$hostname" ] && hostname="localhost-unknown"
-               
+
        # Check if hostname is valid
        if [ -z "$hostname" ]; then
                deltext
@@ -262,7 +358,7 @@ mysqlinit() {
                nls "Sorry, the host name is not configured."
                nls "Please configure the 'hostname' command to return a hostname."
                exit 1
-       elif ! hostname -i >/dev/null 2>&1; then 
+       elif ! hostname -i >/dev/null 2>&1; then
                deltext
                fail
                nls "Sorry, the host '%s' could not be looked up." "$hostname"
@@ -271,11 +367,11 @@ mysqlinit() {
        fi
 
        # Initialize variables
-       c_d="" i_d=""
-       c_h="" i_h=""
-       c_u="" i_u=""
-       c_f="" i_f=""
-       c_t="" c_c=""
+       c_d="" i_d="" c_ht=""  c_tz=""
+       c_h="" i_h="" c_hc=""  c_tzt=""
+       c_u="" i_u="" c_hk=""  c_tztt=""
+       c_f="" i_f="" c_hr=""  c_tzls=""
+       c_t="" c_c="" c_tzn=""
 
        # Check for old tables
        if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/db.frm
@@ -300,11 +396,12 @@ mysqlinit() {
          c_d="$c_d PRIMARY KEY Host (Host,Db,User),"
          c_d="$c_d KEY User (User)"
          c_d="$c_d )"
+         c_d="$c_d CHARACTER SET utf8 COLLATE utf8_bin"
          c_d="$c_d comment='Database privileges';"
 
          i_d="INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
          INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');"
-           
+
        fi
 
        if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/host.frm
@@ -326,6 +423,7 @@ mysqlinit() {
          c_h="$c_h  Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
          c_h="$c_h  PRIMARY KEY Host (Host,Db)"
          c_h="$c_h )"
+         c_h="$c_h CHARACTER SET utf8 COLLATE utf8_bin"
          c_h="$c_h comment='Host privileges;  Merged with database privileges';"
        fi
 
@@ -334,7 +432,7 @@ mysqlinit() {
          c_u="$c_u CREATE TABLE user ("
          c_u="$c_u   Host char(60) DEFAULT '' NOT NULL,"
          c_u="$c_u   User char(16) DEFAULT '' NOT NULL,"
-         c_u="$c_u   Password char(16) DEFAULT '' NOT NULL,"
+         c_u="$c_u   Password char(41) DEFAULT '' NOT NULL,"
          c_u="$c_u   Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
          c_u="$c_u   Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
          c_u="$c_u   Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
@@ -365,6 +463,7 @@ mysqlinit() {
          c_u="$c_u   max_connections int(11) unsigned DEFAULT 0  NOT NULL,"
          c_u="$c_u   PRIMARY KEY Host (Host,User)"
          c_u="$c_u )"
+         c_u="$c_u CHARACTER SET utf8 COLLATE utf8_bin"
          c_u="$c_u comment='Users and global privileges';"
 
          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);
@@ -385,7 +484,8 @@ mysqlinit() {
          c_f="$c_f   type enum ('function','aggregate') NOT NULL,"
          c_f="$c_f   PRIMARY KEY (name)"
          c_f="$c_f )"
-         c_f="$c_f   comment='User defined functions';"
+         c_f="$c_f CHARACTER SET utf8 COLLATE utf8_bin"
+         c_f="$c_f comment='User defined functions';"
        fi
 
        if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/tables_priv.frm
@@ -402,40 +502,158 @@ mysqlinit() {
          c_t="$c_t   PRIMARY KEY (Host,Db,User,Table_name),"
          c_t="$c_t   KEY Grantor (Grantor)"
          c_t="$c_t )"
-         c_t="$c_t   comment='Table privileges';"
+         c_t="$c_t CHARACTER SET utf8 COLLATE utf8_bin"
+         c_t="$c_t comment='Table privileges';"
        fi
 
        if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/columns_priv.frm
        then
          c_c="$c_c CREATE TABLE columns_priv ("
          c_c="$c_c   Host char(60) DEFAULT '' NOT NULL,"
-         c_c="$c_c   Db char(60) DEFAULT '' NOT NULL,"
+         c_c="$c_c   Db char(64) DEFAULT '' NOT NULL,"
          c_c="$c_c   User char(16) DEFAULT '' NOT NULL,"
-         c_c="$c_c   Table_name char(60) DEFAULT '' NOT NULL,"
-         c_c="$c_c   Column_name char(60) DEFAULT '' NOT NULL,"
+         c_c="$c_c   Table_name char(64) DEFAULT '' NOT NULL,"
+         c_c="$c_c   Column_name char(64) DEFAULT '' NOT NULL,"
          c_c="$c_c   Timestamp timestamp(14),"
          c_c="$c_c   Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,"
          c_c="$c_c   PRIMARY KEY (Host,Db,User,Table_name,Column_name)"
          c_c="$c_c )"
-         c_c="$c_c   comment='Column privileges';"
+         c_c="$c_c CHARACTER SET utf8 COLLATE utf8_bin"
+         c_c="$c_c comment='Column privileges';"
        fi
 
-       mkdir -p "$MYSQL_DATA_DIR" > /dev/null 2>&1
+       if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_topic.frm
+       then
+         c_ht="$c_ht CREATE TABLE help_topic ("
+         c_ht="$c_ht   help_topic_id    int unsigned not null,"
+         c_ht="$c_ht   name             varchar(64) not null,"
+      c_ht="$c_ht   help_category_id smallint unsigned not null,"
+         c_ht="$c_ht   description      text not null,"
+         c_ht="$c_ht   example          text not null,"
+         c_ht="$c_ht   url              varchar(128) not null,"
+         c_ht="$c_ht   primary key      (help_topic_id),"
+         c_ht="$c_ht   unique index     (name)"
+         c_ht="$c_ht )"
+         c_ht="$c_ht CHARACTER SET utf8"
+         c_ht="$c_ht comment='help topics';"
+       fi
+
+       if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_category.frm
+       then
+         c_hc="$c_hc CREATE TABLE help_category ("
+         c_hc="$c_hc   help_category_id   smallint unsigned not null,"
+         c_hc="$c_hc   name               varchar(64) not null,"
+         c_hc="$c_hc   parent_category_id smallint unsigned null,"
+         c_hc="$c_hc   url                varchar(128) not null,"
+         c_hc="$c_hc   primary key        (help_category_id),"
+         c_hc="$c_hc   unique index       (name)"
+         c_hc="$c_hc )"
+         c_hc="$c_hc   CHARACTER SET utf8"
+         c_hc="$c_hc comment='help categories';"
+       fi
+
+       if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_keyword.frm
+       then
+         c_hk="$c_hk CREATE TABLE help_keyword ("
+         c_hk="$c_hk   help_keyword_id  int unsigned not null,"
+         c_hk="$c_hk   name             varchar(64) not null,"
+         c_hk="$c_hk   primary key      (help_keyword_id),"
+         c_hk="$c_hk   unique index     (name)"
+         c_hk="$c_hk )"
+         c_hk="$c_hk   CHARACTER SET utf8"
+         c_hk="$c_hk comment='help keywords';"
+       fi
+
+       if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/help_relation.frm
+       then
+         c_hr="$c_hr CREATE TABLE help_relation ("
+         c_hr="$c_hr   help_topic_id    int unsigned not null references help_topic,"
+         c_hr="$c_hr   help_keyword_id  int unsigned not null references help_keyword,"
+         c_hr="$c_hr   primary key      (help_keyword_id, help_topic_id)"
+         c_hr="$c_hr )"
+         c_hr="$c_hr   CHARACTER SET utf8"
+         c_hr="$c_hr comment='keyword-topic relation';"
+       fi
+
+       if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_name.frm
+       then
+         c_tzn="$c_tzn CREATE TABLE time_zone_name ("
+         c_tzn="$c_tzn   Name char(64) NOT NULL,"
+         c_tzn="$c_tzn   Time_zone_id int unsigned NOT NULL,"
+         c_tzn="$c_tzn   PRIMARY KEY Name (Name)"
+         c_tzn="$c_tzn )"
+         c_tzn="$c_tzn   CHARACTER SET utf8"
+         c_tzn="$c_tzn comment='Time zone names';"
+       fi
+
+       if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone.frm
+       then
+         c_tz="$c_tz CREATE TABLE time_zone ("
+         c_tz="$c_tz   Time_zone_id int unsigned NOT NULL auto_increment,"
+         c_tz="$c_tz   Use_leap_seconds enum('Y','N') DEFAULT 'N' NOT NULL,"
+         c_tz="$c_tz   PRIMARY KEY TzId (Time_zone_id)"
+         c_tz="$c_tz )"
+         c_tz="$c_tz   CHARACTER SET utf8"
+         c_tz="$c_tz comment='Time zones';"
+       fi
+
+       if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_transition.frm
+       then
+         c_tzt="$c_tzt CREATE TABLE time_zone_transition ("
+         c_tzt="$c_tzt   Time_zone_id int unsigned NOT NULL,"
+         c_tzt="$c_tzt   Transition_time bigint signed NOT NULL,"
+         c_tzt="$c_tzt   Transition_type_id int unsigned NOT NULL,"
+         c_tzt="$c_tzt   PRIMARY KEY TzIdTranTime (Time_zone_id, Transition_time)"
+         c_tzt="$c_tzt )"
+         c_tzt="$c_tzt   CHARACTER SET utf8"
+         c_tzt="$c_tzt comment='Time zone transitions';"
+       fi
+
+       if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_transition_type.frm
+       then
+         c_tztt="$c_tztt CREATE TABLE time_zone_transition_type ("
+         c_tztt="$c_tztt   Time_zone_id int unsigned NOT NULL,"
+         c_tztt="$c_tztt   Transition_type_id int unsigned NOT NULL,"
+         c_tztt="$c_tztt   Offset int signed DEFAULT 0 NOT NULL,"
+         c_tztt="$c_tztt   Is_DST tinyint unsigned DEFAULT 0 NOT NULL,"
+         c_tztt="$c_tztt   Abbreviation char(8) DEFAULT '' NOT NULL,"
+         c_tztt="$c_tztt   PRIMARY KEY TzIdTrTId (Time_zone_id, Transition_type_id)"
+         c_tztt="$c_tztt )"
+         c_tztt="$c_tztt   CHARACTER SET utf8"
+         c_tztt="$c_tztt comment='Time zone transition types';"
+       fi
+
+       if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/time_zone_leap_second.frm
+       then
+         c_tzls="$c_tzls CREATE TABLE time_zone_leap_second ("
+         c_tzls="$c_tzls   Transition_time bigint signed NOT NULL,"
+         c_tzls="$c_tzls   Correction int signed NOT NULL,"
+         c_tzls="$c_tzls   PRIMARY KEY TranTime (Transition_time)"
+         c_tzls="$c_tzls )"
+         c_tzls="$c_tzls CHARACTER SET utf8"
+         c_tzls="$c_tzls   comment='Leap seconds information for time zones';"
+       fi
+
+       mkdir -p "$MYSQL_DATA_DIR"
+       # Using mysql:mysql for MYSQL_CLUSTER_DIR is creating SECURITY hole, root:root is proper
        chown root:root "$MYSQL_CLUSTER_DIR"
-        chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
+    chown mysql:mysql "$MYSQL_CLUSTER_DIR/mysqldb" "$MYSQL_DATA_DIR" > /dev/null 2>&1
        chmod 751 "$MYSQL_CLUSTER_DIR" "$MYSQL_CLUSTER_DIR/mysqldb"
 
        if [ -f /usr/share/mysql/mysqld.conf -a ! -f "$MYSQL_CLUSTER_DIR/mysqld.conf" ]; then
-           sed -e "s#datadir.*=.*#datadir      = $MYSQL_DATA_DIR#g" \
-               -e "s#pid-file.*=.*#pid-file = $MYSQL_PIDFILE#g" \
-               -e "s#socket.*=.*#socket = $MYSQL_SOCKET#g" \
-               /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
+           sed -e "
+               s#\(datadir.*\)=.*#\1= $MYSQL_DATA_DIR#g;
+               s#\(pid-file.*\)=.*#\1= $MYSQL_PIDFILE#g;
+               s#\(socket.*\)=.*#\1= $MYSQL_SOCKET#g;
+               s#@clusterdir@#$MYSQL_CLUSTER_DIR#g;
+               " /usr/share/mysql/mysqld.conf > "$MYSQL_CLUSTER_DIR/mysqld.conf"
            chown root:root "$MYSQL_CLUSTER_DIR/mysqld.conf"
            chmod 640 "$MYSQL_CLUSTER_DIR/mysqld.conf"
        fi
 
-       if [ ! -e /var/lib/mysql/mysql.sock ]; then
-           ln -s "$MYSQL_SOCKET" /var/lib/mysql/mysql.sock
+       if [ ! -e /var/lib/mysql/mysql.sock ] || [ -L /var/lib/mysql/mysql.sock ] && [ -z "$(readlink /var/lib/mysql/mysql.sock)" ]; then
+               sock=${MYSQL_SOCKET#/var/lib/mysql/} # make it relative if possible
+           ln -s "$sock" /var/lib/mysql/mysql.sock
        fi
 
        if /usr/sbin/mysqld --bootstrap --skip-grant-tables \
@@ -456,25 +674,34 @@ $i_f
 
 $c_t
 $c_c
+
+$c_ht
+$c_hc
+$c_hk
+$c_hr
+
+$c_tzn
+$c_tz
+$c_tzt
+$c_tztt
+$c_tzls
 END_OF_DATA
-       then 
+       then
            ok
        cat << END_OF_MSG
 
 PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS!
-This is done (after starting database) with:
+This is done (after starting database; press enter when asked for password) with:
 
-/usr/bin/mysqladmin -u mysql -S $MYSQL_SOCKET password 'password'
-/usr/bin/mysqladmin -h $hostname -u mysql -S $MYSQL_SOCKET password 'password'
-/usr/bin/mysqladmin -u mysql_logrotate -S $MYSQL_SOCKET password 'password'
+/usr/bin/mysqladmin -u mysql -p -S $MYSQL_SOCKET password 'password'
+/usr/bin/mysqladmin -h $hostname -u mysql -p -S $MYSQL_SOCKET password 'password'
+/usr/bin/mysqladmin -u mysql_logrotate -p -S $MYSQL_SOCKET password 'password'
 
 NOTE: mysql_logrotate password should be placed to $MYSQL_CONFIG in
 mysqladmin section. See the manual for more instructions.
 
-IMPORTANT: The configuration file is mysqld.conf in MYSQ_DB_CLUSTERS directories.
-
 END_OF_MSG
-      else  
+      else
            fail
            cat << END_OF_MSG
 Installation of grant tables FAILED!
@@ -495,13 +722,13 @@ logging in /etc/mysqld.conf gives you a log in /var/log/mysql/log that
 may be helpful. The latest information about MySQL is available on the
 web at http://www.mysql.com/.
 
-Please check PLD ftp site for newer versions of this package.
+Please check PLD Linux ftp site for newer versions of this package.
 
 Please consult the MySQL manual section: 'Problems running
 mysql_install_db', and the manual section that describes problems on
 your OS.  Another information source is the MySQL email archive.
 Please check all of the above before mailing us!  And if you do mail
-us, you MUST use the /usr/bin/mysqlbug script!  
+us, you MUST use the /usr/bin/mysqlbug script!
 
 END_OF_MSG
 
@@ -513,9 +740,7 @@ END_OF_MSG
 # End of useful functions.
 #
 
-RETVAL=0
-case "$action" in
-  start)
+start() {
        if [ ! -f $MYSQL_ERRLOG ]; then
                touch $MYSQL_ERRLOG
        fi
@@ -523,7 +748,7 @@ case "$action" in
        chmod 640 $MYSQL_ERRLOG
 
        for mysqldir in $DB_CLUSTERS; do
-               mysqlstatus "$mysqldir"
+               mysqlstatus "$mysqldir" start
                if [ "$MYSQL_STATUS" = "running" ]; then
                        msg_already_running "MySQL $mysqldir"
                else
@@ -531,10 +756,11 @@ case "$action" in
                fi
        done
        mysqlsubsys
-       ;;
-  stop)
+}
+
+stop() {
        for mysqldir in $DB_CLUSTERS; do
-               mysqlstatus "$mysqldir"
+               mysqlstatus "$mysqldir" stop
                if [ "$MYSQL_STATUS" = "not running" ]; then
                        msg_not_running "MySQL $mysqldir"
                else
@@ -542,30 +768,48 @@ case "$action" in
                fi
        done
        mysqlsubsys
+}
+
+RETVAL=0
+case "$action" in
+  start)
+       start
+       ;;
+  stop)
+       stop
        ;;
   status)
        for mysqldir in $DB_CLUSTERS; do
                mysqlstatus "$mysqldir"
-               echo "MySQL cluster $mysqldir: $MYSQL_STATUS"
+               if [ "$MYSQL_STATUS" = "running" ]; then
+                       show "MySQL cluster %s, PID %s" "$mysqldir" "$MYSQL_PID"
+                       progress "$MYSQL_STATUS"
+               else
+                       show "MySQL cluster %s" "$mysqldir"
+                       progress "$MYSQL_STATUS" "$CFAIL"
+               fi
+               echo
        done
        exit $?
        ;;
   restart|force-reload)
-       $0 stop
-       $0 start
-       exit $?
+       stop
+       start
        ;;
   init)
        for mysqldir in $DB_CLUSTERS; do
                mysqlinit "$mysqldir"
        done
+       exit $?
        ;;
   flush-logs)
        for mysqldir in $DB_CLUSTERS; do
            mysqlgetconfig "$mysqldir"
-           /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
+               # just if mysqld is really running
+               if /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" ping >/dev/null 2>&1; then
+                       /usr/bin/mysqladmin --defaults-file="$MYSQL_CONFIG" --socket="$MYSQL_SOCKET" flush-logs
+               fi
        done
-       exit $?
        ;;
   *)
        msg_usage "$0 {start|stop|init|restart|force-reload|status}"
@@ -573,3 +817,5 @@ case "$action" in
 esac
 
 exit $RETVAL
+
+# vi: shiftwidth=4 tabstop=4
This page took 0.062658 seconds and 4 git commands to generate.