SQLinfo.ru - Все о MySQL PG day 17

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.03.2017 06:08:38

north83
Участник
Зарегистрирован: 27.07.2009
Сообщений: 24

Старт Mysql 5.5.41 при загрузке Debian

Всем доброго времени.
При загрузке Debian в VM (ESXi)
Стала появляться такая вот картина

https://yadi.sk/i/QTe5yCET3FqHXL

Но по факту, MySQL стартует.

в SysLog:

https://yadi.sk/i/-eGcOX7P3FqM9V

Т.е. то ли при загрузке не хватает отведенного тайм-аута, то ли еще что, подскажите, как увидеть при загрузке заветный [ok]

Отредактированно north83 (15.03.2017 06:12:25)


Прикрепленные файлы:
Attachment Icon 2017-03-15_06-07-13.png, Размер: 73,386 байт, Скачано: 28

Неактивен

 

#2 15.03.2017 06:13:07

north83
Участник
Зарегистрирован: 27.07.2009
Сообщений: 24

Re: Старт Mysql 5.5.41 при загрузке Debian

Вот это вижу при загрузке


Прикрепленные файлы:
Attachment Icon 2017-03-15_05-36-15.png, Размер: 103,285 байт, Скачано: 29

Неактивен

 

#3 15.03.2017 10:59:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3749

Re: Старт Mysql 5.5.41 при загрузке Debian

Есть ли файл /var/run/mysqld/mysqld.sock ?
Стартап скрипт ищет этот файл.

Неактивен

 

#4 15.03.2017 19:20:01

north83
Участник
Зарегистрирован: 27.07.2009
Сообщений: 24

Re: Старт Mysql 5.5.41 при загрузке Debian

Да вот сейчас есть
https://yadi.sk/i/IkKea_Ta3Ftj4b

Он создается при загрузке? Может не успевает создаться? Потому что, редко бывает при загрузке стартует, но чаще Fail
Смотришь status, показывает, что Mysql stopped, подождешь 2-5 мин, еще раз проверка статуса и он уже работает.

В чем может быть проблема такого долгого старта?

Неактивен

 

#5 16.03.2017 00:01:11

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3749

Re: Старт Mysql 5.5.41 при загрузке Debian

В логе, который Вы привели есть пауза между 5:13:18 и 5:13:51. Почему это происходит? Может быть много причин. Например, битый диск, чтение с которого ждет таймаута, нет места на диске или еще что-то.

Неактивен

 

#6 16.03.2017 21:37:57

north83
Участник
Зарегистрирован: 27.07.2009
Сообщений: 24

Re: Старт Mysql 5.5.41 при загрузке Debian

Места на диске предостаточно, проверку на битые блоки поставили.

Что еще может быть?

Неактивен

 

#7 17.03.2017 17:52:38

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6610

Re: Старт Mysql 5.5.41 при загрузке Debian

А лог MySQL покажите?

Кажется, что просто MySQL не успевает запуститься за то время, в течение которого init-скрипт ждет появления сокета. Если база большая, то так может быть, и тогда просто поможет увеличение таймаута. Но давайте начнем с лога.

Неактивен

 

#8 20.03.2017 14:11:46

north83
Участник
Зарегистрирован: 27.07.2009
Сообщений: 24

Re: Старт Mysql 5.5.41 при загрузке Debian

Если, то что пишется в syslog, то в первом сообщении, включил логирование в mysql.log, так там только запросы.

Какой то еще есть лог?
И через atop вижу mysql напрягает сильно диск.
https://yadi.sk/i/aSeck2HY3GAij4

Отредактированно north83 (20.03.2017 14:12:40)

Неактивен

 

#9 20.03.2017 17:51:17

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6610

Re: Старт Mysql 5.5.41 при загрузке Debian

