Как изменить (сбросить) root пароль в MySQL

  • 02.05.2019
  • 63 830
  • 9
  • 28.01.2021
  • 55
  • 53
  • 2
Как изменить (сбросить) root пароль в MySQL

Довольно часто происходит такая ситуация, что пароль для учетной записи root в MySQL необходимо восстановить, поменять или сбросить. Хорошо, если он известен, но бывают случаи, когда пароль был утерян или неизвестен с самого начала. В данной статье пойдет речь о том, как этот пароль восстановить, имея доступ к серверу, на котором запущен mysql-server для обоих случаев, когда пароль о учетной записи root ИЗВЕСТЕН и НЕ ИЗВЕСТЕН.

Как поменять пароль root в MySQL

Если пароль root ИЗВЕСТЕН

Возьмем самую простую ситуацию, когда пароль от учетной записи root вам известен и все что нужно сделать, это просто его поменять. Чтобы задать новый пароль для учетной записи root, необходимо проделать следующие действия:

В том случае, если вы пользуетесь каким-либо веб-интерфейсом, например, phpMyAdmin, то тогда вы можете пропустить пункт 1 и сразу же выполнить запрос для нужной версии MySQL (пункт 2) прямо из интерфейса phpMyAdmin (вкладка SQL).

1) Подключаемся в консоль MySQL сервера с правами root (не забываем ввести пароль, после появления соответствующего запроса):

mysql -u root -p

2) Меняем пароль для пользователя root:

Для MySQL версий 5.7.6 и новее (5.7.7, 5.7.8...)

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

Для MySQL версий 5.7.5 и старее (5.7.4, 5.7.3...)

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NEW_PASSWORD');

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

Query OK, 0 rows affected (0.01 sec)

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

UPDATE mysql.user SET authentication_string=PASSWORD('NEW_PASSWORD'), plugin='mysql_native_password' WHERE User='root';

В результате выполнения данной команды, мы должны получить вот такой вывод в консоли:

Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

3) Перезагружаем привилегии, чтобы изменения вступили в силу:

flush privileges;

4) Для выхода из консоли MySQL сервера выполняем команду выхода:

exit;

После этого, пароль должен поменяться.

Если пароль root НЕ ИЗВЕСТЕН

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

1) Останавливаем mysqld:

sudo service mysql stop

2) Проверяем, что нет запущенных процессов mysqld:

ps -eaf|grep mysqld

Если все нормально, то вывод команды должен состоять лишь из одной строки, примерно такого содержания:

root     24902  1530  0 11:41 pts/0    00:00:00 grep --color=auto mysqld

3) Создаем каталог /var/run/mysqld для запуска mysqld в safe режиме из консоли

sudo mkdir /var/run/mysqld

4) Делаем владельцем данного каталога пользователя mysql (чтобы не было проблем с правами)

sudo chown mysql /var/run/mysqld

5) Запускаем MySQL в ручном режиме из консоли, пропуская проверку прав (опция --skip-grant-tables). А также отключаем доступ к серверу через TCP/IP (с помощью опции --skip-networking), чтобы злоумышленник не мог воспользоваться тем, что мы отключили проверку прав пользователей. При использовании данной опции, доступ к серверу становится возможным только через localhost.

sudo mysqld_safe --skip-grant-tables --skip-networking &

В случае успешного запуска, вывод в консоли должен быть примерно таким:

# sudo mysqld_safe --skip-grant-tables --skip-networking &
[1] 26152
2019-05-02T14:17:14.807620Z mysqld_safe Logging to syslog.
2019-05-02T14:17:14.815041Z mysqld_safe Logging to '/var/log/mysql/error.log'.
2019-05-02T14:17:14.856418Z mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

6) Подключаемся из консоли к серверу mysqld и выбираем базу данных mysql:

mysql -u root mysql

7) Используем плагин mysql_native_password, иначе в некоторых случаях будем получать ошибку "ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded", а нам это не нужно:

update user set plugin="mysql_native_password";

Вывод в результате выполнения данной команды должен быть примерно таким:

Query OK, 0 rows affected (0.00 sec)
Rows matched: 4 Changed: 0 Warnings: 0

