Статьи

Восстановление корневого пароля MySQL без перезапуска MySQL (без простоя!)

Первоначально Написал Даниэль Гусман Бургос

Отказ от ответственности: Делайте это на свой страх и риск! Он не применяется, если вы используете подключаемую аутентификацию, и, конечно, не будет использоваться, если / когда системные таблицы MySQL хранятся в InnoDB

Восстановите свой пароль root с осторожностью!

Восстановите свой пароль root с осторожностью!

Что за ситуация?

Ситуация классическая: «необходимо восстановить пароль root для MySQL», но вы не можете перезапустить MySQL (потому что это главный производственный сервер или по любой другой причине), что делает решение –skip-grant-tables возможностью без запрета .

 Что я могу сделать?

Существует обходной путь, который заключается в следующем:

  •  Запустите еще один экземпляр mysqld, маленький (без innodb).
  •  Скопируйте пользовательские файлы. [Frm | MYD | MYI] из исходного каталога данных в каталог данных нового экземпляра.
  • Измените их, а затем скопируйте их обратно в исходное местоположение.

Так просто? Нет, но близко. Вот шаг за шагом:

Пошаговое восстановление

  1. Создайте новый каталог данных и запустите mysql_install_db для нового каталога данных. Этот будет удален в конце. Не забудьте сменить владельца на пользователя и группу mysql:
    [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
  2. Запустите новый экземпляр. Будьте осторожны с путем к datadir, файлу сокета и номеру порта. Кроме того, отключите InnoDB, он вам не понадобится, просто добавьте –skip- innodb И –default-storage-engine = myisam :
    [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 &
  3. Скопируйте файлы user. * Из исходного экземпляра mysql (те, которые вам нужно изменить) в каталог данных нового экземпляра и войдите в этот экземпляр mysql:
    [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.
  4. Выполните команду «сбросить таблицы», чтобы пользовательская таблица была «открыта», и вы могли увидеть данные и проверить:
    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)
  5. Теперь обновите поле пароля с желаемым значением:
    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
  6. Проверьте еще раз:
    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)
  7. Сбросьте привилегии и убедитесь, что новый пароль правильный, войдя снова:
    mysql2> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
  8. Теперь, когда мы внесли изменения, мы можем переместить файлы user. * В исходное местоположение, очень внимательно следя за владельцем и привилегиями:
    [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
  9. В этот момент вы можете закрыть новый экземпляр mysql, поскольку он больше не нужен. Будьте очень, очень осторожны, чтобы не закрывать свой исходный mysqld! :
    [root@machina datadir]# mysqladmin --socket=/var/run/mysqld/mysql2.sock -p shutdown
    Enter password:
    141120 06:59:14 mysqld_safe mysqld from pid file /dbdata/data/mysql.pid ended
  10. Теперь последний шаг — выполнить «PRIVILEGES FLUSH» в исходном mysqld. Поскольку мы пока не можем получить к нему доступ, нам нужно отправить сигнал SIGHUP в mysqld. MySQL реагирует на этот сигнал , перезагружая таблицы грантов и таблицы очистки, журналы, кэш потоков и кэш хоста, поэтому мудро выбирайте момент дня, когда вы хотите отправить SIGHUP, поскольку производительность может снизиться (см. « сбросить таблицы » ). Способ отправки SIGHUP — выполнить команду« kill »с флагом -1:
    [root@machina datadir]# kill -1 $(/sbin/pidof mysqld)
  11. Наконец, войдите в MySQL как root !:
    [root@machina datadir]# mysql -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 101208
    mysql1> select user, host, password from mysql.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)

    Вы можете увидеть свои схемы? конечно вы можете! ваши базы данных в порядке!

    mysql1> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | percona            |
    | testing            |
    +--------------------+
    4 rows in set (0.03 sec)

Мы успешно восстановили пароль root для MySQL без необходимости перезапуска MySQL и, таким образом, избежания простоя.

Я надеюсь, что вы никогда не сталкивались с такой ситуацией, но в этом случае есть обходной путь для восстановления вашего доступа! Есть ли другой способ сделать это?

Поделитесь им с миром!