Доступ запрещен для пользователя "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)
теперь это немного трудно читать, поэтому давайте попробуем так (вы также увидите, что есть пользователь не localhost '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)
Я могу нормально подключаться, показывать все базы данных, выбирать и вставлять, создавать и добавлять пользователей, но когда дело доходит до гранта, я облажался. Этот доступ ошибка denied появляется снова.
мне удалось решить эту проблему, исправив привилегии следующей командой на сервере MySQL bin / directory, как указано в здесь:
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
уже существовал.
у меня была та же проблема, и потребовалось много чтения сообщений и документации Google. Я, наконец, нашел это из облако 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