Як я можу відновити повні привілеї користувача MySQL root?


108

Я випадково видалив деякі привілеї у мого користувача root MySQL, включаючи можливість зміни таблиць. Чи я можу відновити цього користувача до його початкового стану (з усіма привілеями)?

UPDATE mysql.user SET Grant_priv = 'Y', Super_priv = 'Y' WHERE User = 'root';
# MySQL returned an empty result set (i.e. zero rows).
FLUSH PRIVILEGES ;
# MySQL returned an empty result set (i.e. zero rows).


#1045 - Access denied for user 'root'@'localhost' (using password: YES)
GRANT ALL ON *.* TO 'root'@'localhost'

1
Друга помилка виглядає як проблема з паролем. Можливо, я винен, що я вважав, що у вас вже був обліковий запис "root" @ "localhost". Перезапустіть mysqld за допомогою --skip-grant-table та: "DROP USER 'root" @ "localhost"; ВИДАЙТЕ ВСІ ПРИВІЛЕГИ НА . ДО "root" @ "%"; " натомість? Найкращий спосіб дізнатися, до якого облікового запису слід надати доступ - це запустити "SELECT User, Host FROM mysql.user WHERE User = 'root';" ... що дасть вам ім'я хоста, яке слід використовувати після @ символ у команді GRANT.
DMI

1
Неправильно, щоб модники позначали тему як поза тему, коли вона не є темою, за винятком того, що може бути ще один сайт Stack Exchange, більш підходящий для теми, і в цьому випадку її слід ідентифікувати. (Ганьба за модників.) Ось куди це може піти: dba.stackexchange.com
Джон Девіс

^ погодився, я проголосував за повторне відкриття. якби він був закритий через існування сайту DBA, про це, принаймні, слід було б згадати і направити туди ОП. (Або потенційно закрито як дублікат іншого питання тут)
нероздільний

Відповіді:


148

Якщо GRANT ALLце не працює, спробуйте:

  1. Зупиніть mysqldі перезапустіть його за допомогою --skip-grant-tablesпараметра.
  2. Підключіться до mysqldсервера просто: mysql(тобто -pопція та ім'я користувача можуть не бути потрібними).
  3. Випустіть у команді mysql наступні команди:

    UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

    FLUSH PRIVILEGES;

Після цього ви маєте змогу запускатись GRANT ALL ON *.* TO 'root'@'localhost';і працювати з ним.


7
1.Як підключитися до сервера mysqld просто: mysql 2.Коли я видав UPDATE mysql.user SET Grant_priv = '1' WHERE User = 'root'; ПРИГОТОВЛЕННЯ; Я отримав Запит нормально, 0 рядків постраждали (0,00 сек) рядків збігаються: 2 змінено: 0 попереджень: 0 Запит нормально, 0 рядків уражено (0,00 сек). Коли я ввійшов у phpMyAdmin як користувач root, я все ще бачу "Без привілеїв".
Стівен

На жаль, після вищезазначених кроків ви зможете запустити команду GRANT ALL. Щоб підключитися до mysqld, я мав на увазі, що вам не знадобиться пароль - я не можу пригадати, чи буде працювати якесь ім’я користувача, чи потрібно буде "root".
DMI

2
Це не працює. Як зазначив Стівен, оновлення таблиці користувачів впливає на 0 записів. Користовий користувач залишається не в змозі надати.
Серін

1
Так, це працює. А якщо ви перебуваєте у вікні, просто тимчасово додайте skip-grant-tablesдо [mysqld]розділу файлу конфігурації mysql, щоб отримати доступ до mysql у командному рядку без пароля.
markus

1
я затримався на грантовій частині (яка не працювала) більше 9 годин, і ваша відповідь врятувала мене ... Ви рятувальник. Дякую багато
Алі Ш.

91

Якщо ви видалили rootкористувача помилково, ви можете зробити одне:

  1. Зупиніть службу MySQL
  2. Біжи mysqld_safe --skip-grant-tables &
  3. Тип mysql -u root -p і натисніть клавішу Enter.
  4. Введіть ваш пароль
  5. У командному рядку mysql введіть: use mysql;

Потім виконайте цей запит:

insert into `user` (`Host`, `User`, `Password`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `ssl_type`, `ssl_cipher`, `x509_issuer`, `x509_subject`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

потім перезапустіть mysqld

EDIT: 6 жовтня 2018 року

Якщо хтось інший потребує цієї відповіді, я спробував це сьогодні, використовуючи innodb_version 5.6.36-82.0 та 10.1.24-MariaDB, і він працює, якщо ви ВИДАЛУЄМО ПРАЦІ (жодних цитат немає, просто видаліть їх):

insert into user (Host, User, Password, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections) 
values('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','','0','0','0','0');

1
@Bipin, дивно, що тільки mysqld.exeв binпапці немає mysqld_safe.exe. Що ви маєте на увазі під "mysqld_safe"?
Pacerier

4
Для MySQL 5.5 вам потрібні ще два приватні версії, Event_priv та Trigger_priv.
Грег Белл

Я уявляю, що це перерви в 5.6.5
Отей,

1
@Pacerier - відповідно до цього допису вам насправді не потрібно mysqld_safe, просто запустіть звичайний двійковий файл mysqld:mysqld.exe --skip-grant-tables
bkwdesign

2
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
Джеймі Хатбер

24

я також видаляю привілеї root та баз даних, що не відображаються в консолі mysql, коли я був користувачем root, тому змінив користувача за mysql>mysql -u 'userName' -p;паролем;

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';

FLUSH PRIVILEGES;

після цієї команди все показує базу даних у корені.

Дякую


1
Мені довелося робити поєднання речей. Мені довелося зупинити службу mysqld, потім запустити mysqld_safe --skip-crant-table &, потім вищевказану команду UPDATE, потім перезапустити mysql, потім запустити GRANT ALL ON . TO 'user' @ 'localhost';
Нік Вудхамс

5

Я відмовив вставляти та перезавантажувати права на root. Тож після оновлення дозволів ПРИМІТКИ FLUSH не працювали (через відсутність прав перезавантаження). Тому я скористався користувачем debian-sys-maint на Ubuntu 16.04 для відновлення привілеїв user.root. Ви можете знайти пароль user.debian-sys-maint з цього файлу

sudo cat /etc/mysql/debian.cnf

Ти врятуєш мене! GRANT не працював ні в режимі --skip-grant-table, тому введення як ubuntu-системи дозволило мені створити мого кореневого користувача ще раз, і чим я міг оновити всі привілеї
lunix15

4
GRANT ALL ON *.* TO 'user'@'localhost' with GRANT OPTION;

Просто увійдіть у систему з кореня за допомогою відповідного пароля, якщо такий є, та просто запустіть вищевказану команду до будь-якого користувача.

Наприклад:

GRANT ALL ON *.* TO 'root'@'%' with GRANT OPTION;

3
але якщо користувач 'root' втратив привілеї, то як це може працювати, хіба користувачеві root не потрібні підвищені привілеї для цього? це не спрацювало для мене.
Terungwa

3

Просто вставте або оновіть mysql.userзі значенням Yу кожному привілеї стовпця.


2

Якщо ви використовуєте WAMP на своєму локальному комп'ютері (версія mysql 5.7.14) Крок 1: відкрийте файл my.ini Крок 2: відмініть коментар до цього рядка "пропустити-грант-таблиці", видаливши крок 3 з двокрапкою: перезапустіть mysql крок сервера 4: запуск консолі mySQL крок 5:

UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
FLUSH PRIVILEGES;

Крок 6: Проблема вирішена !!!!

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