16.04 сломал обновление mysql-сервера

127

Мое полное обновление прошло хорошо, но у меня осталась критическая проблема, связанная с тем, что mysql-сервер не смог установить себя, и все, что я пробовал, заставило его работать.

Это ошибка, которую я вижу при попытке установить / переустановить ее:

Setting up mysql-server-5.7 (5.7.11-0ubuntu6) ...
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
invoke-rc.d: initscript mysql, action "start" failed.
dpkg: error processing package mysql-server-5.7 (--configure):
 subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of mysql-server:
 mysql-server depends on mysql-server-5.7; however:
  Package mysql-server-5.7 is not configured yet.

dpkg: error processing package mysql-server (--configure):
 dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
                   Processing triggers for systemd (229-4ubuntu4) ...
Processing triggers for ureadahead (0.100.0-19) ...
Errors were encountered while processing:
 mysql-server-5.7
 mysql-server
E: Sub-process /usr/bin/dpkg returned an error code (1)

Я попытался полностью удалить его, хотя при этом пытался установить MariaDB из-за зависимостей (?). Любые предложения о том, что я могу сделать, чтобы это исправить, были бы очень кстати.

РЕДАКТИРОВАТЬ: Похоже, я не единственный: https://bugs.launchpad.net/ubuntu/+source/mysql-5.7/+bug/1573279

TheGremlyn
источник
У меня такая же проблема здесь .
KernelPanic,
1
Пришлось удалить phpmyadmin, который как-то вызывал проблемы с зависимостями. После переустановки все снова работает нормально.
Хинрих
1
do-release-upgrade с Ubuntu 14 до 16 выполняет неподдерживаемое обновление с MySQL 5.5 до 5.7, поэтому ожидается, что MySQL выйдет из строя после того, как сообщается здесь: bugs.launchpad.net/ubuntu/+source/ubuntu-release-upgrader/ + ошибка /…
Марко Марсала
1
@MarcoMarsala Я не знаю, можем ли мы сказать, что MySQL, как ожидается, будет сломан после обновления Ubuntu с 14 до 16, хотя, полагаю, это зависит от вашей перспективы. Среднестатистическому пользователю, конечно же, не ожидается, что LTS-апгрейд прекратит что-то вроде MySQL. Удивительно, что это не удалось поймать во время тестирования.
TheGremlyn
apt install phpmyadmin --reinstall исправил вышесказанное без необходимости трогать mysql после ... go figure
Энди

Ответы:

119

Отправленные инструкции @ andrew-beerman находятся на правильном пути, хотя они мне не совсем понятны и, похоже, рекомендуют больше, чем необходимо. Я собрал ответ из вышеперечисленного и полезный пост в ветке ошибок.

Вот шаги, которые я предпринял, чтобы исправить это:

  1. Резервное копирование my.cnf fileв систему /etc/mysqlи удалить или переименовать его

    sudo mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
    
  2. Удалить папку /etc/mysql/mysql.conf.d/с помощью

    sudo rm -r /etc/mysql/mysql.conf.d/
    
  3. Убедитесь, что у вас нет my.cnfфайла, спрятанного где-то еще (я сделал это в моем домашнем каталоге!) Или /etc/alternatives/my.cnfиспользуется

    sudo find / -name my.cnf
    
  4. Резервное копирование и удаление /etc/mysql/debian.cnfфайлов (не уверен, если нужно, но на всякий случай)

    sudo mv /etc/mysql/debian.cnf /etc/mysql/debian.cnf.bak
    sudo apt purge mysql-server mysql-server-5.7 mysql-server-core-5.7
    sudo apt install mysql-server
    
  5. В случае, если ваш системный журнал показывает ошибку, такую ​​как «mysqld: Не удается прочитать каталог /etc/mysql/conf.d/», создайте символическую ссылку:

    sudo ln -s /etc/mysql/mysql.conf.d /etc/mysql/conf.d
    

    Тогда служба должна быть в состоянии начать с sudo service mysql start.

Вот и все заработало!

