Служба mysql не запускается/зависает - тайм-аут (Ubuntu, MariaDB)

Я настроил свой первый сервер Ubuntu с Ubuntu 16.04, nginx, php7.0, MariaDB, nextcloud и внешним DynDNS, используя этот учебник здесь: Установить Nextcloud 9 на Ubuntu 16.04

Все работало нормально, но так как я перезапустил сервер на следующий день, nextcloud просто показывает мне пустую страницу. Пролистав все логи nginx, MariaDB и nextcloud, я обнаружил, что служба mysql просто не запускается. Итак, запустите service mysql start, и все снова заработало нормально (вызов nextcloud с сервера, а также с других рабочих станций). Я просто удивился, что терминал не "закрыл" линию. Как будто он все еще работал над командой. Примерно через 5 минут линия «закрывается» и появляется следующее сообщение:

«Задание для mariadb.service не выполнено из-за превышения тайм-аута. Подробности см. в «systemctl status mariadb.service» и «journalctl -xe».

Потом клиенты снова просто получают пустую страницу в nextcloud. Когда я запускаю команду и немедленно закрываю терминал, клиенты также получают доступ, но все равно теряют его через 5 минут.

Я попытался сделать резервную копию nextcloud, sql и запустить apt-get purge --auto-remove mariadb-server. Затем снова выполните шаги установки MariaDB из руководства, импортировав резервную копию sql вместо создания новой. Не все поменял.

Следующая попытка была update-rc.d mysql defaults и update-rc.d mysql enable. Но после перезагрузки снова просто пустая страница. Доступ возможен только на 5 минут после запуска сервис-мануала.

Я также попробовал BUM - BootUpManager, но служба, похоже, включена . Я видел, что вы также можете запускать службы из него вручную. Итак, попробовал это с mysql и удивился: nextcloud доступен в течение 5 минут, а BUM просто зависает.

Я также нашел mariadb.com/kb/en/mariadb/starting-and-stopping-mariadb-automatically/, но ничего не пробовал, потому что кажется, что что-то еще действительно не так.

root@s1:~# systemctl status mariadb.service:

\u25cf mariadb.service - MariaDB database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: 
  Drop-In: /etc/systemd/system/mariadb.service.d
           \u2514\u2500migrated-from-my.cnf-settings.conf
   Active: failed (Result: timeout) since Di 2016-12-06 14:52:51 CET; 55s ago
  Process: 3565 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WS
  Process: 3415 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR
  Process: 3409 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START
  Process: 3405 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/ru
 Main PID: 3565 (code=exited, status=0/SUCCESS)

Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 3067387712 [Note] /usr/sbin
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 3067387712 [Note] Event Sch
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 2147785536 [Note] InnoDB: F
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 3067387712 [Note] InnoDB: S
Dez 06 14:52:49 s1 mysqld[3565]: 2016-12-06 14:52:49 3067387712 [Note] InnoDB: W
Dez 06 14:52:50 s1 mysqld[3565]: 2016-12-06 14:52:50 3067387712 [Note] InnoDB: S
Dez 06 14:52:50 s1 mysqld[3565]: 2016-12-06 14:52:50 3067387712 [Note] /usr/sbin
Dez 06 14:52:51 s1 systemd[1]: Failed to start MariaDB database server.
Dez 06 14:52:51 s1 systemd[1]: mariadb.service: Unit entered failed state.
Dez 06 14:52:51 s1 systemd[1]: mariadb.service: Failed with result 'timeout'.

