- Подробности
-
Категория: PHP. Базы данных
FAQ по восстановлению забытого пароля администратора в MySQL
В данной статье описывается что делать если вы забыли администраторский пароль или случайно удалили самого root-пользователя. Статья ориентирована в первую очередь на новичков, поэтому описание всех действий изложено очень подробно, однако материал может оказаться небезынтересен и для более опытных пользователей.
Как восстановить забытый пароль администратора?
Пароли хранятся в базе в зашифрованном виде, поэтому восстановить забытый пароль нельзя, однако можно установить новый. Для этого нужно:
1. Перезапустить сервер в режиме --skip-grant-tables
2. Установить новый пароль администратора
3. Перезапустить сервер в обычном режиме
Теперь подробнее о каждом пункте. В режиме skip-grant-tables отключена проверка прав доступа и привилегий, иными словами, вы можете подключиться с пустыми логин/пароль и будете обладать при этом всеми возможными привилегиями.
Примечание. Обратите внимание, что другие пользователи, подключившие до выполнения вами команды FLUSH PRIVILEGES; или перезагрузки сервера в обычном режиме, также будут обладать администраторскими правами.
MySQL сервер хранит информацию о привилегиях в таблицах привилегий служебной базы mysql. При старте сервера, содержимое таблиц привилегий загружается в память и в дальнейшей работе используется копия, находящаяся в памяти. Команда FLUSH PRIVILEGES; обновляет данные о привилегиях, загруженные в память. Таким образом, данная команда отменяет режим skip-grant-table и включает проверку прав доступа и привилегий.
Примечание. Обратите внимание, что если вы напрямую редактируете содержимое таблиц привилегий базы mysql, с помощью команд INSERT, UPDATE, DELETE, то изменения сразу не вступят в силу, так как информация о пользовательских привелегиях, загруженная в память, останется неизменной.
Если использовать рекомендованные команды типа GRANT или SET PASSWORD, то изменения вступят в силу незамедлительно.
Примечание. Обратите внимание, что изменение прав пользователей не распространяется на уже установленные соединения пользователей. Если нужно отнять у кого-то права, то после следует убедиться, что он не подключен к серверу (с помощью SHOW FULL PROCESSLIST), а если подключен, то убить его поток (оператором KILL).
Для запуска сервера в режиме skip-grant-tables проще всего временно добавить строчку skip-grant-tables в my.ini (для ОС Linux файл будет называться my.cnf) в секции [mysqld]
[mysqld]
skip-grant-tables
другие параметры
Затем перезапустить сервер.
Дальнейшие действия будут зависеть от используемого вами клиента:
SET PASSWORD for root@localhost=password('mypassword');
Как восстановить root-пользователя?
Если root-пользователь (пользователь, обладающий всеми возможными прривилегиями, как правило имеет имя root) был по неосторожности удален, то последовательность действий аналогична предыдущему разделу за исключением того, что вместо назначения пароля необходимо будет создать root-пользователя. Т.е. в режиме skip-grant-tables в зависимости от используемого вами клиента действуем одним из нижеследующих способов:
1.
FLUSH PRIVILEGES;
Затем добавляем root-пользователя с помощью команды GRANT
GRANT ALL TO *.* ON `root`@`localhost` IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
2. Создаем root-пользователя путем прямого добавления записи в таблицу mysql.user. Обратите внимание, что структура таблицы mysql.user в разных версиях различна. Перед добавлением изучите её с помощью команд SHOW CREATE TABLE или DESCRIBE. Например, для версии 5.1.21-beta-community добавление root-пользователя производится следующей командой:
INSERT INTO mysql.user
(Host,User,Password,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,
Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,
Alter_priv,Show_db_priv,Super_priv,Create_tmp_table_priv,Lock_tables_priv,Execute_priv,
Repl_slave_priv,Repl_client_priv,Create_view_priv,Show_view_priv,Create_routine_priv,
Alter_routine_priv,Create_user_priv,Event_priv,Trigger_priv,ssl_type,ssl_cipher,x509_issuer,
x509_subject,max_questions,max_updates,max_connections,max_user_connections)
VALUES('localhost','root',password('mypassword'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
Распространенные случаи.
Ошибка (1045 Access denied for user 'root'@'localhost' (USING password: No)) означает, что подключение производится с пустым паролем.
В MySQL пользователь характеризуется двумя параметрами: именем и хостом, с которого он может обращаться, т.е. user@x и user@y - это разные пользователи. Для удобства записи в MySQL используются квантификаторы, например, % на месте хоста означает любую машину кроме локальной.
Если при доступе под рутом с удаленной машины вы получаете ошибку (1045 Acces denied for user 'root'@'%'), то это может оказаться следствием того, что в настройках по умолчанию удаленный root-пользователь оказался не совсем "рутом", т.е. не обладает всеми привилегиями. Для проверки нужно (под настоящим "рутом") сравнить результат выполнения команд:
SHOW GRANTS for root@localhost;
И при необходимости добавить недостающие привилегии пользователю root@'%' с помощью команды GRANT. Если необходимо владеть привилегиями администратора при соединении с удаленной машины, то рекомендуем, в целях безопасности, называть такого пользователя другим именем (не root).
В официальной документации описан оригинальный способ восстановления администраторского пароля. Подробнее см. http://dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html