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

Да, я прекрасно понимаю что после статей про кросс‑компиляцию FreeBSD→CP/M или разработку на Java без всего мягко говоря странно писать на столь обывательскую тему, благо говностатей в интернете, рассказывающих как сбросить этот проклятый пароль навалом.

Но только все они.. ныне не работают.

Вот такие дела, обратная совместимость ныне не в чести даже у столь известных и популярных проектов как MySQL.

Проблема

Как нетрудно догадаться, автор занимается разработкой ПО, поэтому у него регулярно на рабочих машинах появляются самые разные базы данных.

Чаще всего это PostgreSQL, но пара проектов потребовала когда-то установки MySQL, что я и сделал, развернув стандартный MySQL Server из пакетов в одной из рабочих машин на Ubuntu Linux.

И про него успешно забыл.

Прошел год, затем другой, Ubuntu все это время обновлялась, как и MySQL сервер.

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

Открыл консоль и попытался подключиться стандартным клиентом:

Да, я самым банальным образом забыл пароль пользователя root, который в MySQL до сих пор отвечает за полный доступ и имеет все права.

Ресерч

Беглый поиск в интернете (это теперь практически тоже самое что и запрос к нейросетям) выдал кучу однотипных статей разных лет, не учитывающих современные реалии:

Думаю будет нетрудно догадаться, что проект MySQL развивается и за 12 лет успело многое поменяться, поэтому AI-выдача также показала логически верный, технически правильный но неработающий ответ:

Решение

Итак, речь в статье пойдет про 8.4 версию оригинального MySQL, выпускаемого ныне корпорацией Oracle, не про его форк MariaDB:

Действие происходит на вполне обыденной Ubuntu, а не какой-нибудь OpenBSD:

Так что свалить все описываемые проблемы на специфику окружения не получится.

С начала времен безопасность в MySQL была предметом шуток и анекдотов, поскольку всегда была отключаемой.

Так что вся эта проблема со сбросом пароля в MySQL — сама по себе тянет на хороший анекдот.

Собственно эта команда (скрипт — см. ниже) как раз и отвечала за запуск движка СУБД без авторизации и прав:

mysqld_safe --skip-grant-tables --skip-networking 

Но только в новых версиях MySQL есть нюанс:

mysqld_safe это на самом деле шелл-скрипт, который использует каталог /var/run/mysqld, которого внезапно при обычном использовании MySQL-сервера не создается.

Без этого каталога mysqld_safe не запустится, выдав что-то типа такого:

mysqld_safe --skip-grant-tables --skip-networking
2025-09-20T15:28:00.145945Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2025-09-20T15:28:00.148210Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.

Так что каталог придется создать:

mkdir -p /var/run/mysqld

Но и это тоже еще не все, при попытке запуска mysqld_safe банально упадет:

mysqld_safe --skip-grant-tables --skip-networking  
2025-09-20T15:30:10.637905Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2025-09-20T15:30:10.658364Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
2025-09-20T15:30:13.317240Z mysqld_safe mysqld from pid file /var/lib/mysql/ubunchu.pid ended

Как уже было отмечено выше, mysqld_safe это скрипт, который запускает настоящий бинарник (приложение) сервера MySQL и контролирует его состояние.

И запускает процесс mysqld он (какой сюрпиз) не от текущего пользователя а от выделенного пользователя mysql, у которого прав на этот каталог по-умолчанию нет.

Так что выдаем права:

сhown mysql /var/run/mysqld/

Теперь наконец mysqld_safe запустится:

mysqld_safe --skip-grant-tables --skip-networking 
2025-09-20T15:33:31.905740Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2025-09-20T15:33:31.925688Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

И даже можно подключиться клиентом:

Но едем дальше.

По классике пароль в MySQL сбрасывается с помощью такого SQL-запроса:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

Именно этот вариант вам подскажет любимая нейросеть:

Но только на практике оно больше не работает:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded

А работает вот так:

use mysql;
update user set authentication_string='' where User='root';
update user set plugin="mysql_native_password" where User='root'; 
FLUSH PRIVILEGES;

Теперь наконец грохаем процессы mysql, поскольку по-другому остановить mysqld_safe не выйдет:

pkill -9 mysql

И включаем поддержку этих самых native_password (хотя-бы временно):

echo mysql_native_password=ON >> /etc/mysql/mysql.conf.d/mysqld.cnf

Теперь наконец можно запустить MySQL-сервер в штатном режиме:

systemctl start mysql

Процесс mysqld должен быть виден в списке запущенных, а статус сервиса должен выглядеть как-то так:

Теперь должно проходить подключение с помощью консольного клиента с пустым паролем:

Разумеется решение временное, поэтому дальше надо запустить скрипт mysql_secure_installation и с его помощью закончить настройку, в том числе задав новый пароль root и отключив поддержку native_password.

