Как предоставить все привилегии пользователю root в MySQL 8.0

116

Пытался

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

Получение

ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'IDENTIFIED BY' root 'WITH GRANT OPTION' в строке 1.

Примечание. То же самое работает и в предыдущих версиях.

Также пробовал

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Получение

ОШИБКА 1410 (42000): вам не разрешено создавать пользователя с помощью GRANT.

MySQL (8.0.11.0) имя пользователя / пароль root / root.

Правин
источник
вы подключаетесь напрямую к mysql или используете ssh?
Харальд
непосредственно из командной строки как пользователь root
Praveen
1
Смотрите различие между 13.7.1.6 GRANT Синтаксис и 13.7.1.4 GRANT Синтаксисом .
wchiquito
7
Я тоже застрял с той же проблемой. Я запускаю оболочку mysql с помощью mysql -u root -p, а затем ввожу пароль root. Потом попробовал GRANT GRANT OPTION ON *.* TO 'root'@'%';и ERROR 1410 (42000): You are not allowed to create a user with GRANT
выдает

Ответы:

205

Начиная с MySQL 8 вы больше не можете (неявно) создавать пользователя с помощью GRANTкоманды. Вместо этого используйте CREATE USER с последующим оператором GRANT :

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

Предупреждение об угрозах безопасности WITH GRANT OPTIONсм.

Майк Лишке
источник
3
Эта команда создаст нового пользователя. Но я хочу предоставить привилегии существующему пользователю root. mysql> СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ 'root' @ '%' ИДЕНТИФИЦИРОВАНО 'root'; Запрос ОК, затронуты 0 строк (0,31 сек) mysql> GRANT ALL PRIVILEGES ON . К 'root' @ '%' С ОПЦИЕЙ GRANT; Запрос ОК, затронуты 0 строк (0,16 сек) mysql> ВЫБРАТЬ пользователя ИЗ mysql.user; + ------------------ + | Пользователь | + ------------------ + | корень | | mysql.infoschema | | mysql.session | | mysql.sys | | корень | + ------------------ + 5 рядов в наборе (0,00 сек)
Praveen
Теперь в таблице пользователей присутствуют два пользователя с именем root !! Также я не могу подключиться удаленно (пользователь root). ------------- Подробности: Тип: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException Состояние SQL: 08001
Правин
Странно. Сообщение об ошибке в вашем вопросе указывает на то, что этого пользователя не существует. Это единственная причина, по которой я предложил создать его первым. И невозможно иметь одного и того же пользователя дважды в одном экземпляре MySQL. Они различаются либо по названию, либо по основной части.
Майк Лишке
2
Эти 2 пользователя подключаются с разных хостов. SELECT User, Host FROM mysql.user;Вместо этого беги .
Майк Лишке
3
Получил эту ошибку:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi
32

1) Это сработало для меня. Сначала создайте нового пользователя. Пример: Пользователь fooс паролемbar

> mysql> CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';

2) Замените приведенный ниже код именем пользователя с «foo».

> mysql> GRANT ALL PRIVILEGES ON database_name.* TO'foo'@'localhost';

Примечание: database_name это база данных , которые вы хотите иметь привилегии, . означает все на всех

3) Войдите как пользователь foo

mysql> mysql -u foo -p

Пароль: бар

4) Убедитесь, что ваше первоначальное соединение с Sequelize установлено на foo с pw bar.

Дж. Доу
источник
5
Это далеко не ответ на вопрос. Речь идет о глобальных разрешениях, а не о разрешениях для конкретной базы данных.
tmuecksch 01
31

Я вижу много (неправильных) ответов, это так просто:

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;

Примечание: вместо самостоятельно созданного userвы можете использовать rootдля подключения к базе данных. Однако использование учетной записи root по умолчанию для подключения приложения к базе данных не является предпочтительным способом.

Альтернативные привилегии (будьте осторожны и помните принцип наименьших привилегий):

-- Grant user permissions to all tables in my_database from localhost --
GRANT ALL ON my_database.* TO 'user'@'localhost';

-- Grant user permissions to my_table in my_database from localhost --
GRANT ALL ON my_database.my_table TO 'user'@'localhost';

-- Grant user permissions to all tables and databases from all hosts --
GRANT ALL ON *.* TO 'user'@'*';

