Доступ запрещен для пользователя "root" @ "localhost" при попытке предоставить привилегии. Как предоставить привилегии?

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

Мой вопрос: почему я запретил доступ к пользователю с привилегиями делать то, что я пытаюсь сделать, и где я уже набрал пароль и получил доступ? (Для полноты я попытался ввести неверный пароль, чтобы убедиться, что клиент MySQL будет лишить меня доступа при запуске программы.)

Фон:

Записан в оболочку машины, на которой запущен сервер MySQL через ssh, я регистрируюсь как root:

[[email protected] ~]$ 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()         |
+----------------+
| [email protected] |
+----------------+
1 row in set (0.00 sec)

... и действительно убедитесь, что:

mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| [email protected] |
+----------------+
1 row in set (0.00 sec)

mysql> 

Пока все хорошо. Какие у меня есть привилегии?

mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                                                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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)

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

Спасибо!

Ответ 1

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

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 [email protected]                                           |
+---------------------------------------------------------------------+
| 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 установка script создаст все таблицы mysql. * с соответствующей структурой.

При обновлении с старой версии убедитесь, что используется соответствующая процедура обновления (mysql_upgrade), которая добавит недостающие таблицы/столбцы.

Это всего лишь предположение, но, похоже, для этого экземпляра не было выполнено mysql_upgrade, что вызвало поведение.

Ответ 2

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

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

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

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

C:\MySQL Server 5.5\bin> mysql_upgrade

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

У меня была та же проблема, то есть все привилегии, предоставленные для root:

SHOW GRANTS FOR 'root'@'localhost'\G
*************************** 1. row ***************************
Grants for [email protected]: 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 он работал нормально.

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

В 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

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

Ответ 9

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

Ответ 10

Для тех, кто все еще спотыкается на это, как и я, стоит проверить, чтобы попытка GRANT еще не существовала:

SHOW GRANTS FOR username;

В моем случае ошибка не была на самом деле потому, что была ошибка разрешения, но поскольку GRANT уже существовал.