8) Перезагружаем привилегии:

flush privileges;

9) Меняем пароль для нужного пользователя, в нашем случае это root:

Для MySQL версий 5.7.6 и новее (5.7.7, 5.7.8...)

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

Для MySQL версий 5.7.5 и старее (5.7.4, 5.7.3...)

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NEW_PASSWORD');

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

Query OK, 0 rows affected (0.01 sec)

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

UPDATE mysql.user SET authentication_string=PASSWORD('NEW_PASSWORD'), plugin='mysql_native_password' WHERE User='root';

В результате выполнения данной команды, мы должны получить вот такой вывод в консоли:

Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

9) После чего, вводим команду exit для отключения:

exit;

10) Выключаем запущенный в ручном режиме Mysqld сервер:

sudo mysqladmin -S /var/run/mysqld/mysqld.sock shutdown

Если все пройдет успешно, то вывод должен быть примерно таким:

2019-05-02T14:30:03.404615Z mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
[1]+  Done                    sudo mysqld_safe --skip-grant-tables --skip-networking

Если же команда не сработала и вы получаете вот такую (или любую другую) ошибку:

mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'

То можно принудительно завершить процесс с помощью следующей команды:

sudo kill `cat /var/run/mysqld/mysqld.pid`

11) Проверяем, что нет запущенных процессов mysqld:

ps -eaf|grep mysqld

Если все нормально, то вывод команды должен состоять лишь из одной строки, примерно такого содержания:

root     24902  1530  0 11:41 pts/0    00:00:00 grep --color=auto mysqld

12) Запускаем Mysql-server в нормальном режиме:

sudo service mysql start

И пытаемся подключиться к нашему серверу с новым паролем, который мы установили.

Была ли эта статья Вам полезна?

Комментарии к статье (9)

    • Гость

    Не чего не помогло

    • Виталий

    правильная команда в 10 пункте:
    $ sudo mysqladmin -S /var/run/mysqld/mysqld.sock -p shutdown
    Вводите пароль от пользователя root и всё ок

    • Виталий

    Не работают команды из 10 пункта, процессы так и висят:
    $ sudo mysqladmin -S /var/run/mysqld/mysqld.sock shutdown
    mysqladmin: connect to server at 'localhost' failed
    error: 'Access denied for user 'root'@'localhost' (using password: NO)'
    $ sudo kill `cat /var/run/mysqld/mysqld.pid`
    cat: /var/run/mysqld/mysqld.pid: Нет такого файла или каталога
    $ ps -eaf|grep mysqld
    root 49072 3473 0 21:46 pts/1 00:00:00 sudo mysqld_safe --skip-grant-tables --skip-networking
    root 49073 49072 0 21:46 pts/1 00:00:00 /bin/sh /usr/bin/mysqld_safe --skip-grant-tables --skip-networking
    mysql 49245 49073 1 21:46 pts/1 00:00:02 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=/var/log/mysql/error.log --pid-file=vitaliti.pid
    vitaliti 49357 3473 0 21:49 pts/1 00:00:00 grep --color=auto mysqld

      • Николай

      kill $(ps aux | grep '[m]ysql' | awk '{print $2}')

      этой командой грохнул процессы

    • Bakhman

    Спасибо, ваша статья была очень полезна!

    • Гость

    Operation ALTER USER failed for 'root'@'localhost'
    Выдаётся такая ошибка на стадии 9

      • AJIekceu4

      Какая версия Mysql у вас? Альтернативный вариант пробовали?

      SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NEW_PASSWORD');

      Или

      UPDATE mysql.user SET authentication_string=PASSWORD('NEW_PASSWORD'), plugin='mysql_native_password' WHERE User='root';
    • Дмитрий

    Созданный каталог /var/run/mysqld не нужно удалять?

      • AJIekceu4

      Как вам будет удобно. Я бы удалил, если изначально его не было и пришлось данную директорию создавать. Но насколько я понимаю он ни на что не будет влиять при запуске mysqld как обычно, а не через командную строку.

Добавить комментарий для Дмитрий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Напоминаем Вам, что Ваше сообщение будет опубликовано только после проверки администратором сайта. Обычно это занимает 1-2 рабочих дня.