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

Да, я прекрасно понимаю что после статей про кросс‑компиляцию 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)
igorsimdyanov
23.09.2025 13:33Если речь идет о свежей ubuntu, то есть еще /etc/mysql/debian.cnf, в котором есть в открытом виде пароль от debian-sys-maint (и он с админскими правами, из под него собственно базы разворачиваются при инсталляции и обновлении). Но если и его потеряли, то да, остается только
--skip-grant-tables --skip-networking
alex0x08 Автор
23.09.2025 13:33Видимо это MySQL, который используется Gnome/KDE, либо какая-то специфика новых инсталляций Ubuntu, тк у меня этого конфига нет.
Akina
23.09.2025 13:33У MySQL есть несколько разных местоположений, из которых выполняется загрузка файлов настройки. См. Using Option Files. При старте просматриваются все эти местоположения, и загружаются все найденные там файлы опций, если иное не задано параметрами командной строки запуска сервиса. Отсутствие файлов в некоторых из таких местоположений, и даже самих каталогов - это нормально и штатно. Иногда даже мне попадался совет - если хотите предсказуемого поведения своего сервера, запрещайте в опциях командной строки загрузку всех настроечных файлов, кроме одного, правильного.
Сомневаюсь, что авторы Gnome/KDE пошли на форканье или допиливание MySQL - вот оно им надо?
alex0x08 Автор
23.09.2025 13:33А вы не сомневайтесь а посмотрите состав пакета, насколько мне известно там MySQL но в embedded варианте, те запускаемый полностью программно.
andreymal
23.09.2025 13:33Файл debian.cnf создаётся пакетом mysql-server (или пакетом mysql-server-8.0 в более старых убунтах)
Akina
То, что я прочитал выше, уж извините за мой французский, но явная демонстрация избыточной кривизны рук. Знаете такую поговорку: "Если ничего не помогает, попробуйте почитать инструкцию."? Так вот - она для вас. И прочих специалистов, которые вместо чтения официальной документации бегут консультироваться к гуглу или чатГПТ, а потом страшно удивляются, что предложенные оттуда советы - не работают.
MySQL 8.4 Reference Manual / ... / How to Reset the Root Password
Специальная статья для забывчивых, именно для MySQL версии 8.4. И на этой странице в принципе нет даже такого слова, как
mysqld_safe
, который существует для совершенно иных целей и решает совсем другие задачи, зато есть несколько способов выполнения задачи. Берите любой.Я обычно рекомендую последний вариант - "Generic Instructions". Основной его плюс - не требуется создания файла с запросом на установку нового пароля, и не возникает связанных вопросов о правах доступа к такому файлу. Требуется только штатный клиент командной строки.
alex0x08 Автор
Как интересно, скажите пожалуйста - а вы лично пробовали?
Akina
Конечно. Работает как из пушки. Крайний раз - вчера, на версии 8.4.2 MySQL Community Server - GPL.
igorsimdyanov
Да там в конце собственно ваше решение и описано (только ссылка сбоит). У вас более детальная и пошаговая история.