Если бы вы каким-то образом столкнулись со следующей ошибкой:

ОШИБКА 1130 (HY000): узлу 1.2.3.4 не разрешено подключаться к этому серверу MySQL.

Вам нужно добавить / изменить следующие две строки /etc/mysql/my.cnfи перезапустить mysql:

bind-address           = 0.0.0.0
skip-networking
Небуластический
источник
Не могли бы вы пояснить, почему это не работает, вместо того чтобы просто жаловаться? Таким образом я могу помочь вам или опубликовать дополнительную информацию.
Nebulastic
Этот ответ даже не касается вопроса о привилегиях пользователя root .
Joseph8th,
Соответственно обновил ответ.
Nebulastic
1
Лучший ответ, теперь это GRANT ALL ONдля MySQL 8.0. Также я считаю, что вместо отключения bind-addressвы можете привязать 127.0.0.1и включить --protocol=tcpлюбые команды. Производительность в долгосрочной перспективе также лучше, чем с localhost.
Джесси Никлс,
4

Мои характеристики:

mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

Что сработало для меня:

mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'desired_password';
mysql> GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' WITH GRANT OPTION;

Ответ на оба запроса:

Query OK, O rows affected (0.10 sec*)

NB: я создал базу данных (db_name) ранее и создавал учетные данные пользователя со всеми привилегиями, предоставленными всем таблицам в БД, вместо использования пользователя root по умолчанию, который я где-то читал, является лучшей практикой.

Нуэль Макара
источник
3

Указанный пользователь просто не существует в вашем MySQL (поэтому MySQL пытается создать его с помощью GRANT, как это было до версии 8, но не справляется с ограничениями, введенными в этой версии).

MySQL на данный момент довольно тупой, поэтому, если у вас есть 'root' @ 'localhost' и вы пытаетесь предоставить привилегии 'root' @ '%', он рассматривает их как разных пользователей, а не как общее понятие для пользователя root на любом хосте, включая localhost.

Сообщение об ошибке также вводит в заблуждение.

Итак, если вы получаете сообщение об ошибке, проверьте существующих пользователей с помощью чего-то вроде этого

SELECT CONCAT("'", user, "'@'", host, "'") FROM mysql.user;

а затем создайте отсутствующего пользователя (как посоветовал Майк) или настройте команду GRANT в соответствии с фактической спецификацией существующего пользователя.

Сергей Подушкин
источник
Для меня это было правильным решением! Мне просто не удалось точно ввести строку user @. Обязательно проверьте это, прежде чем пробовать другие предлагаемые решения. Для меня это было: CREATE USER 'user'@'%domain.com', а затем, когда я выдал неудачный оператор GRANT, мой синтаксис был отключен на один '.'. Это выглядело так: GRANT .... TO 'user'@'%.domain.com'. Я забыл поставить "." в моем операторе создания, и это имело решающее значение для устранения этой проблемы.
wallisds
2

Только мои 2 цента по теме. У меня была такая же проблема при попытке подключиться из MySQL Workbench. Я запускаю виртуальную машину bitnami-mysql, чтобы настроить локальную песочницу для разработки.

В учебнике Bitnami говорится, что нужно запустить команду «Предоставить все привилегии»:

/opt/bitnami/mysql/bin/mysql -u root -p -e "grant all privileges on *.* to 'root'@'%' identified by 'PASSWORD' with grant option";

Это явно не сработало, я, наконец, заставил его работать, используя ответ Майка Лишке.

Я думаю, что произошло то, что у пользователя root @% были неправильные учетные данные, связанные с ним. Итак, если вы пытались изменить привилегии пользователя, но безуспешно, попробуйте:

  1. Удаление пользователя.
  2. Создайте пользователя снова.
  3. Убедитесь, что у вас есть правильная привязка к вашему конфигурационному файлу my.cnf. В моем случае я закомментировал строку, так как она предназначена только для среды песочницы.

Из консоли Mysql:

Список пользователей (полезно видеть всех ваших пользователей):

select user, host from mysql.user;

Удалить желаемого пользователя:

drop user '{{ username }}'@'%';

Создать пользователя и предоставить разрешения:

