Доступ запрещен для пользователя 'root' @ 'localhost' при попытке предоставить привилегии. Как я могу предоставить привилегии?
Я посмотрел на ряд подобных вопросов, и поэтому я демонстрирую, что я проверил основы. Хотя, конечно, это не значит, что я не пропустил что-то совершенно очевидное. : -)
мой вопрос: почему мне отказано в доступе к пользователю с привилегиями делать то, что я пытаюсь сделать, и где я уже набрал пароль и получил доступ? (Для полноты картины я попытался ввести неправильный пароль, чтобы убедиться, что клиент MySQL откажет мне доступ при запуске программы.)
Справочная информация:
вошел в оболочку машины, на которой работает сервер MySQL через ssh, я вошел в систему как root:
[myname@host ~]$ mysql -u root -p -hlocalhost
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 62396
Server version: 5.5.18-log MySQL Community Server (GPL)
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>
потрясающе. Мое чтение ответов на подобные вопросы предполагает, что я должен убедиться, что привилегии актуальны с тем, что находится в таблицах грантов
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql>
далее убедитесь, что я тот, кто я думаю, что я:
mysql> SELECT user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
...и действительно действительно сделать конечно:
mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql>
пока все хорошо. Какие у меня теперь привилегии?
mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '[OBSCURED]' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
теперь это немного трудно читать, поэтому давайте попробуем этот способ (вы также увидите, что есть нелокальный пользователь root):
mysql> SELECT * FROM mysql.user WHERE User='root'G
*************************** 1. row ***************************
Host: localhost
User: root
Password: *[OBSCURED]
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
*************************** 2. row ***************************
Host: [HOSTNAME].com
User: root
Password: *[OBSCURED]
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
2 rows in set (0.00 sec)
потрясающе! MySQL думает, что я root@localhost и root@localhost имеет все эти привилегии. Это значит, что я должен уметь делать то, что хочу, верно?
mysql> GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
как я мог испортить что-то такое основные?
Примечание: Для тех, кто хочет предложить, чтобы у меня не было пользователя с именем root со всеми привилегиями, это здорово, и я подумаю о том, чтобы сделать это, как только я смогу дать другому пользователю некоторые привилегии.
спасибо!
12 ответов:
обратите внимание, как вывод
SHOW GRANTS FOR 'root'@'localhost';не сказал "все привилегии", но должен был объяснить, что root@localhost имеет.
предоставить все привилегии не удастся, потому что пользователь не может предоставить то, чего у него нет, и сервер, кажется, думает, что что-то здесь не так ...
теперь, чего не хватает тогда ?
в моей системе, я получаю это:
mysql> select version(); +------------+ | version() | +------------+ | 5.5.21-log | +------------+ 1 row in set (0.00 sec) mysql> SHOW GRANTS FOR 'root'@'localhost'; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM mysql.user WHERE User='root' and Host='localhost'\G *************************** 1. row *************************** Host: localhost User: root Password: Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Reload_priv: Y Shutdown_priv: Y Process_priv: Y File_priv: Y Grant_priv: Y References_priv: Y Index_priv: Y Alter_priv: Y Show_db_priv: Y Super_priv: Y Create_tmp_table_priv: Y Lock_tables_priv: Y Execute_priv: Y Repl_slave_priv: Y Repl_client_priv: Y Create_view_priv: Y Show_view_priv: Y Create_routine_priv: Y Alter_routine_priv: Y Create_user_priv: Y Event_priv: Y Trigger_priv: Y Create_tablespace_priv: Y <----------------------------- new column in 5.5 ssl_type: ssl_cipher: x509_issuer: x509_subject: max_questions: 0 max_updates: 0 max_connections: 0 max_user_connections: 0 plugin: <------------------------------- new column in 5.5 authentication_string: <------------------------------- new column in 5.5 1 row in set (0.00 sec)есть также новые таблицы в 5.5, такие как mysql.proxies_user: убедитесь, что у вас есть их.
при установке совершенно нового экземпляра сервера mysql сценарий установки создаст весь mysql.* таблицы с правильной структурой.
при обновлении со старой версии убедитесь, что используется правильная процедура обновления (mysql_upgrade), которая добавит отсутствующие таблицы / столбцы.
это только предположение, но кажется mysql_upgrade не было сделано для этого экземпляра, вызывая поведение видно.
у меня также была такая же проблема с этим, но на Windows после обновления до MySQL 5.5 из MySQL 5.1. Я уже пытался изменить, создать и сбросить пароль, упомянутый в здесь,здесь,здесь и здесь, Я не знаю. Я все еще получаю ту же ошибку:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)Я могу нормально подключаться, показывать все базы данных, выбирать и вставлять, создавать и добавлять пользователей, но когда дело доходит до гранта, я облажался. Этот доступ отказано ошибка появляется снова.
мне удалось решить эту проблему, исправив привилегии следующей командой на сервере MySQL bin / каталог, как указано в здесь:
C:\MySQL Server 5.5\bin> mysql_upgradeзатем проблема ушла. Я надеюсь, что это решение работает и на Linux, так как обычно MySQL предоставляет одну и ту же команду как на Linux, так и на Windows.
Это может произойти, когда вы пытаетесь предоставить все привилегии на всех таблицах другому пользователю, потому что mysql.таблица users считается недоступной для пользователя, отличного от root.
однако должно работать следующее:
GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;обратите внимание, что мы используем `%`.* вместо *.*
Это произошло со мной, когда я попытался установить более высокую версию MySQL, чем та, которая поставляется с дистрибутивом.
я стер старую версию, а затем установил новую (rpm-e ... затем rpm-i MySQL-сервер* ) Но не понял, что файлы в /var / lib / mysql все еще были из более старой версии (с различиями, как объяснил Марк Альфф - спасибо!)
Я мог бы сделать mysql_upgrade, но поскольку я хотел начать с нуля, я сделал:
# su - mysql $ rm -rf /var/lib/mysql/* $ mysql_install_db # /etc/init.d/mysql startзатем установите пароль root (/usr/bin / mysqladmin-u root password), и все работало, как ожидалось, с командами GRANT...
у меня была такая же проблема, т. е. все льготы для root:
SHOW GRANTS FOR 'root'@'localhost'\G *************************** 1. row *************************** Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*[blabla]' WITH GRANT OPTION...но все равно не разрешили создать таблицу:
create table t3(id int, txt varchar(50), primary key(id)); ERROR 1142 (42000): CREATE command denied to user 'root'@'localhost' for table 't3'Ну, это было вызвано раздражающей ошибкой пользователя, т. е. я не выбрал базу данных. После выдачи использовать dbname он работал нормально.
введя
SHOW GRANTS FOR 'root'@'localhost';показал мне какой-то скрытый пароль, поэтому я вошел в mysql этой системы, используя HeidiSQL на другой системе (используяrootкак имя пользователя и соответствующий пароль) и набралGRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;и это сработало, когда я вернулся в систему и вошел в систему с помощью
mysql -uroot -pthepassword;
в основном эта ошибка возникает, когда вы не указали пароль, это означает, что у вас есть неправильный пароль, указанный в каком-либо файле опций.
читать это DOC о понимании того, как назначать и управлять паролями для учетных записей.
кроме того, проверьте, есть ли разрешение на папку
/var/lib/mysql/mysqlЭто 711 или нет.
На Debian (до, 7.8) с MySQL 5.5.40, я нашел
SELECT * FROM mysql.user WHERE User='root'\GпоказалаEvent_privи Trigger_priv поля были присутствует, но не набор для Ю.под управлением
mysql_upgrade(С или без--force) не имело никакого значения; мне нужно было сделать руководство:
update user set Event_priv = 'Y',Trigger_priv = 'Y' where user = 'root'затем, наконец, я мог бы использовать:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION...и затем использовать его более точно на индивидуальной базе данных пользователя счет.
Я запускаю это, когда я пытался добавить привилегии к performance_schema, который является ошибкой mysql http://bugs.mysql.com/bug.php?id=44898 (обходной путь для добавления --single-transaction).
для тех, кто все еще натыкается на это, как я сделал, стоит проверить, чтобы убедиться, что попытка
GRANTуже не существует:SHOW GRANTS FOR username;в моем случае ошибка была на самом деле не потому, что была ошибка разрешения, а потому, что
GRANTуже существовал.
у меня была та же проблема, и это заняло много чтения сообщений SO и документации Google. Я, наконец, нашел это от Cloud SQL FAQ:
Google Cloud SQL не поддерживает супер привилегии, что означает, что
GRANT ALL PRIVILEGESзаявления не будет работать. В качестве альтернативы, вы можете использоватьGRANT ALL ON `%`.*
возможно, вы пришли к этому вопросу с установленной версией MySQL 8 (как и я) и не нашли удовлетворительного ответа. Вы больше не можете создавать таких пользователей в версии 8:
GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;довольно запутанное сообщение об ошибке, которое вы получаете обратно:
ERROR 1410 (42000): You are not allowed to create a user with GRANTдля того, чтобы создать пользователей в версии 8 вы должны сделать это в два этапа:
CREATE USER 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]'; GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' WITH GRANT OPTION;конечно, если вы предпочитаете, вы также можете предоставить ограниченное количество привилегий (вместо
GRANT ALL PRIVILEGES), напримерGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER
Comments