root@s1:~# journalctl -xe:

Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 3067387712 [Note] Event Scheduler: Purging the queue. 0 events
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 2147785536 [Note] InnoDB: FTS optimize thread exiting.
Dez 06 14:52:48 s1 mysqld[3565]: 2016-12-06 14:52:48 3067387712 [Note] InnoDB: Starting shutdown...
Dez 06 14:52:49 s1 mysqld[3565]: 2016-12-06 14:52:49 3067387712 [Note] InnoDB: Waiting for page_cleaner to finish flushing of buffer po
Dez 06 14:52:50 s1 mysqld[3565]: 2016-12-06 14:52:50 3067387712 [Note] InnoDB: Shutdown completed; log sequence number 111890806
Dez 06 14:52:50 s1 mysqld[3565]: 2016-12-06 14:52:50 3067387712 [Note] /usr/sbin/mysqld: Shutdown complete
Dez 06 14:52:50 s1 audit[3648]: AVC apparmor="DENIED" operation="sendmsg" info="Failed name lookup - disconnected path" error=-13 profi
Dez 06 14:52:50 s1 kernel: audit: type=1400 audit(1481032370.973:29): apparmor="DENIED" operation="sendmsg" info="Failed name lookup - 
Dez 06 14:52:50 s1 audit[3565]: AVC apparmor="DENIED" operation="sendmsg" info="Failed name lookup - disconnected path" error=-13 profi
Dez 06 14:52:50 s1 kernel: audit: type=1400 audit(1481032370.973:30): apparmor="DENIED" operation="sendmsg" info="Failed name lookup - 
Dez 06 14:52:51 s1 systemd[1]: Failed to start MariaDB database server.
-- Subject: Unit mariadb.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit mariadb.service has failed.
-- 
-- The result is failed.
Dez 06 14:52:51 s1 systemd[1]: mariadb.service: Unit entered failed state.
Dez 06 14:52:51 s1 systemd[1]: mariadb.service: Failed with result 'timeout'.
Dez 06 14:54:54 s1 x11vnc[2665]: 06/12/2016 14:54:54 cursor_noshape_updates_clients: 1
Dez 06 14:55:16 s1 ntpd[1244]: 46.4.1.155 local addr 192.168.178.50 -> <null>
Dez 06 14:57:30 s1 ntpd[1244]: 89.238.66.98 local addr 192.168.178.50 -> <null>

Содержимое в /ect/init.d (если полезно):

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          mysql
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $named $time
# Should-Stop:       $network $named $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 MariaDB 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/sbin/mysqld || 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/

# Source default config file.
[ -r /etc/default/mariadb ] && . /etc/default/mariadb

## 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 MariaDB 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 MariaDB! 
        /usr/bin/mysqld_safe "${@:2}" > /dev/null 2>&1 &

        # 6s was reported in #352070 to be too little
        for i in $(seq 1 "${MYSQLD_STARTUP_TIMEOUT:-60}"); 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 MariaDB 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 MariaDB database server by signal" "mysqld"
        killall -15 mysqld
            server_down=
        for i in `seq 1 600`; 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 MariaDB manually and read /usr/share/doc/mariadb-server-10.1/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 MariaDB 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 "MariaDB is stopped."
      exit 3
    fi
    ;;

  'bootstrap')
    # Bootstrap the cluster, start the first node
    # that initiates the cluster
    log_daemon_msg "Bootstrapping the cluster" "mysqld"
    $SELF start "${@:2}" --wsrep-new-cluster
    ;;

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

К сожалению, Google не может мне помочь. Я пытался объяснить как можно больше, возможно, это поможет вам помочь мне. Большое спасибо!


person Lw Bi    schedule 06.12.2016    source источник
comment
Сэкономьте время и прокрутите здесь   -  person Josh    schedule 17.12.2019


Ответы (10)


Если вы столкнулись с этой ошибкой, решение дается в качестве предложения в отчете об ошибке (все это должно быть сделано от имени пользователя root, поэтому либо с sudo -i в качестве нулевой команды, либо с префиксом sudo):

  1. echo "/usr/sbin/mysqld { }" > /etc/apparmor.d/usr.sbin.mysqld (вторая часть с sudo — ... | sudo tee /etc/apparmor.d/usr.sbin.mysqld, спасибо @dvlcube)
  2. apparmor_parser -v -R /etc/apparmor.d/usr.sbin.mysqld
  3. systemctl restart mariadb

