[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-таблицы по несколько гигабайт. В таком случае стоп сервера происходит долгою Если бд небольшая или время даунтайма не критично, то менее муторно воспользоваться стандартными методами

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

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