[mysql] Сброс пароля root’a без рестарта сервера

Данная статья носит вольный перевод статьи.

И так: идея такая: поднять  второй экземпляр 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 без рестарта сервера: 1 комментарий

  1. Александр

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

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

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