Background

Если у вас ранее была установлена ​​MySQL, она активировала профиль AppArmor, несовместимый с MariaDB. apt-get remove --purge только удаляет профиль, но не деактивирует/выгружает его. Только ручная выгрузка позволяет MariaDB работать без помех со стороны AppArmor.

person quazgar    schedule 06.03.2019
comment
Какая куча дерьма, почему файл /etc/apparmor.d/usr.sbin.mysqld не поставляется с mariadb, если apparmor будет использоваться по умолчанию?! - person Alex Barker; 19.06.2019
comment
Просто нужен sudo su ubuntu 18.10 - person Josh; 17.12.2019
comment
@Josh Вы имеете в виду, что для этих команд вам нужно быть пользователем root? Да, конечно. Но я лично предпочитаю sudo -i ;-) - person quazgar; 18.12.2019
comment
Запуск aa-remove-unknown удалит устаревший профиль. - person davidolrik; 05.05.2020
comment
Кроме того, более поздние версии MariaDB в Ububtu 18.04 поставляются с /etc/apparmor.d/usr.sbin.mysqld (хотя вам все равно нужно запустить aa-remove-unknown) - person davidolrik; 05.05.2020
comment
Для шага 1, если вы используете sudo, измените на: echo "/usr/sbin/mysqld { }" | sudo tee /etc/apparmor.d/usr.sbin.mysqld - person dvlcube; 26.02.2021
comment
@dvlcube Спасибо, я добавил это. - person quazgar; 28.07.2021

Этот последний вариант у меня сработал (от quazgar). У меня установлена ​​Ubuntu 18.10 с MariaDB 10.3.13:

$ echo "/usr/sbin/mysqld { }" > /etc/apparmor.d/usr.sbin.mysqld
$ apparmor_parser -v -R /etc/apparmor.d/usr.sbin.mysqld
$ systemctl restart mariadb

Однако мне пришлось использовать «sudo su», чтобы это сработало.

person Gert Kruger    schedule 11.03.2019
comment
Впоследствии мой Мариадб снова умер. На этот раз мне также пришлось следовать решению, предложенному Дейвом Хиндлом выше. Затем я переустановил Mariadb с помощью диспетчера пакетов Synaptic. После этого sudo systemctl перезапустил mariadb.service. - person Gert Kruger; 31.03.2019

В моем случае переноса mysqld в группу «пожаловаться» было недостаточно (MariaDB 10.1.21, работающая на Ubuntu 16.04). Мне пришлось полностью отключить apparmor для mysqld:

sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ 
sudo service apparmor reload
sudo service mysql restart

Теперь все работает нормально.

person Vincent    schedule 16.02.2017

К вашему сведению:

В моем случае ни решение Винсента, ни Lw Bi точно не сработало, нужны были дополнительные действия.

Отключение профиля через размещение ссылки в /etc/apparmor.d/disable/ просто не сработало, не знаю почему.

С другой стороны, перевод MySQL в режим жалобы не сработал сразу.

:~$ sudo aa-complain /usr/sbin/mysqld

Установка /usr/sbin/mysqld в режим жалобы.

ERROR: /etc/apparmor.d/usr.sbin.mysqld contains no profile

Мне нужно было добавить строки:

/usr/sbin/mysqld {
}

на /etc/apparmor.d/usr.sbin.mysqld, и тогда я мог бы успешно установить его в режим жалоб.

person kerzane    schedule 06.05.2017
comment
Это сработало. Я создал его как /usr/sbin/mysqld {} (без новой строки), и он бросил... не содержит профиля. Поэтому нужна новая строка. - person MarAvFe; 20.01.2020

Длинный вопрос напрасно ... Никогда не слышал об AppArmor, но это была причина. Ответ здесь исправлен Это. Не беспокойтесь об ОШИБКЕ apparmor, профиль не будет существовать.