Да, проглядел, и правда есть. Судя по логу, MySQL у Вас стартует чуть больше 30 секунд. Если научить инитскрипт (/etc/init.d/mysql) ждать чуть дольше (например, 60 секунд), то проблема отображения ошибки исчезнет. Если у Вас скрипт такой же, как у меня (может меняться в зависимости от версий, то ждет он только 30 секунд):


        # 6s was reported in #352070 to be too few when using ndbcluster
        # 14s was reported in #736452 to be too few with large installs
        for i in $(seq 1 30); do    # 30 -> 60
 


Раз такое дело, советую обратить внимание также и на остановку сервера, в моем скрипте он ждет 10 секунд, а потом убивает его сигналом 9, что может приводить к различным ошибкам, тут я бы просто закомментировал строчку с убийством:

           for i in 1 2 3 4 5 6 7 8 9 10; do
              sleep 1
              if mysqld_status check_dead nowarn; then server_down=1; break; fi
            done
          if test -z "$server_down"; then killall -9 mysqld; fi  # закомментировать
 

Неактивен

 

#10 20.03.2017 18:18:20

north83
Участник
Зарегистрирован: 27.07.2009
Сообщений: 24

Re: Старт Mysql 5.5.41 при загрузке Debian

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          mysql
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $time
# Should-Stop:       $network $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop the mysql database server daemon
# Description:       Controls the main MySQL database server daemon "mysqld"
#                    and its wrapper script "mysqld_safe".
### END INIT INFO
#
set -e
set -u
${DEBIAN_SCRIPT_DEBUG:+ set -v -x}

test -x /usr/bin/mysqld_safe || exit 0

. /lib/lsb/init-functions

SELF=$(cd $(dirname $0); pwd -P)/$(basename $0)
CONF=/etc/mysql/my.cnf
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"

# priority can be overriden and "-s" adds output to stderr
ERR_LOGGER="logger -p daemon.err -t /etc/init.d/mysql -i"

# Safeguard (relative paths, core dumps..)
cd /
umask 077

# mysqladmin likes to read /root/.my.cnf. This is usually not what I want
# as many admins e.g. only store a password without a username there and
# so break my scripts.
export HOME=/etc/mysql/

## Fetch a particular option from mysql's invocation.
#
# Usage: void mysqld_get_param option
mysqld_get_param() {
    /usr/sbin/mysqld --print-defaults \
        | tr " " "\n" \
        | grep -- "--$1" \
        | tail -n 1 \
        | cut -d= -f2
}

## Do some sanity checks before even trying to start mysqld.
sanity_checks() {
  # check for config file
  if [ ! -r /etc/mysql/my.cnf ]; then
    log_warning_msg "$0: WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz"
    echo                "WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz" | $ERR_LOGGER
  fi

  # check for diskspace shortage
  datadir=`mysqld_get_param datadir`
  if LC_ALL=C BLOCKSIZE= df --portability $datadir/. | tail -n 1 | awk '{ exit ($4>4096) }'; then
    log_failure_msg "$0: ERROR: The partition with $datadir is too full!"
    echo                "ERROR: The partition with $datadir is too full!" | $ERR_LOGGER
    exit 1
  fi
}

## Checks if there is a server running and if so if it is accessible.
#
# check_alive insists on a pingable server
# check_dead also fails if there is a lost mysqld in the process list
#
# Usage: boolean mysqld_status [check_alive|check_dead] [warn|nowarn]
mysqld_status () {
    ping_output=`$MYADMIN ping 2>&1`; ping_alive=$(( ! $? ))

    ps_alive=0
    pidfile=`mysqld_get_param pid-file`
    if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi
   
    if [ "$1" = "check_alive"  -a  $ping_alive = 1 ] ||
       [ "$1" = "check_dead"   -a  $ping_alive = 0  -a  $ps_alive = 0 ]; then
    return 0 # EXIT_SUCCESS
    else
      if [ "$2" = "warn" ]; then
          echo -e "$ps_alive processes alive and '$MYADMIN ping' resulted in\n$ping_output\n" | $ERR_LOGGER -p daemon.debug
    fi
      return 1 # EXIT_FAILURE
    fi
}

