software-development
September 21

Как сбросить пароль для MySQL в 2025м году

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

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

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

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

Проблема

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

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

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

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

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

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

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

Ресерч

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

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

Решение

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

Действие происходит на обычной Ubuntu:

С начала времен безопасность в 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.

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

А вы говорите ChatGPT и нейросети нас всех заменят, ага.