Доступ заборонено користувачеві '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" користувач, який не є localhost):

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 = '%' показує ті самі привілеї, що і ваші). ЗАРАЗ, РОБОТА РОБОТА НА МІСЦЕ, навіть якщо рядок у mysql.user з хостом = '%' ідентичний рядку з хостом = 'localhost', крім цього поля. Я працюю 5.0.45 на Windows Server 2003. Будь-які відповіді вдячні!
Річард Фосетт

3
+1 за таке організоване запитання!
Dewsworld

1
переконайтеся, що ви відкрили cmd, запустившись як адміністратор
Lijo

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
Це корисна інформація, але як виправити проблему?
augurar

2
@augurar, Run mysql_upgrade
Marc Alff

Або перевірте, чи є у вас інший користувач із "УСІХ ПРИВІЛЕГІЙ" та переключіться на цього і змініть привілеї для localhost. Наприклад, у мене були всі привілеї на 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, я накручуюсь. Помилка, відхилена у доступі, з’являється знову.

Мені вдалося вирішити цю проблему, виправивши привілеї за допомогою наступної команди у біні / каталозі сервера 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
Якщо ви перебуваєте на CentO або встановили MySQL через менеджер пакунків, це, швидше за все, команда, яку ви повинні виконати: /usr/bin/mysql_upgrade -u root -pвведіть пароль і ваш дядько Боба!
Zjoia

Після боротьби тут і там із такою кількістю коментарів, цей мені допоміг. Велике спасибі
siddhusingh

Я знаю , що це старше , але це допомогло мені багато , і я хотів би додати ще один коментар для відвідувачів в майбутньому: якщо ви отримуєте Access Denied намагається запустити mysql_upgrade, спробуйте запустити його , як це замість: mysql_upgrade -p
Blizz

2
Я виявив, що якщо ви експортували бази даних з MySQL <= 5.1 через, mysqldump ... --all-databasesа потім імпортували їх у свій MySQL> = 5.5, ваших користувачів буде замінено (звичайно), але у вас rootвиникне та сама проблема, що і в ОП. І 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, а потім спробувати надати привілеї.
Nav

Я отримую відмову в помилці 1044 :( допоможіть мені, будь ласка,
Bhaumik Thakkar

Дякую, намагалися отримати доступ до mysql із програми python за допомогою pymysql. Отримала помилку, сказавши "Хосту заборонено підключатися до цього сервера MariaDB". Вирішила, що додавши нового користувача, вказаного [тут] ( stackoverflow.com/questions/19101243/… ), потім з’явилася ще одна помилка, що говорить "користувачеві доступ заборонено" , і вирішили це своїм методом.
Balraj Bains

1
Якщо ви використовуєте '%'.*замість `%`.*, не працює. Ви ОБОВ'ЯЗКОВО використовуєте`%`.*
Росаріо Руссо

7

Це трапилося зі мною, коли я намагався встановити більш високу версію 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 root), і все працювало так, як очікувалося з командами GRANT ...


Дякую, це мені допомогло. На щастя, неважливо, чи я знищив усі БД ...
Jarrod Mosen

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'

Що ж, це було викликано прикрою помилкою користувача, тобто я не обрав базу даних. Після видачі dbname USE воно спрацювало чудово.


5

У 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

… А потім точніше використовувати його в індивідуальній базі даних / обліковому записі користувача.


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


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

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

Google Cloud SQL не підтримує привілеї SUPER, а значить, GRANT ALL PRIVILEGESзаяви не працюватимуть. Як альтернативу можна використовуватиGRANT ALL ON `%`.*


1

Для тих, хто все ще натрапляє на це, як я, варто перевірити, щоб переконатися, що спроба GRANTвже не існує:

SHOW GRANTS FOR username;

У моєму випадку помилка була не тому, що була помилка дозволу, а тому, що вона GRANTвже існувала.


1

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

sudo mysql -u root

Тоді необхідні дозволи для GRANTкоманд існують .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.