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

166

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

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

Спасибо!

Стивен Скоттен
источник
2
Я испытываю то же самое удаленно (и выберите * FROM mysql.user, где user = 'root' и host = '%' показывают те же привилегии, что и ваши). ОДНАКО, ЭТО РАБОТАЕТ НА LOCALHOST, даже если строка в mysql.user с host = '%' идентична строке с host = 'localhost', кроме этого поля. Я работаю 5.0.45 на Windows Server 2003. Любые ответы с благодарностью приняты!
Ричард Фосетт
3
+1 за такой организованный вопрос!
Dewsworld
1
убедитесь, что вы
открыли команду
1
У меня просто был пробел между -pпаролем. Я знаю, это глупо, но может помочь кому-то.
Vinay W

Ответы:

57

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

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
Это полезная информация, но как мне решить проблему?
Авгурар
2
@augurar, Run mysql_upgrade
Марк Альф
Или, проверьте, есть ли у вас другой пользователь с «ALL PRIVILEGES» и переключитесь на него и измените привилегии для локального хоста. Например, у меня были все привилегии на root@127.0.0.1, а root @ localhost - нет.
Карабус Мануэль
72

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

Арио
источник
2
спасибо ... в Mac OS с mysql, установленным через homebrew, выполните следующую командуcd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
zoras
30
Если вы используете CentOs или установили MySQL через менеджер пакетов, скорее всего, вам следует выполнить команду: /usr/bin/mysql_upgrade -u root -pвведите пароль и Bob's Your Uncle!
Zjoia
После борьбы здесь и там с таким количеством комментариев, этот помог мне. Большое спасибо
siddhusingh
Я знаю, что это старше, но это мне очень помогло, и я хотел добавить еще один комментарий для будущих посетителей: если вы получаете ACCESS DENIED, пытаясь запустить mysql_upgrade, попробуйте запустить его следующим образом: mysql_upgrade -p
blizz
2
Я обнаружил, что если вы экспортировали базы данных из MySQL <= 5.1 через, mysqldump ... --all-databasesа затем импортировали их в MySQL> = 5.5, ваши пользователи будут заменены (конечно), но у вас rootбудет та же проблема, что и у OP. И mysql_upgradeне будет работать - вы должны добавить --forceфлаг, то есть mysql_upgrade -u root -p --force. Надеюсь, что кому-то здесь поможет.
Грегольцов
62

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

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

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

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

Анудж Гупта
источник
28
Пожалуйста, объясните это. Почему '%'.*работает а нет *.*?
Pacerier
Это правильный способ сделать это. Вы должны войти в MySQL как пользователь root и затем попытаться предоставить привилегии.
Нав
Я получаю сообщение об ошибке 1044, доступ запрещен :( помогите мне, пожалуйста
Bhaumik Thakkar
Спасибо, пытался получить доступ к mysql из приложения python, используя pymysql. Получил ошибку, сказав, что «Хосту не разрешено подключаться к этому серверу MariaDB», решил, что добавив нового пользователя, указанного [здесь] ( stackoverflow.com/questions/19101243/… ), затем получил другую ошибку, сообщив, что «доступ запрещен для пользователя» и решил это твоим методом.
Balraj Bains
1
Если вы используете '%'.*вместо `%`.*не работает. Вы ДОЛЖНЫ использовать`%`.*
Розарио Руссо
7

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

phil_w
источник
Спасибо, это помогло мне. К счастью, это не имело значения, уничтожил ли я все базы данных ...
Джаррод Мозен
5

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

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

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

Митхун Сасидхаран
источник
Это сработало для меня. Похоже, что mysql не создает разрешения для 'user' @ 'localhost'. Поэтому мне пришлось создать этого пользователя и убедиться, что у него есть пароль.
Джерино
Права были неправильными! Я удивлен. Большое спасибо за публикацию этого.
Адам
5

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

TZP
источник
5

В Debian ( свистящих , 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

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

Уильям Туррелл
источник
1
Это решило проблему и для меня, но только после того, как я узнал, что вам нужно ПОЛУЧИТЬ ПРИВИЛЕГИИ; после этого и повторно войдите, чтобы установить опцию предоставления.
Хендрик
5

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

gloriphobia
источник
3

В результате набора 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

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

pevik
источник
2

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

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

kurdtpage
источник
1

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

SHOW GRANTS FOR username;

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

mopo922
источник
1

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

sudo mysql -u root

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

suspectus
источник