Первоначально Написал Даниэль Гусман Бургос
Отказ от ответственности: Делайте это на свой страх и риск! Он не применяется, если вы используете подключаемую аутентификацию, и, конечно, не будет использоваться, если / когда системные таблицы MySQL хранятся в InnoDB
Восстановите свой пароль root с осторожностью!
Что за ситуация?
Ситуация классическая: «необходимо восстановить пароль root для MySQL», но вы не можете перезапустить MySQL (потому что это главный производственный сервер или по любой другой причине), что делает решение –skip-grant-tables возможностью без запрета .
Что я могу сделать?
Существует обходной путь, который заключается в следующем:
- Запустите еще один экземпляр mysqld, маленький (без innodb).
- Скопируйте пользовательские файлы. [Frm | MYD | MYI] из исходного каталога данных в каталог данных нового экземпляра.
- Измените их, а затем скопируйте их обратно в исходное местоположение.
Так просто? Нет, но близко. Вот шаг за шагом:
Пошаговое восстановление
- Создайте новый каталог данных и запустите 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
- Запустите новый экземпляр. Будьте осторожны с путем к 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 &
- Скопируйте файлы 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.
- Выполните команду «сбросить таблицы», чтобы пользовательская таблица была «открыта», и вы могли увидеть данные и проверить:
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)
- Сбросьте привилегии и убедитесь, что новый пароль правильный, войдя снова:
mysql2> flush privileges; Query OK, 0 rows affected (0.00 sec)
- Теперь, когда мы внесли изменения, мы можем переместить файлы 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
- В этот момент вы можете закрыть новый экземпляр 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
- Теперь последний шаг — выполнить «PRIVILEGES FLUSH» в исходном mysqld. Поскольку мы пока не можем получить к нему доступ, нам нужно отправить сигнал SIGHUP в mysqld. MySQL реагирует на этот сигнал , перезагружая таблицы грантов и таблицы очистки, журналы, кэш потоков и кэш хоста, поэтому мудро выбирайте момент дня, когда вы хотите отправить SIGHUP, поскольку производительность может снизиться (см. « сбросить таблицы » ). Способ отправки SIGHUP — выполнить команду« kill »с флагом -1:
[root@machina datadir]# kill -1 $(/sbin/pidof mysqld)
- Наконец, войдите в 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 и, таким образом, избежания простоя.
Я надеюсь, что вы никогда не сталкивались с такой ситуацией, но в этом случае есть обходной путь для восстановления вашего доступа! Есть ли другой способ сделать это?
Поделитесь им с миром!