TheGremlyn
источник
17
после всех этих операций (я делал это раньше) у меня все те же проблемы с ошибками ...
Серж
5
Вы должны удалить все my.cnf. * Из каталога / etc / mysql. Ищите my.cnf.backup, my.cnf.fallback и my.cnf.migrated - все эти файлы тоже нужно удалить (сначала
сделайте
8
@SergiiP sudo find / -name "my.cnf"может пригодиться.
starbeamrainbowlabs
1
mysql-server-core- должен быть mysql-server-core-5.7. В противном случае работал как шарм. Спасибо!
Дэвид Тэй
1
+1. Ты сделал мой день! Тоже утром и вечером! Я застрял.
Макс Юдин
56

Сегодня у меня возникла та же проблема, после того, как я попробовал много решений, я обнаружил, что проблема была в команде, sudo systemctl disable mysql.serviceкоторую я использовал, чтобы отключить автоматический запуск MySQL, поэтому, чтобы она sudo systemctl enable mysql.serviceзаработала, я снова включил сервер MySQL, используя команду, и снова запустил процесс обновления и это закончилось отлично.

Наруто Биджу Мод
источник
5
Я столкнулся с той же самой проблемой, и то же самое исправление работало для меня.
Аллен
5
Работал на меня. Сделал все решения здесь, MySQL работал после этого.
Блажей Михалик
6
То же самое здесь - это должен быть главный пост.
буквенно-цифровой
3
У меня тоже сработало! Огромное спасибо. Просто чтобы быть явным, запустите: sudo systemctl enable mysql.serviceи после этого запустите sudo apt install -f.
Фернандо Паладини
Это все, что я должен был сделать. Я отключил автозапуск, как описано @naruto. Я включил автозапуск и запустил «sudo apt upgrade». Сейчас исправлено. Должен быть лучший ответ. Это гораздо более простое, более стандартное и менее подверженное проблемам решение.
Джек Холт
20

Ваше сообщение об ошибке содержит эту строку:

subprocess installed post-installation script returned error exit status 1

Однако это installed post-installation scriptне упоминается по имени. После долгих поворотов я узнал, что его зовут (в моем случае) /var/lib/dpkg/info/mysql-server-5.7.postinst.

Откройте этот файл с помощью sudo vi /var/lib/dpkg/info/mysql-server-5.7.postinstили предпочитаемого вами редактора.

Вверху измените строку 3 (или около того): set -eна set -x, чтобы сохранить файл. (опция -e«выход при ошибках» -xозначает «явно показанная команда выполнена», предположительно)

Выполнить sudo dpkg --configure -a --log /tmp/dpkg.log (опция --log не обязательна). Вы также можете просто запустить, apt upgradeесли знаете, что это будет единственный пакет, который будет обновлен.

Теперь вы получаете подробный вывод mysql-server-5.7.postinstскрипта bash и можете понять, что не так.

В моем случае он безуспешно пытался (повторно) запустить mysql_upgrade, но это не было необходимо для моей индивидуальной установки MySQL. Я был уверен, что запускал его вручную раньше, успешно, и все было хорошо.

Поэтому я закомментировал строку 321 (для более старых выпусков mysqld попробуйте строку 281),

#mysql_upgrade --defaults-file=/etc/mysql/debian.cnf || result=$?

и команда, которая потерпела неудачу раньше, sudo apt upgrade(запустите ее снова), успешно завершилась, и dpkg удалил состояние ошибки для этого пакета.

Теперь вы можете установить обратно set -xк set -e( как упоминалось выше). И, необязательно, раскомментируйте строку mysql-upgrade.

Может потребоваться дополнительная работа, если вы переместили раздел данных MySQL в нестандартное место. Я перенес мой с /var/lib/mysql/dataдругого диска через символическую ссылку. Тогда вам, возможно, придется временно удалить символическую ссылку, до postinstманипулирования скриптом. Затем создайте его заново после запуска обновления пакета.

После следующего незначительного обновления версии пакета mysqld debian эта проблема со /var/lib/dpkg/info/mysql-server-5.7.postinstсценарием может появиться снова.

KNB
источник
В итоге я все очистил, а затем скачал версию mysql-server сообщества и вручную установил отсюда: dev.mysql.com/downloads/mysql
RyanNerd
Точно то же самое случилось со мной, и ваши шаги решили это. Но для меня мой вызов mysql_upgrade был на линии 320. Можете ли вы объяснить, почему он возвращает ненулевое значение при вызове из сценария postinst?
emiliopedrollo
@emiliopedrollo Нет, я не могу здесь объяснить. Но я думаю, что номер строки теперь равен 320, потому что недавно разработчики пакетов дополнили скрипт postinstall, я наблюдал то же самое на днях, во время последнего запуска средства обновления программного обеспечения (которое включало новый пакет mysql-deb-package). ,
knb
Спасибо! С помощью set -eя смог решить точную проблему - у MySQL не было доступа для пользователя системы Ubuntu, указанного в /etc/mysql/debian.cnf . Поэтому я добавил этого пользователя в MySQL и предоставил права, dpkgснова запустился и все заработало!
Аллен Гамильтон
17

Здесь инструкции исправили это на моем сервере: https://bugs.mysql.com/bug.php?id=72722

Я могу понять, как тяжело, когда ваша система находится в несовместимом состоянии, но давайте не будем беспокоиться обо всей ситуации и сделаем шаг за шагом, чтобы привести систему в порядок.

Сначала давайте посмотрим текущее состояние всех пакетов mysql на машине, используя: dpkg -l | grep mysql (пожалуйста, вставьте вывод, исключая последний столбец)

Первый столбец обозначает текущий статус пакета. Вот возможные варианты:

ii) Установлен rc) Удаленные файлы конфигурации сохранены (Это должно быть состояние всех пакетов, которые вы удалили с помощью «apt-get remove», которые не удаляют файлы конфигурации в / etc)

