Смена пароля пользователя root в MySQL

#0. Резюме

В данной статье можно найти информацию о том, как восстановить пароль суперпользователя root в mysql. Например, установил mysqld, настроил и благополучно забыл пароль, а через время он понадобился. Ну, или в погоне за безопасностью, добросовестный админ нашёл время сменить пароли, в том числе и от СУБД MySQL.

#1. Пароль root от mysql забыт или потерян

Ситуация, как известно, не новая: потерян пароль root'а от mysql. Естественно, восстановить его практически невозможно, а вот сменить - пара пустяков. Для этого нам потребуется, правда, перезапуск демона mysqld с опцией skip_grant-tables. Для начала выясним, с какими параметрами mysqld работает в штатном режиме.

# ps wwaux | grep mysqld
mysql             220 14,9  3,3 896748 552152 ??  SJ   16:08   38:19,55 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --plugin-dir=/usr/local/lib/mysql/plugin --user=mysql --log-error=/var/db/mysql/isp2.err --pid-file=/var/db/mysql/isp2.pid --socket=/tmp/mysql.sock --port=3306

Строка параметров запуска длинная, но для корректного и стопроцентного запуска необходимо запускать mysqld_safe c этими параметрами + опция skip_grant-tables, которая как раз и позволяет зайти в mysql под любым пользователем без пароля. Приступим.

Останавливаем основной процес mysql-server,

# /usr/local/etc/rc.d/mysql-server stop
# mysqld_safe /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf    \
--basedir=/usr/local --datadir=/var/db/mysql --plugin-dir=/usr/local/lib/mysql/plugin \
--user=mysql --log-error=/var/db/mysql/isp2.err --pid-file=/var/db/mysql/isp2.pid     \
--socket=/tmp/mysql.sock --port=3306 --skip_grant-tables &
# mysql -u root -p
Enter password: <Enter>

Окей, мы в mysql. Используем основную базу данных «mysql», указываем новый пароль для root (your_password ниже), обновляем привилегии и выходим из СУБД.

mysql> use mysql;
mysql> update user set password=password('your_password') where user='root';
mysql> flush privileges;
mysql> quit

Дальше - убиваем процесс mysqld, запускаем штатный экземпляр mysqld из rc-скриптов и проверяем наличие работающего процесса mysqld.

# killall mysqld
# /usr/local/etc/rc.d/mysql-server start
# ps -waux | grep mysql

Ну и всё, логинимся в mysql с новый паролем.

# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 150 to server version: 4.1.20-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> 

Profit!

#2. Пароль root от mysql имеется, но нужно сменить