#!/bin/sh # # mysql A very fast and reliable SQL database engine # # chkconfig: 2345 84 25 # # description: A very fast and reliable SQL database engine. # # Source function library . /etc/rc.d/init.d/functions # Get network config . /etc/sysconfig/network # Get service config if [ -f /etc/sysconfig/mysql ]; then . /etc/sysconfig/mysql else 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 [ -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 msg_network_down MySQL exit 1 fi else exit 0 fi action="$1" # any db cluster as command line argument? if [ $# -gt 1 ]; then 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" 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. # # # check for mysql status # # arguments: # $1 - db cluster # $2 - start|stop # # sets variables: # 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" 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 [ "$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 # MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE # # arguments # $1 - db cluster mysqlgetconfig() { clusterdir="$1" # 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_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" 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 fi eval `awk ' /^[ \t]*\[.*\][ \t]*$/ { match($0,/\[.*\]/) section=substr($0, RSTART + 1, RSTART + RLENGTH - 3) } section == "mysqld" && $2 ~ "=" { if ($1 == "datadir") { printf("MYSQL_DATA_DIR=%s;", $3) } else if ($1 == "user") { printf("MYSQL_USER=%s;", $3) } else if ($1 == "pid-file") { printf("MYSQL_PIDFILE=%s;", $3) } else if ($1 == "socket") { printf("MYSQL_SOCKET=%s;", $3) } } ' $config_file` if is_yes "$MYSQL_RA_COMPAT"; then MYSQL_DATA_DIR_SUB="" else 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 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." exit 6 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 fi } # start mysql mysqlstart() { clusterdir="$1" mysqlgetconfig "$clusterdir" 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 msg_starting "MySQL $clusterdir" busy [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0 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 died else RETVAL=1 fail fi } # stop mysql mysqlstop() { clusterdir="$1" mysqlstatus "$clusterdir" stop msg_stopping "MySQL $clusterdir" busy # 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" -o "$MYSQL_STATUS" = "starting" ]; then fail else ok fi } # # check for running mysql instances; if any instance is running then # 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 } 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 fi if [ -f "$clusterdir/mysqld.conf" ]; then 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" # 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/mysql" nls "before initializing database." nls "For now skipping cluster %s." "$clusterdir" return fi show "Creating privilege mysql tables for $MYSQL_DATA_DIR" busy 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 fail 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 deltext fail nls "Sorry, the host '%s' could not be looked up." "$hostname" nls "Please configure the 'hostname' command to return a correct hostname." exit 1 fi # Initialize variables 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 then # mysqld --bootstrap wants one command/line c_d="$c_d CREATE TABLE db (" c_d="$c_d Host char(60) DEFAULT '' NOT NULL," c_d="$c_d Db char(64) DEFAULT '' NOT NULL," c_d="$c_d User char(16) DEFAULT '' NOT NULL," c_d="$c_d Select_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Update_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Create_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d References_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Index_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_d="$c_d Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL," 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 then c_h="$c_h CREATE TABLE host (" c_h="$c_h Host char(60) DEFAULT '' NOT NULL," c_h="$c_h Db char(64) DEFAULT '' NOT NULL," c_h="$c_h Select_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Update_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Create_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h References_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Index_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_h="$c_h Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL," 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 if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/user.frm then 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(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," c_u="$c_u Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Create_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Process_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u File_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u References_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Index_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Super_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL," c_u="$c_u ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL," c_u="$c_u ssl_cipher BLOB NOT NULL," c_u="$c_u x509_issuer BLOB NOT NULL," c_u="$c_u x509_subject BLOB NOT NULL," c_u="$c_u max_questions int(11) unsigned DEFAULT 0 NOT NULL," c_u="$c_u max_updates int(11) unsigned DEFAULT 0 NOT NULL," 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); 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); 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); 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); 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);" fi if test ! -f $MYSQL_DATA_DIR/mysqldb/mysql/func.frm then c_f="$c_f CREATE TABLE func (" c_f="$c_f name char(64) DEFAULT '' NOT NULL," c_f="$c_f ret tinyint(1) DEFAULT '0' NOT NULL," c_f="$c_f dl char(128) DEFAULT '' NOT NULL," 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 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 then c_t="$c_t CREATE TABLE tables_priv (" c_t="$c_t Host char(60) DEFAULT '' NOT NULL," c_t="$c_t Db char(64) DEFAULT '' NOT NULL," c_t="$c_t User char(16) DEFAULT '' NOT NULL," c_t="$c_t Table_name char(60) DEFAULT '' NOT NULL," c_t="$c_t Grantor char(77) DEFAULT '' NOT NULL," c_t="$c_t Timestamp timestamp(14)," c_t="$c_t Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL," c_t="$c_t Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL," 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 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(64) DEFAULT '' NOT NULL," c_c="$c_c User char(16) 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 CHARACTER SET utf8 COLLATE utf8_bin" c_c="$c_c comment='Column privileges';" fi 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 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.*\)=.*#\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 ] || [ -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 \ --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER << END_OF_DATA CREATE DATABASE mysql; use mysql; $c_d $i_d $c_h $i_h $c_u $i_u $c_f $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 ok cat << END_OF_MSG PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL USERS! This is done (after starting database; press enter when asked for password) with: /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. END_OF_MSG else fail cat << END_OF_MSG Installation of grant tables FAILED! Examine the logs in $MYSQL_DATA_DIR for more information. You can also try to start the mysqld demon with: /usr/sbin/mysqld --skip-grant & You can use the command line tool /usr/bin/mysql to connect to the mysql database and look at the grant tables: shell> /usr/bin/mysql -u mysql mysql mysql> show tables Try 'mysqld --help' if you have problems with paths. Setting on 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 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! END_OF_MSG exit 1 fi } # # End of useful functions. # start() { if [ ! -f $MYSQL_ERRLOG ]; then touch $MYSQL_ERRLOG fi chown mysql:mysql $MYSQL_ERRLOG chmod 640 $MYSQL_ERRLOG for mysqldir in $DB_CLUSTERS; do mysqlstatus "$mysqldir" start if [ "$MYSQL_STATUS" = "running" ]; then msg_already_running "MySQL $mysqldir" else mysqlstart "$mysqldir" fi done mysqlsubsys } stop() { for mysqldir in $DB_CLUSTERS; do mysqlstatus "$mysqldir" stop if [ "$MYSQL_STATUS" = "not running" ]; then msg_not_running "MySQL $mysqldir" else mysqlstop "$mysqldir" fi done mysqlsubsys } RETVAL=0 case "$action" in start) start ;; stop) stop ;; status) for mysqldir in $DB_CLUSTERS; do mysqlstatus "$mysqldir" 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) stop start ;; init) for mysqldir in $DB_CLUSTERS; do mysqlinit "$mysqldir" done exit $? ;; flush-logs) for mysqldir in $DB_CLUSTERS; do mysqlgetconfig "$mysqldir" # 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 ;; *) msg_usage "$0 {start|stop|init|restart|force-reload|status}" exit 3 esac exit $RETVAL # vi: shiftwidth=4 tabstop=4