Задача вполне ясна и десятки раз описана в других источниках, но я решил сделать руководство для себя на примере Ubuntu 14.04. Начну с наиболее сложного случая — смены забытого пароля root.
Случай 1. Нужно восстановить забытый пароль root.
Входим в систему с правами root. Останавливаем сервер MySQL, если он запущен. Это можно сделать либо командой service:
# service mysql stop
либо командой stop:
# stop mysql
Последняя команда удобна тем, что по двойному табу после stop можно увидеть список запущенных в настоящий момент серверов: если запись mysql среди них отсутствует, то это значит, что сервер MySQL не запущен и останавливать нечего.
Теперь запустим MySQL-сервер в safe-режиме с опцией --skip-grant-tables:
# mysqld_safe --skip-grant-tables &
[1] 2515
# 151111 13:31:50 mysqld_safe Can't log to error log and syslog at the same time. Remove all --log-error configuration options for --syslog to take effect.
151111 13:31:50 mysqld_safe Logging to '/var/log/mysql/error.log'.
151111 13:31:51 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
После нажатия на Enter и появления результатов выполнения команды мы перейдём в режим ожидания, выйти из которого можно повторным нажатием на Enter. Тем самым мы запустим сервер в фоновом режиме (знак амперсанда & в конце строки) и вернёмся в консоль.
В приведённом выше примере сервер ругается, что не может одновременно писать в собственный error.log и syslog. На это можно не обращать внимания, либо указать при запуске опцию --skip-syslog.
Если вы забыли поставить амперсанд в конец строки, то сервер запустится в режиме foreground и повторным нажатием на Enter вы не сможете вернуться в консоль. Для перевода сервера в фоновый режим (background) и возвращения в консоль необходимо нажать Ctrl-Z.
Проверим состояние сервера:
# pgrep -l mysql
2515 mysqld_safe
2875 mysqld
Здесь демон mysqld запущен как дочерний процесс mysqld_safe.
Теперь мы можем подключиться к серверу MySQL под root-ом без пароля:
# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Переходим в базу под названием «mysql», где хранятся данные о всех пользователях:
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
Устанавливаем новый пароль для root, обновляем полномочия и выходим из сеанса:
mysql> update user set password=PASSWORD("xxxxxxxxx") where User='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
Теперь необходимо выйти из режима safe и перезапустить сервер MySQL в обычном режиме. Мне не удалось это сделать традиционными средствами Ubuntu с помощью команд service и stop, поэтому я убивал процессы с помощью терминальных сигналов:
# killall -9 mysqld_safe mysqld
[1]+ Убито mysqld_safe --skip-grant-tables
# start mysql
В заключение отмечу, что root может сменить забытый пароль обычному пользователю аналогичным образом, но для этого достаточно и стандартного режима работы MySQL-сервера.
Случай 2. Пароль пользователя MySQL известен, но его нужно поменять.
Это самый простой случай, для которого, в частности, предусмотрена утилита mysqladmin. Синтаксис однострочной команды по смене текущего пароля пользователя anton следующий:
# mysqladmin -u anton -p current_pass password new_pass
где current_pass — это текущий пароль, а new_pass — новый. При этом пробелы между параметрами авторизации -u/-p и их значениями допускается не ставить, хотя это понижает читабельность:
# mysqladmin -uanton -pcurrent_pass password new_pass
Обратите внимание на то, что принцип работы утилиты mysqladmin построен сперва на аутентификации и авторизации того, кто её вводит (параметры -u и -p), а затем выполнении необходимого действия, в нашем случае password. К сожалению, в интернете много ошибочных примеров её использования именно для смены паролей.