Як надати всі права користувачам root в MySQL 8.0


110

Пробували

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

Отримання

ПОМИЛКА 1064 (42000): ви маєте помилку в своєму синтаксисі SQL; перевірте правильний синтаксис у посібнику, який відповідає версії вашого сервера MySQL, біля «ІДЕНТИФІКОВАНО« коренем »З ГРАНТОВИМ ВАРІАНТОМ» у рядку 1.

Примітка: Те саме працює при спробі попередніх версій.

Також пробував

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

Отримання

ПОМИЛКА 1410 (42000): Вам не дозволено створювати користувача за допомогою GRANT

Ім'я користувача / пароль MySQL (8.0.11.0) - це root / root.


Ви підключаєтесь безпосередньо до mysql чи використовуєте ssh?
Гаральд

безпосередньо з командного рядка в якості кореневого користувача
Правен

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
aiman

Відповіді:


198

Починаючи з 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'; Запит OK, 0 рядків (0,31 сек) mysql> НАДАТИ ВСІ ПРИВІЛЕГІЇ . ДО "root" @ "%" З ГРАНТОВИМ ВАРІАНТОМ; Запит ОК, 0 рядків зачеплені (0,16 сек) mysql> ВИБЕРИТЬ користувача ВІД mysql.user; + ------------------ + | Користувач | + ------------------ + | корінь | | mysql.infoschema | | mysql.session | | mysql.sys | | корінь | + ------------------ + 5 рядків у наборі (0,00 сек)
Правен

Тепер у таблиці користувачів присутні два користувачі з іменем root !! Також я не можу підключитися віддалено (користувач root). ------------- Подробиці: Тип: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException Стан SQL: 08001
Правен

Дивно. Повідомлення про помилку у вашому запитанні вказує на те, що цей користувач не існує. Це єдина причина, чому я запропонував створити її спочатку. І неможливо мати одного і того ж користувача двічі в одному екземплярі MySQL. Вони відрізняються або назвою, або головною частиною.
Майк Лішке,

2
Ці 2 користувачі підключаються з різних хостів. Запустити SELECT User, Host FROM mysql.user;замість цього.
Mike Lischke,

3
Отримав цю помилку:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
adi

31

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

29

Я бачу багато (неправильних) відповідей, це так само просто, як це:

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

Примітка: замість самостійно створеного userви можете використовувати 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

Не могли б ви детальніше пояснити, чому це не працює, а не просто скаржитися? Таким чином я можу вам допомогти або розмістити додаткову інформацію.
Туманний

Відповідь на це питання навіть не сортувати адреси питання про кореневих привілеї користувача.
Джозеф, 8

Відповідно оновлено відповідь.
Туманний

1
Найкраща відповідь, тепер це GRANT ALL ONдля MySQL 8.0. Також я вважаю, що замість відключення bind-addressви можете прив'язуватись до будь-яких команд 127.0.0.1і включати їх --protocol=tcp. Ефективність у довгостроковій перспективі також краща, ніж у localhost.
Джессі Ніклз,

3

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

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*)

Примітка: Я створив базу даних (db_name) раніше і створював облікові дані користувача з усіма привілеями, наданими всім таблицям в БД замість використання кореневого користувача за замовчуванням, якого я десь читав, є найкращою практикою.


3

Зазначений користувач просто не існує у вашому MySQL (отже, MySQL намагається створити його за допомогою GRANT, як це було до версії 8, але не вдається з обмеженнями, введеними в цій версії).

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

Повідомлення про помилку також вводить в оману.

Отже, якщо ви отримуєте повідомлення про помилку, перевірте своїх існуючих користувачів чимось подібним

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

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


Це було дійсним рішенням для мене! Мені просто не вдалося точно ввести рядок @. Обов’язково перевірте це, перш ніж спробувати інші запропоновані рішення. Для мене це було: CREATE USER 'user'@'%domain.com', а потім, коли я видав невдалий оператор GRANT, мій синтаксис був вимкнений на один '.'. Це виглядало так: ГРАНТ .... ДО 'user'@'%.domain.com'. Я забув поставити "." у моїй заяві create, і це мало різницю у вирішенні цієї проблеми.
wallisds

2

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

У підручнику Бітнамі сказано запустити команду "Надати всі привілеї":

/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.


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 оновлює користувача і не встановлює обліковий запис користувача. Він також не надає привілеїв.
Туманний

0

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

Отже ... я поставив це bind-address = *після [mysqld]і перезапустив службу. Тепер це працює!


Це насправді найближче до правильної відповіді.
Йосип, 8

0

1. надавати пільги

mysql> НАДАТИ ВСІ ПРИВІЛЕГІЇ. ДО "root" @ "%" З ГРАНТОВИМ ВАРІАНТОМ;

mysql> ПРИВИЛЕГІЇ

2. перевірити таблицю користувачів:

mysql> використовувати mysql

mysql> вибрати хост, користувача від користувача введіть тут опис зображення

3. Змініть файл конфігурації

mysql типовий 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. остаточно перезапустити служби

служби заварювання перезапустіть


Хоча це могло би працювати, я ніколи не перезапустив би екземпляр mysql у виробництві, надаючи певні привілеї. Натомість спробуйте привілеї.
Туманний

-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конфігу. Ніяких інших змін не вимагалося.


Це навіть не відповідає повністю на запитання.
Туманний

-2

У мене була та ж проблема на CentOS, і це спрацювало для мене (версія: 8.0.11):

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

ПОМИЛКА 1064 (42000): у вашому синтаксисі SQL є помилка; перевірте правильний синтаксис, який відповідає вашій версії сервера MySQL, біля '. ДО 'root' @ '%' 'у рядку 1
GDefender

mysql> НАДАТИ ВСІ ПРИВІЛЕГІЇ. ДО 'root' @ '%'; ПОМИЛКА 1064 (42000): у вашому синтаксисі SQL є помилка; перевірте правильний синтаксис, який відповідає вашій версії сервера MySQL, біля '. ДО 'root' @ '%' 'у рядку 1 mysql>
PGOEL
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.