sudo aa-status показывает, что делает apparmor; что на самом деле имеет принудительную политику, а не то, что просто настроено для жалоб.

sudo apt-get install apparmor-utils добавляет несколько команд, упрощающих работу с профилями apparmor, например...

sudo aa-complain /usr/sbin/mysqld переключает профиль с "принудительного" на жалобу. (aa-enforce возвращает его обратно.)

Как только это сделано, sudo service apparmor reload перезапускает apparmor, и вуаля... sudo /etc/init.d/mysql start работает, и сервер остается в рабочем состоянии.

person Lw Bi    schedule 06.12.2016

Обратите внимание, что с версии 10.1.10 MariaDB использует systemd для запуска службы. Если вы попробовали MYSQLD_STARTUP_TIMEOUT и это не сработало, возможно, вы используете эту или более позднюю версию. Сценарий /etc/init.d/mysql больше не используется, поэтому MYSQLD_STARTUP_TIMEOUT не действует.

Вам нужно найти файл mariadb.service. В нашем случае он не содержал тайм-аута, поэтому использовалось значение по умолчанию для MariaDB. Просто добавь:

Таймаутстартсек = 0

В разделе [Сервис], и он никогда не истечет.

Было бы неплохо создать свой собственный файл конфигурации, содержащий это, чтобы он не был перезаписан при последующих переустановках.

В ubuntu 18.04 этот файл будет отображаться в

/lib/systemd/system/mariadb.service

Поместите свой собственный файл в

/etc/systemd/system/mariadb.service.d

Не забудьте запустить systemctl daemon-reload после добавления тайм-аута где-нибудь (и, возможно, проверьте /var/log/syslog, чтобы увидеть, была ли перезагрузка успешной), иначе ваш тайм-аут будет проигнорирован.

person Dave Hindle    schedule 20.07.2018

Выполните следующие команды:

sudo dpkg --configure -a
sudo service mysql start
person Mahbub    schedule 15.09.2017

Я также столкнулся с той же проблемой. Вам необходимо установить соответствующий тайм-аут в конфигурации systemd для службы mariadb. Ниже решено то же самое для меня. напр. Когда системе требуется SST, запуск службы mariadb может занять много времени, что приведет к тайм-ауту в systemd.

Если вы используете systemd 228 или старше, вы можете выполнить следующее, чтобы установить бесконечный тайм-аут.

sudo tee /etc/systemd/system/mariadb.service.d/timeoutsec.conf <<EOF
[Service]

TimeoutStartSec=0
TimeoutStopSec=0
EOF
sudo systemctl daemon-reload

Другие варианты см. на странице https://mariadb.com/kb/en/systemd/

person Jaguar    schedule 02.03.2020

Вот что сработало для меня:

Коррекция мне не помогла.

$ sudo aa-complain /usr/sbin/mysqld Настройка /usr/sbin/mysqld для режима жалоб.

ОШИБКА: /etc/apparmor.d/usr.sbin.mysqld не содержит профиля, поэтому я отключил профиль (с помощью aa-disable, который кажется эквивалентным решению плутократа)

$ sudo aa-disable /usr/sbin/mysqld Отключение /usr/sbin/mysqld. Я также отключил mysqld-akonadi и mysqld-digikam.

Перезагрузки apparmor не хватило, поэтому пришлось перезагрузиться и mariadb запустился отлично.

Источник: https://askubuntu.com/a/964928/106100

person Meetai.com    schedule 14.02.2019

Решение для меня состояло в том, чтобы запустить следующее:

sudo killall mysqld

Если вы все еще сталкиваетесь с этой проблемой, выполните команду ps -aux | grep 'mysql'. если что-то появится, просто убейте его.

Наконец запустите:

sudo systemctl restart mysql.service
person smac89    schedule 27.03.2020