Данная статья носит вольный перевод статьи.
И так: идея такая: поднять второй экземпляр mysql, выставить нужный пароль, подменить файлы таблицы user (user.MYD, user.MYI) базы mysql и послать сигнал SIGHUP нашему mysql’ю что бы он заново перечитал grant’ы. Приступим
1) Создаём базу и сразу стартуем её:
[root@machina dbdata]# mkdir datadir
[root@machina dbdata]# chown -R mysql:mysql datadir/
[root@machina dbdata]# mysql_install_db --datadir=/dbdata/datadir/ --user=mysql
Installing MySQL system tables...OK
Filling help tables...OK
[root@machina datadir]# /usr/sbin/mysqld --basedir=/usr --datadir=/dbdata/datadir --plugin-dir=/usr/lib/mysql/plugin --skip-innodb --default-storage-engine=myisam --socket=/var/run/mysqld/mysql2.sock --port=3307 --user=mysql --log-error=/dblogs/log/error2.log --pid-file=/dbdata/data/mysql.pid &
2) Копируем оригинальные файлы user.* из нашей исходной базы:
[root@machina ~]# cp /dbdata/data/mysql/user.* /dbdata/datadir/mysql/cp: overwrite `/dbdata/datadir/mysql/user.frm'? y
cp: overwrite `/dbdata/datadir/mysql/user.MYD'? y
cp: overwrite `/dbdata/datadir/mysql/user.MYI'? y
[root@machina datadir]# mysql --socket=/var/run/mysqld/mysql2.sock -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
3) Делаем flush:
mysql2> flush tables; mysql2> select user, host, password from user where user like 'root'; +------+--------------------------------------+------------------------------------------+ | user | host | password | +------+--------------------------------------+------------------------------------------+ | root | localhost | 696D727429CC43695423FA5F2F0155D92A0AAC08 | | root | 127.0.0.1 | 696D727429CC43695423FA5F2F0155D92A0AAC08 | | root | % | 696D727429CC43695423FA5F2F0155D92A0AAC08 | +------+--------------------------------------+------------------------------------------+ 3 rows in set (0.00 sec)
Обновляем пароль:
mysql2> update mysql.user set password='*696D727429CC43695423FA5F2F0155D92A0AAC08' where user like 'root'; Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0
Проверяем:
mysql2> select user, host, password from user where user like 'root'; +------+--------------------------------------+-------------------------------------------+ | user | host | password | +------+--------------------------------------+-------------------------------------------+ | root | localhost | *696D727429CC43695423FA5F2F0155D92A0AAC08 | | root | 127.0.0.1 | *696D727429CC43695423FA5F2F0155D92A0AAC08 | | root | % | *696D727429CC43695423FA5F2F0155D92A0AAC08 | +------+--------------------------------------+-------------------------------------------+ 3 rows in set (0.00 sec)
Делаем flush:
mysql2> flush privileges; Query OK, 0 rows affected (0.00 sec)
4) Копируем обратно измененённую таблицу:
[root@machina ~]# cd /dbdata/datadir/mysql/
[root@machina mysql]# cp user.* /dbdata/data/mysql/; chown mysql:mysql /dbdata/data/mysql/user.*; chmod 660 /dbdata/data/mysql/user.*
cp: overwrite `/dbdata/data/mysql/user.frm'? y
cp: overwrite `/dbdata/data/mysql/user.MYD'? y
cp: overwrite `/dbdata/data/mysql/user.MYI'? y
и посылаем сигнал SIGHUP
[root@machina datadir]# kill -1 $(/sbin/pidof mysqld)
Один коментар до “[mysql] Сброс пароля root’a без рестарта сервера”
Совет хорош для тех, у кого innodb-таблицы по несколько гигабайт. В таком случае стоп сервера происходит долгою Если бд небольшая или время даунтайма не критично, то менее муторно воспользоваться стандартными методами