Вот такие дела.

Эпилог

Я бы не стал заморачиваться и тащить эту статью на Хабр, если бы не одно важное «но»:

то что вы прочитали выше — яркая иллюстрация разницы между теорией и практикой.

Самый популярный дистрибутив Linux, одна из самых популярных СУБД на планете, с долгой историей использования, еще и поддерживаемая мировой корпорацией и вот такой плачевный результат.

Если вы думали, будто ИИ способен решать проблемы в ИТ и достаточно лишь следовать его рекомендациям — статья выше это яркая иллюстрация обратного.

Добавлю, что все крупные поисковые системы уже реализовали блок выдачи ответов ИИ, но за все время использования я ни разу не встречал в выдаче ни одного работающего ответа.

Все что выдает ИИ во всех случаях является синтаксически верным, технически грамотным.. полностью неработающим бредом, к великому разочарованию.

Почему так происходит думаю лучше ответят специалисты по ИИ, но коль даже мировые корпорации до сих пор не могут заставить это работать — есть ли смысл полагаться на выдачу ИИ вам?

P.S.

Оригинал как обычно в нашем блоге, копия статьи на Дзене.

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

Комментарии (0)


  1. Akina
    23.09.2025 13:33

    то что вы прочитали выше — яркая иллюстрация разницы между теорией и практикой

    То, что я прочитал выше, уж извините за мой французский, но явная демонстрация избыточной кривизны рук. Знаете такую поговорку: "Если ничего не помогает, попробуйте почитать инструкцию."? Так вот - она для вас. И прочих специалистов, которые вместо чтения официальной документации бегут консультироваться к гуглу или чатГПТ, а потом страшно удивляются, что предложенные оттуда советы - не работают.

    MySQL 8.4 Reference Manual  /  ...  /  How to Reset the Root Password

    If you assigned a root password previously but have forgotten it, you can assign a new password. The following sections provide instructions for Windows and Unix and Unix-like systems, as well as generic instructions that apply to any system.

    Специальная статья для забывчивых, именно для MySQL версии 8.4. И на этой странице в принципе нет даже такого слова, как mysqld_safe, который существует для совершенно иных целей и решает совсем другие задачи, зато есть несколько способов выполнения задачи. Берите любой.

    Я обычно рекомендую последний вариант - "Generic Instructions". Основной его плюс - не требуется создания файла с запросом на установку нового пароля, и не возникает связанных вопросов о правах доступа к такому файлу. Требуется только штатный клиент командной строки.


    1. alex0x08 Автор
      23.09.2025 13:33

      Как интересно, скажите пожалуйста - а вы лично пробовали?


      1. Akina
        23.09.2025 13:33

        Конечно. Работает как из пушки. Крайний раз - вчера, на версии 8.4.2 MySQL Community Server - GPL.


      1. igorsimdyanov
        23.09.2025 13:33

        Да там в конце собственно ваше решение и описано (только ссылка сбоит). У вас более детальная и пошаговая история.


  1. igorsimdyanov
    23.09.2025 13:33

    Если речь идет о свежей ubuntu, то есть еще /etc/mysql/debian.cnf, в котором есть в открытом виде пароль от debian-sys-maint (и он с админскими правами, из под него собственно базы разворачиваются при инсталляции и обновлении). Но если и его потеряли, то да, остается только --skip-grant-tables --skip-networking


    1. alex0x08 Автор
      23.09.2025 13:33

      Видимо это MySQL, который используется Gnome/KDE, либо какая-то специфика новых инсталляций Ubuntu, тк у меня этого конфига нет.


      1. Akina
        23.09.2025 13:33

        У MySQL есть несколько разных местоположений, из которых выполняется загрузка файлов настройки. См. Using Option Files. При старте просматриваются все эти местоположения, и загружаются все найденные там файлы опций, если иное не задано параметрами командной строки запуска сервиса. Отсутствие файлов в некоторых из таких местоположений, и даже самих каталогов - это нормально и штатно. Иногда даже мне попадался совет - если хотите предсказуемого поведения своего сервера, запрещайте в опциях командной строки загрузку всех настроечных файлов, кроме одного, правильного.

        Сомневаюсь, что авторы Gnome/KDE пошли на форканье или допиливание MySQL - вот оно им надо?


        1. alex0x08 Автор
          23.09.2025 13:33

          А вы не сомневайтесь а посмотрите состав пакета, насколько мне известно там MySQL но в embedded варианте, те запускаемый полностью программно.



      1. andreymal
        23.09.2025 13:33

        Файл debian.cnf создаётся пакетом mysql-server (или пакетом mysql-server-8.0 в более старых убунтах)