Доступ запрещен для пользователя 'root' @ 'localhost' при попытке предоставить привилегии. Как я могу предоставить привилегии? - PullRequest
157 голосов
/ 13 декабря 2011

Я посмотрел на несколько похожих вопросов и поэтому демонстрирую, что проверил основы.Хотя, конечно, это не значит, что я не пропустил что-то совершенно очевидное.: -)

Мой вопрос таков: почему мне отказано в доступе к пользователю с привилегиями делать то, что я пытаюсь сделать, и где я уже набрал пароль и получил доступ?(Для полноты картины я попытался ввести неправильный пароль, чтобы убедиться, что клиент 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> 

Awesome.Мое прочтение ответов на подобные вопросы говорит о том, что я должен убедиться, что привилегии соответствуют текущим в таблицах грантов

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 ]

72 голосов
/ 22 января 2012

У меня тоже была такая же проблема, но на Windows после обновления до MySQL 5.5 с MySQL 5.1.Я уже пытался изменить, создать и сбросить пароль, упомянутый в здесь , здесь , здесь и здесь , без понятия.Я все еще получаю ту же ошибку:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Я могу нормально подключиться, показать все базы данных, сделать выбор и вставку, создавать и добавлять пользователей, но когда дело доходит до GRANT, я облажалсявверх.Ошибка доступа запрещена. Снова появляется

Мне удалось решить эту проблему, исправив привилегии с помощью следующей команды в каталоге bin / каталоге сервера MySQL, как указано в здесь :

C:\MySQL Server 5.5\bin> mysql_upgrade

Тогда проблема ушла.Я надеюсь, что это решение работает и в Linux, так как обычно MySQL предоставляет одну и ту же команду как в Linux, так и в Windows.

54 голосов
/ 15 апреля 2013

Это может произойти, если вы попытаетесь предоставить все привилегии для всех таблиц другому пользователю, поскольку таблица mysql.users считается запрещенной для пользователя, отличного от пользователя root.

Следующее, однако, должно работать:

GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;

Обратите внимание, что мы используем `%`. * Вместо *. *

52 голосов
/ 24 января 2012

Обратите внимание, что выходные данные

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 не был выполнен для этого экземпляра, что вызвало наблюдаемое поведение.

7 голосов
/ 01 мая 2013

Это случилось со мной, когда я попытался установить более высокую версию MySQL, чем та, которая поставляется с дистрибутивом.

Я удалил старую версию, а затем установил новую (rpm -e ... затем rpm -я 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 ...

5 голосов
/ 02 октября 2013

У меня была такая же проблема, т.е. все привилегии, предоставленные для 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'

Ну, это было вызвано досадной ошибкой пользователя, то есть я не выбрал базу данных. После выдачи USE dbname все заработало.

4 голосов
/ 14 августа 2018

Возможно, вы пришли к этому вопросу с установленной 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

4 голосов
/ 21 января 2015

В Debian ( Wheezy , 7.8) с MySQL 5.5.40 я обнаружил, что SELECT * FROM mysql.user WHERE User='root'\G показал поля Event_priv и 'Trigger_priv` были , но нет установлен в Y.

Запуск 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

… и затем использовать его более точнов отдельной базе данных / учетной записи пользователя.

4 голосов
/ 13 декабря 2011

В основном эта ошибка возникает, когда вы не указали пароль, это означает, что у вас есть неправильный пароль, указанный в некотором файле опций.

Прочтите это DOC , чтобы понять, как назначать иуправлять паролями к учетным записям.

Кроме того, проверьте, является ли разрешение для папки /var/lib/mysql/mysql 711 или нет.

3 голосов
/ 07 августа 2014

Набрав SHOW GRANTS FOR 'root'@'localhost';, показал мне какой-то скрытый пароль, поэтому я вошел в mysql этой системы, используя HeidiSQL в другой системе (используя root в качестве имени пользователя и соответствующего пароля), и набрал
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

и это сработало, когда я вернулся в систему и вошел в систему с помощью
mysql -uroot -pthepassword;

2 голосов
/ 26 мая 2013

Я запускаю это при попытке добавить привилегии для performance_schema, что является ошибкой mysql http://bugs.mysql.com/bug.php?id=44898 (обходной путь для добавления --single -action).

...