X-Git-Url: https://git.pld-linux.org/?a=blobdiff_plain;f=mysql.init;h=b3a306eafd45323052c3a97cd7afe63cc7b05171;hb=288d6415de974d83a192d4cae8c740f863e97e5e;hp=e366109326dd1e887d34390646befc5e2bbda631;hpb=9e39a85860394a9b5b2611e3f1fa8840fd18a355;p=packages%2Fmysql.git diff --git a/mysql.init b/mysql.init old mode 100644 new mode 100755 index e366109..b3a306e --- a/mysql.init +++ b/mysql.init @@ -5,8 +5,6 @@ # chkconfig: 2345 84 25 # # description: A very fast and reliable SQL database engine. -# -# $Id$ # Source function library . /etc/rc.d/init.d/functions @@ -28,7 +26,7 @@ if [ -n "$MYSQL_DB_CLUSTERS" ]; then fi if [ -f /etc/mysql/clusters.conf ]; then - MYSQL_DB_CLUSTERS=$(awk -F= '!/^#/{print $2}' /etc/mysql/clusters.conf) + 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 @@ -102,7 +100,7 @@ mysqlstatus() { clusterdir="$1" mode="$2" - mysqlgetconfig "$clusterdir" + mysqlgetconfig "$clusterdir" status MYSQL_STATUS="not running" MYSQL_PID="unknown" @@ -148,20 +146,23 @@ mysqlstatus() { } # get mysql configuration in variables -# MYSQL_CONFIG MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE +# MYSQL_CONFIG MYSQL_CLUSTER_DIR +# MYSQL_DATA_DIR MYSQL_USER MYSQL_PIDFILE MYSQL_SOCKET MYSQL_PORT MYSQL_BIND_ADDRESS MYSQL_SKIP_NETWORKING MYSQL_LOG_ERROR # # arguments # $1 - db cluster +# $2 - status | other mysqlgetconfig() { - clusterdir="$1" + local clusterdir="$1" config_file + local mode="$2" # 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) + local 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 @@ -175,7 +176,11 @@ mysqlgetconfig() { if [ -z "$config_file" ]; then nls "Error: Can't find config file for %s cluster" "$clusterdir" - exit 6 + if [ "$mode" = "status" ]; then + exit 3 + else + exit 6 + fi else MYSQL_CONFIG="$config_file" fi @@ -183,13 +188,26 @@ mysqlgetconfig() { 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 + if [ "$mode" = "status" ]; then + exit 3 + else + exit 6 + fi fi # reset to initial state - MYSQL_DATA_DIR= MYSQL_USER= MYSQL_PIDFILE= MYSQL_SOCKET= MYSQL_PORT= MYSQL_BIND_ADDRESS= MYSQL_SKIP_NETWORKING= + MYSQL_DATA_DIR= MYSQL_USER= MYSQL_PIDFILE= MYSQL_SOCKET= MYSQL_PORT= MYSQL_BIND_ADDRESS= MYSQL_SKIP_NETWORKING= MYSQL_LOG_ERROR= eval `awk -F= ' + { + # undos + gsub(/\r$/, ""); + + # trim spaces + gsub(/^[\t ]+|[\t ]+$/, "", $1); + gsub(/^[\t ]+|[\t ]+$/, "", $2); + } + # skip comments and empty lines /^[;#]|^ *$/ { next } @@ -199,12 +217,6 @@ mysqlgetconfig() { next; } - # trim spaces - { - gsub(/^[\t ]*|[\t ]*$/, "", $1); - gsub(/^[\t ]*|[\t ]*$/, "", $2); - } - section == "mysqld" { if ($1 == "datadir") { printf("MYSQL_DATA_DIR=%s;", $2); @@ -220,10 +232,20 @@ mysqlgetconfig() { printf("MYSQL_BIND_ADDRESS=%s;", $2); } else if ($1 == "skip-networking") { printf("MYSQL_SKIP_NETWORKING=1;"); + } else if ($1 == "log-error") { + printf("MYSQL_LOG_ERROR=%s;", $2); } } ' $config_file` + # error log not defined in config file. add one + if [ -z "$MYSQL_LOG_ERROR" ]; then + MYSQL_LOG_ERROR=$MYSQL_ERRLOG + else + # unset, so mysqld would use value from config itself + unset MYSQL_LOG_ERROR + fi + if is_yes "$MYSQL_RA_COMPAT"; then MYSQL_DATA_DIR_SUB="" else @@ -242,7 +264,7 @@ mysqlgetconfig() { exit 6 fi - if [ -z $MYSQL_USER ]; then + if [ -z "$MYSQL_USER" ]; then echo "$(nls 'MySQL user not configured properly')"'!' >&2 nls "Edit %s and configure it." "$config_file" >&2 exit 6 @@ -251,7 +273,7 @@ mysqlgetconfig() { # start mysql mysqlstart() { - clusterdir="$1" + local clusterdir="$1" mysqlgetconfig "$clusterdir" if [ ! -d "$MYSQL_DATA_DIR/mysql" ]; then nls "MySQL cluster %s not initialized." "$clusterdir" @@ -259,21 +281,17 @@ mysqlstart() { exit 6 fi - msg_starting "MySQL $clusterdir" - busy + msg_starting "MySQL $clusterdir"; busy [ -z "$DEFAULT_SERVICE_RUN_NICE_LEVEL" ] && DEFAULT_SERVICE_RUN_NICE_LEVEL=0 rm -f "$MYSQL_PIDFILE" - if [ "$(grep -c ^log-error $MYSQL_CONFIG)" -lt 1 ]; then - # error log not defined in config file. add one - MYSQL_OPTIONS="$MYSQL_OPTIONS --log-error=$MYSQL_ERRLOG" - fi 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_LOG_ERROR:+--log-error="$MYSQL_LOG_ERROR"} \ $MYSQL_OPTIONS & pid=$! @@ -309,7 +327,7 @@ mysqlstart() { # stop mysql mysqlstop() { - clusterdir="$1" + local clusterdir="$1" mysqlstatus "$clusterdir" stop msg_stopping "MySQL $clusterdir" busy @@ -337,6 +355,58 @@ mysqlstop() { fi } +# report slave status +# uses MYSQL_SOCKET - path to mysql socket +slave_status() { + # see if slave status can be reported + local err=0 slave_status=$(mysql -S $MYSQL_SOCKET -e 'show slave status\G') + if [ -z "$slave_status" ]; then + # slave not setup + return + fi + + printf "Slave Status:\n" + + eval $(echo "$slave_status" | awk -F': ' '/^ *[A-Za-z_]+:/{ + k = tolower($1); + v = substr($0, length($1) + 3); + gsub(/\\/, "\\\\\\", v); + gsub(/"/, "\\\"", v); + gsub(/`/, "\\`", v); + gsub(/\$/, "\\$", v); + printf("%s=\"%s\";\n", k, v); + }') + + if [ "$slave_io_running" != "Yes" ]; then + printf "\tSlave IO not running\n" + err=1 + fi + if [ "$slave_sql_running" != "Yes" ]; then + printf "\tSlave SQL not running\n" + err=1 + fi + + if [ "$err" = 1 -a "$last_errno" -gt 0 ]; then + printf "\tERROR $last_errno: $last_error\n" + fi + + if [ "$master_log_file" != "$relay_master_log_file" ]; then + printf "\tERROR logfile mismatch ($relay_master_log_file)\n" + err=1 + fi + + if [ -z "$read_master_log_pos" -o -z "$exec_master_log_pos" ]; then + printf "\tERROR No info about master\n" + err=1 + return + fi + + diff=$(($read_master_log_pos - $exec_master_log_pos)) + printf "\tread pos: $read_master_log_pos ($master_log_file) (host: $master_host:$master_port)\n" + printf "\texec pos: $exec_master_log_pos\n" + printf "\tdiff: $diff\n" +} + # # check for running mysql instances; if any instance is running then # create subsys lock file @@ -354,7 +424,7 @@ mysqlsubsys() { } mysqlinit() { - clusterdir="$1" + local clusterdir="$1" if [ -f /etc/mysqld.conf ]; then nls "Running in \`no cluster compat' mode: can't initialize database." @@ -375,7 +445,7 @@ mysqlinit() { MYSQL_CONFIG="$MYSQL_CLUSTER_DIR/mysqld.conf" fi - show "Initializing cluster %s" "$clusterdir"; echo + show "Initializing cluster %s" "$clusterdir"; started # Check if not exist init database if [ -d "$MYSQL_DATA_DIR/mysql" ]; then @@ -454,9 +524,15 @@ END_OF_MSG show "Filling help tables..." ok=0 ( echo "use mysql;"; cat /usr/share/mysql/fill_help_tables.sql ) | \ - /usr/sbin/mysqld --bootstrap --skip-grant-tables \ - --datadir=$MYSQL_DATA_DIR --user=$MYSQL_USER \ - --slave-load-tmpdir=$MYSQL_DATA_DIR --tmpdir=$MYSQL_DATA_DIR --log-error=$MYSQL_ERRLOG \ + /usr/sbin/mysqld \ + --defaults-file=$MYSQL_CLUSTER_DIR/mysqld.conf \ + --bootstrap \ + --skip-grant-tables \ + --datadir=$MYSQL_DATA_DIR \ + --user=$MYSQL_USER \ + --slave-load-tmpdir=$MYSQL_DATA_DIR \ + --tmpdir=$MYSQL_DATA_DIR \ + --log-error=$MYSQL_ERRLOG \ && ok=1 if [ "$ok" = 1 ]; then ok @@ -507,6 +583,7 @@ END_OF_MSG # start() { + local mysqldir for mysqldir in $DB_CLUSTERS; do mysqlstatus "$mysqldir" start if [ "$MYSQL_STATUS" = "running" ]; then @@ -519,6 +596,7 @@ start() { } stop() { + local mysqldir for mysqldir in $DB_CLUSTERS; do mysqlstatus "$mysqldir" stop if [ "$MYSQL_STATUS" = "not running" ]; then @@ -531,22 +609,23 @@ stop() { } condrestart() { - if [ -f /var/lock/subsys/mysql ]; then - stop - start - else + if [ ! -f /var/lock/subsys/mysql ]; then msg_not_running "MySQL" RETVAL=$1 + return fi + + stop + start } RETVAL=0 case "$action" in start) - start + start ;; stop) - stop + stop ;; restart) stop @@ -558,17 +637,37 @@ case "$action" in force-reload) condrestart 7 ;; + 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 + ;; status) + RETVAL=3 for mysqldir in $DB_CLUSTERS; do mysqlstatus "$mysqldir" if [ "$MYSQL_STATUS" = "running" ]; then + RETVAL=0 addr=${MYSQL_BIND_ADDRESS:-0.0.0.0} port=${MYSQL_PORT:-3306} socket=${MYSQL_SOCKET:-/var/lib/mysql/mysql.sock} pid=$MYSQL_PID nls "MySQL cluster %s, pid %s\n" "$mysqldir" "$pid" [ -z "$MYSQL_SKIP_NETWORKING" ] && nls "\ttcp:%s:%s\n" "$addr" "$port" - nls "\tunix:%s\n" "$socket" + nls "\tunix: %s\n" "$socket" + + MYSQL_SOCKET=$socket slave_status + pids="$pids/$MYSQL_PID/" progress "$MYSQL_STATUS" else @@ -598,7 +697,10 @@ case "$action" in socket=${MYSQL_SOCKET:-/var/lib/mysql/mysql.sock} nls "MySQL cluster %s, pid %s\n" "$mysqldir" "$pid" [ -z "$MYSQL_SKIP_NETWORKING" ] && nls "\ttcp:%s:%s\n" "$addr" "$port" - nls "\tunix:%s\n" "$socket" + nls "\tunix: %s\n" "$socket" + + MYSQL_SOCKET=$socket slave_status + progress "$MYSQL_STATUS" else show "MySQL cluster %s" "$mysqldir" @@ -608,23 +710,8 @@ case "$action" in done fi ;; - 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|try-restart|force-reload|status}" + msg_usage "$0 {start|stop|restart|try-restart|force-reload|init|flush-logs|status}" exit 3 esac