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

Спасибо!

14 ответов

Решение

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

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

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

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

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

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

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

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

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

Я стер старую версию, затем установил новую (rpm -e ... затем rpm -i MySQL-server*), но не понял, что файлы в /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'

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

На 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

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

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

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

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

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

Также проверьте, есть ли разрешение на папку /var/lib/mysql/mysql 711 или нет.

У меня была та же самая проблема, и мне потребовалось много времени для чтения сообщений SO и документации Google. Я наконец-то нашел это в облаке SQL FAQ:

Google Cloud SQL не поддерживает привилегии SUPER, что означает, что GRANT ALL PRIVILEGES заявления не будут работать. В качестве альтернативы вы можете использовать GRANT ALL ON `%`.*

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

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

SHOW GRANTS FOR username;

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

Одно простое решение, которое всегда работает для меня, когда я сталкиваюсь с ошибками mysql "доступ запрещен": используйте sudo.

sudo mysql -u root

Тогда необходимые разрешения существуют для GRANT команды.

просто откройте PHPmyAdmin и перейдите к учетным записям пользователей и предоставьте все привилегии [email protected]

Другие вопросы по тегам