Чтобы это работало, вам нужно будет запустить «apt-get purge <pkg-name>», пока вы не увидите никаких пакетов в приведенном выше списке.

Помните, что некоторые пакеты, не относящиеся к mysql-серверу, такие как python-mysql.connector и python-mysqldb, если они установлены, их не нужно удалять, поскольку они не влияют на эту ситуацию, но их удаление может создать проблемы для приложений, использующих их.

Мы обязательно попытаемся повторно посетить наши документы, чтобы узнать, как мы можем защитить пользователей от этой проблемы. Спасибо, что поделились своим мнением с нами.

Эндрю Биман
источник
2
Спасибо за dpkg -l | grep mysql . Это помогло понять направление.
Макс Юдин
команда была неправильной для очистки, это должно быть, sudo apt-get purge <pkg-name>я исправил это с правкой, но: я использовал символы Unicode для, <потому что иначе это не показывало бы. Будьте предупреждены, скопируйте эту команду
Тоскан
3

В моем случае с помощью strace я увидел, что / var / run / mysqld / не существует и mysqld не может создать файл mysqld.sock.

Эти команды решили мою проблему:

mkdir /var/run/mysqld
chown mysql.mysql /var/run/mysqld
chmod 700 /var/run/mysqld

В настоящее время:

systemctl start mysql

И MySQL снова работает :)

Леонардо Каталинас
источник
Я предлагаю вам добавить эти строки в / usr / share / mysql / mysql-systemd-start, начиная со строки 25, тогда вам не нужно будет воссоздавать этот каталог после каждой перезагрузки (извините, строка возвращается не работает в этом комментарии) : если [ ! -d / run / msyqld]; затем mkdir -p -m0755 / run / mysqld || {echo "Невозможно создать / запустить / mysqld"; выход 1; } chown mysql: mysql / run / mysqld || {echo "Невозможно chown / run / mysqld"; выход 1; } fi
scoobydoo
3

В моем случае я мог бы решить проблему, добавив

# Allow log file access
/home/system/var/log/mysql.err rw,
/home/system/var/log/mysql.log rw,
/home/system/var/log/mysql/ r,
/home/system/var/log/mysql/** rw,

в /etc/apparmor.d/local/usr.sbin.mysqld

Для более подробной информации взгляните на мой ответ (ChristophS) на stackoverflow.

ChristophS
источник
0

Я была такая же проблема. Я пытался переустановить mysql несколько раз, но безуспешно.

Я понял, что проблема для меня заключается в том, что другой процесс mysql уже запущен.

Подробно:

После того как я внимательно прочитал, залогинился /var/log/mysql/error.logи обнаружил:

[ОШИБКА] Не удается запустить сервер: привязка к порту TCP / IP: адрес уже используется

[ОШИБКА] У вас уже есть другой сервер mysqld, работающий на порту: 3306?

Похоже, другое приложение уже использовало порт.

Я проверил это с помощью ps -aux | grep 3306:

$ ps -aux | grep 3306
milkovs+  6802  0.0  0.0  16336  1084 pts/19   S+   21:39   0:00 grep --color=auto 3306
mysql    14706  0.0  0.3 1270192 13916 pts/2   Sl   Aug19   0:29 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=

И я убил запущенный процесс sudo kill -15 14706

Затем я начал MySQL: /etc/init.d/mysql start

Наконец MySQL работает на меня! Надеюсь, это кому-нибудь поможет.

Мильковский
источник
0

Ни один из ответов на этой странице не работал для меня.

В итоге я перешел на страницу загрузок Oracle , скачал mysql-apt-config_0.8.8-1_all.debи установил MySQL из репозитория Oracle:

sudo dpkg -i mysql-apt-config_0.8.8-1_all.deb
sudo apt update
sudo apt install mysql-server
ostrokach
источник
2
isntall-> installопечатка. Глупый ТАК не позволяет мне исправить один символ.
Чаба Тот
Почему вы пошли к оракулу, чтобы загрузить MySQL
Sinscary
@Sinscary Этот ответ уже давно, но, возможно, потому, что у них была более новая версия, чем у менеджера системных пакетов?
острокач
0

У меня возникла проблема на нескольких серверах. Исправлена ​​проблема с запуском apt install phpmyadmin --reinstall

что решило вышеупомянутое (без необходимости трогать mysql впоследствии)

Энди
источник