CREATE USER '{{ username }}'@'%' IDENTIFIED BY '{{ password }}';
GRANT ALL PRIVILEGES ON *.* TO '{{ username }}'@'%' WITH GRANT OPTION;

Выполните эту команду:

FLUSH PRIVILEGES;

Найдите свой файл конфигурации mysql my.cnf и найдите строку, которая выглядит так:

bind-address=127.0.0.1

и прокомментируйте его, используя '#':

#bind-address=127.0.0.1

Затем перезапустите службу mysql.

Надеюсь, это поможет кому-то, у кого такая же проблема!

Армандо Хуарес
источник
1

Это сработало для меня:

mysql> FLUSH PRIVILEGES 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES
НУЛЬ
источник
1

Убедитесь, что ваше имя пользователя и домен такие же, как были созданы ранее. Mysql выбирает учетную запись по двум столбцам в таблице пользователей. Если они разные, mysql может подумать, что вы хотите создать новую учетную запись с помощью гранта, который не поддерживается после версии 8.0.

Zenglong Chen
источник
1

Мои характеристики:

mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

Что сработало для меня:

mysql> USE mysql;
mysql> UPDATE User SET Host='%' WHERE User='root' AND Host='localhost';
尹劍平
источник
Хотя это сработает в вашей конкретной ситуации. Этот синтаксис sql обновляет пользователя, но не устанавливает учетную запись пользователя. Он также не дает привилегий.
Nebulastic
0

Ну, у меня была такая же проблема. Даже если в маршруте был указан "%", удаленное подключение невозможно. Теперь, взглянув на my.iniфайл (файл конфигурации в Windows), bind-addressутверждение было пропущено.

Итак ... Я поставил это bind-address = *после [mysqld]и перезапустил службу. Теперь это работает!

Caos51
источник
На самом деле это наиболее близкий к правильному ответ.
Joseph8th,
0

1. предоставить привилегии

mysql> ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ. К 'root' @ '%' С ОПЦИЕЙ GRANT;

mysql> ПРИВИЛЕГИИ ПРОМЫВКИ

2. проверьте таблицу пользователей:

mysql> используйте mysql

mysql> выберите хост, пользователя от пользователя введите описание изображения здесь

3.Изменить файл конфигурации

mysql default bind ip : 127.0.0.1, если мы хотим удаленно посещать службы, просто удалите config

#Modify the configuration file
vi /usr/local/etc/my.cnf

#Comment out the ip-address option
[mysqld]
# Only allow connections from localhost
#bind-address = 127.0.0.1

4. наконец перезапустите службы

сервисы brew перезапускают mysql

Devo Chen
источник
Хотя это сработает, я бы никогда не перезапустил экземпляр mysql в производственной среде при предоставлении определенных привилегий. Вместо этого попробуйте сбросить привилегии.
Nebulastic
-1

Это может сработать:

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';
Ануп Джоши
источник
1
Вместо того, чтобы выбросить код, также объясните, почему это подходящее решение. Цель состоит в том, чтобы научить ОП знать, что делать в следующий раз, а не просто решить сиюминутную проблему.
Железный Человек
-1

У меня была такая же проблема, которая привела меня сюда. В частности, что касается локальной разработки, я хотел обойтись mysql -u root -pбез нее sudo. Я не хочу создавать нового пользователя. Я хочу использовать rootлокальное веб-приложение PHP.

Сообщение об ошибке вводит в заблуждение, так как не было ничего плохого с по умолчанию 'root'@'%'пользовательскими привилегиями.

Вместо этого, как несколько человек упомянули в других ответах, решение заключалось в том, чтобы просто установить bind-address=0.0.0.0вместо bind-address=127.0.0.1моей /etc/mysql/mysql.conf.d/mysqld.cnfконфигурации. В остальном никаких изменений не требовалось.

Joseph8th
источник
Это даже не полностью отвечает на вопрос.
Nebulastic
-2

У меня была такая же проблема с CentOS, и это сработало для меня (версия: 8.0.11):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
user3563950
источник
ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, чтобы найти правильный синтаксис рядом с '. TO 'root' @ '%' 'в строке 1
GDefender
mysql> ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ. TO 'root' @ '%'; ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, чтобы найти правильный синтаксис рядом с '. TO 'root' @ '%' 'в строке 1 mysql>
PGOEL