#
# main()
#

case "${1:-''}" in
  'start')
    sanity_checks;
    # Start daemon
    log_daemon_msg "Starting MySQL database server" "mysqld"
    if mysqld_status check_alive nowarn; then
       log_progress_msg "already running"
       log_end_msg 0
    else
        # Could be removed during boot
        test -e /var/run/mysqld || install -m 755 -o mysql -g root -d /var/run/mysqld

        # Start MySQL!
          /usr/bin/mysqld_safe > /dev/null 2>&1 &

        # 6s was reported in #352070 to be too few when using ndbcluster
        for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14; do
                sleep 1
            if mysqld_status check_alive nowarn ; then break; fi
        log_progress_msg "."
        done
        if mysqld_status check_alive warn; then
                log_end_msg 0
            # Now start mysqlcheck or whatever the admin wants.
            output=$(/etc/mysql/debian-start)
        [ -n "$output" ] && log_action_msg "$output"
        else
            log_end_msg 1
        log_failure_msg "Please take a look at the syslog"
        fi
    fi
    ;;

  'stop')
    # * As a passwordless mysqladmin (e.g. via ~/.my.cnf) must be possible
    # at least for cron, we can rely on it here, too. (although we have
    # to specify it explicit as e.g. sudo environments points to the normal
    # users home and not /root)
    log_daemon_msg "Stopping MySQL database server" "mysqld"
    if ! mysqld_status check_dead nowarn; then
      set +e
      shutdown_out=`$MYADMIN shutdown 2>&1`; r=$?
      set -e
      if [ "$r" -ne 0 ]; then
        log_end_msg 1
        [ "$VERBOSE" != "no" ] && log_failure_msg "Error: $shutdown_out"
        log_daemon_msg "Killing MySQL database server by signal" "mysqld"
        killall -15 mysqld
            server_down=
        for i in 1 2 3 4 5 6 7 8 9 10; do
              sleep 1
              if mysqld_status check_dead nowarn; then server_down=1; break; fi
            done
          if test -z "$server_down"; then killall -9 mysqld; fi
      fi
        fi

        if ! mysqld_status check_dead warn; then
      log_end_msg 1
      log_failure_msg "Please stop MySQL manually and read /usr/share/doc/mysql-server-5.5/README.Debian.gz!"
      exit -1
    else
      log_end_msg 0
        fi
    ;;

  'restart')
    set +e; $SELF stop; set -e
    $SELF start
    ;;

  'reload'|'force-reload')
      log_daemon_msg "Reloading MySQL database server" "mysqld"
    $MYADMIN reload
    log_end_msg 0
    ;;

  'status')
    if mysqld_status check_alive nowarn; then
      log_action_msg "$($MYADMIN version)"
    else
      log_action_msg "MySQL is stopped."
      exit 3
    fi
      ;;

  *)
    echo "Usage: $SELF start|stop|restart|reload|force-reload|status"
    exit 1
    ;;
esac

 


Не нашел первую строчку, вот конфиг

Неактивен

 

#11 21.03.2017 01:09:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6610

Re: Старт Mysql 5.5.41 при загрузке Debian

Вот же:


# 6s was reported in #352070 to be too few when using ndbcluster
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14; do


Тут можно или продолжить числа до 60, или заменить на `seq 60` (обратите внимание на обратные кавычки, а не прямые, это там, где буква ё на клавиатуре):


# 6s was reported in #352070 to be too few when using ndbcluster
for i in `seq 60`; do

Неактивен

 

#12 21.03.2017 09:18:08

north83
Участник
Зарегистрирован: 27.07.2009
Сообщений: 24

Re: Старт Mysql 5.5.41 при загрузке Debian

Спасибо, помогло, как быть с нагрузкой на SSD ? в какую сторону копать.
Вот мой конфиг

#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# <a href="http://dev.mysql.com/doc/mysql/en/server-system-variables.html">http://dev.mysql.com/doc/mysql/en/serve &hellip; ables.html</a>

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port        = 3306
socket        = /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket        = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
local-infile=0
#
# * Basic Settings
#
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket        = /var/run/mysqld/mysqld.sock
port        = 3306
basedir        = /usr
datadir        = /var/lib/mysql
tmpdir        = /tmp
lc-messages-dir    = /usr/share/mysql
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address        = 127.0.0.1
#
# * Fine Tuning
#
key_buffer_size     = 2024M
innodb_buffer_pool_size    = 5000M
innodb_buffer_pool_instances = 5
innodb_flush_method    = O_DIRECT
max_allowed_packet    = 16M
thread_stack        = 192K
thread_cache_size       = 8

max_heap_table_size = 128M
tmp_table_size = 128M

# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover-options         = BACKUP
max_connections        = 500
max-connect-errors = 10000
table_cache            = 1024
#thread_concurrency     = 10
#
# * Query Cache Configuration
#
query_cache_limit    = 1M
query_cache_size        = 128M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
#
# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.
#
# Here you can see queries with especially long duration
#log_slow_queries    = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id        = 1
#log_bin            = /var/log/mysql/mysql-bin.log
expire_logs_days    = 10
max_binlog_size         = 100M
#binlog_do_db        = include_database_name
#binlog_ignore_db    = include_database_name
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem



[mysqldump]
quick
quote-names
max_allowed_packet    = 16M

[mysql]
#no-auto-rehash    # faster start of mysql but no tab completition

[isamchk]
key_buffer        = 16M

#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/

Неактивен

 

#13 22.03.2017 00:45:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6610

Re: Старт Mysql 5.5.41 при загрузке Debian

Я в этом треде потерялся, видимо, но поиск говорит, что слово SSD встречается только в последнем посте smile В чем проблема с SSD?

Неактивен

 

#14 22.03.2017 08:37:59

north83
Участник
Зарегистрирован: 27.07.2009
Сообщений: 24

Re: Старт Mysql 5.5.41 при загрузке Debian

MySQL создает большую нагрузку на дисковую подсистему (рейд 0, два SSD диска)
Выше выложил свой конфиг, подскажите какие быть может переменные подкрутить.
90% InnoDB у нас, и немного MYISAM
И через atop вижу mysql напрягает сильно диск.

Первая красная строчка SWP, вторая DSK
https://yadi.sk/i/aSeck2HY3GAij4

Отредактированно north83 (22.03.2017 08:39:01)

Неактивен

 

#15 22.03.2017 14:38:09

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6610

Re: Старт Mysql 5.5.41 при загрузке Debian

Такова жизнь — MySQL работает с диском smile

Если у вас много мелких транзакций, Вы можете попробовать отключить флаши на диск на каждую транзакцию (innodb_flush_log_at_trx_commit=0), и тогда при выпадении сервера вы потеряете около секунды последних изменений.

Неактивен

 

#16 22.03.2017 17:32:09

north83
Участник
Зарегистрирован: 27.07.2009
Сообщений: 24

Re: Старт Mysql 5.5.41 при загрузке Debian

А можно как то настроить, чтобы все чтение происходило из оперативной памяти, а вся запись на диск?
порядка 15 баз общий размер всех 600 мб.
Это все базы сайтов, т.е. записи мало, воосновном чтение.
80% InnoDb
20% MyISAM

Неактивен

 

#17 23.03.2017 00:34:38

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6610

Re: Старт Mysql 5.5.41 при загрузке Debian

Судя по статистике атопа, в основном запись как раз. Ну то есть не так — чтение у вас уже происходит из оперативной памяти (из-за этого чтения с диска почти нет), а запись уже идет на диск (из-за этого записи много). Боюсь, что тут ничего лучше «не флашить каждую транзакцию на диск» я предложить не смогу.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson