Помилка MySQL: 'Доступ заборонено користувачеві' root '@' localhost '


263

$ ./mysqladmin -u root -p ' відредаговано '
Введіть пароль:

mysqladmin: помилка підключення до сервера на "localhost":
"Доступ заборонено для користувача" root "@" localhost "(з використанням пароля: ТАК)"

Як я можу це виправити?



1
@clearlight Не те саме питання, ця публікація - проблема з mysqladmin win super privilegies в mysql, інша публікація - проблема з простим підключенням від socket.
e-info128

Спробуйте видалити, якщо ~/.my.cnfфайл існує .
e-info128

11
Я знаю, що це старе, але хочу сказати це для майбутніх відвідувачів. Не вводьте свій пароль mysql, особливо для root, в самій команді, інакше він буде зберігатися в історії вашої оболонки. Просто залиште -pопцію самостійно, і mysql запропонує ввести пароль.
Скотті C.

Відповіді:


356
  1. Відкрийте та редагуйте /etc/my.cnfабо /etc/mysql/my.cnf, залежно від дистрибутива.
  2. Додати skip-grant-tablesпід[mysqld]
  3. Перезапустіть Mysql
  4. Ви повинні мати можливість увійти в mysql зараз, використовуючи команду нижче mysql -u root -p
  5. Біжи mysql> flush privileges;
  6. Встановити новий пароль від ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
  7. Поверніться до /etc/my.cnf та видаліть / коментуйте пропускні таблиці-пропуск
  8. Перезапустіть Mysql
  9. Тепер ви зможете увійти з новим паролем mysql -u root -p

6
Привіт, у мене була така ж проблема. Я зробив вищезазначене, і це вирішило проблему, але кожен раз, коли я перезавантажую CentOS, мені потрібно зробити всі кроки ще раз (мені надійшло повідомлення: Доступ заборонено для користувача 'root' @ 'localhost' (використовуючи пароль: НІ) - коли запускаю команду mysql (або будь-яку команду sql), і я роблю знову і знову все так, як вище, при кожному перезавантаженні.
Ейтан,

19
Шкода, що це не працює з MariaDB:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'USER 'root'@'localhost' IDENTIFIED BY 'NewPassword'' at line 1
Філіпп Людвіг

11
Я виявив, що це працює @PhilippLudwig set PASSWORD FOR 'root'@'localhost' = PASSWORD('root');Я зробив це після кроку 5. Ось як виглядав результат мого командного рядка:MariaDB [(none)]> MariaDB [(none)]> set PASSWORD FOR 'root'@'localhost' = PASSWORD('root'); Query OK, 0 rows affected (0.00 sec)
therobyouknow

3
Для кроку 3 перезапустіть MariaDB: Я знайшов наступні роботи:sudo systemctl restart mariadb
therobyouknow

7
Деякі можуть знайти файл у /etc/mysql/my.cnf
DSinghvi

589

Усі знайдені нами рішення були набагато складнішими, ніж необхідні, і жодне не працювало для мене. Ось рішення, яке вирішило мою проблему. Не потрібно перезавантажувати mysqld або запускати його зі спеціальними привілеями.

sudo mysql

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

За допомогою одного запиту ми змінюємо auth_plugin на mysql_native_password і встановлюємо root-пароль на root (не соромтеся змінювати його у запиті)

Тепер ви повинні мати можливість увійти в систему з коренем. Більше інформації можна знайти в документації на mysql

(вийдіть з консолі mysql за допомогою Ctrl + D або ввівши вихід )


41
Я не можу цього зробити ... "У вас є помилка у вашому синтаксисі SQL; перегляньте посібник, який відповідає вашій версії сервера MariaDB, чи правильний синтаксис використовувати поруч із ...".
TCB13

2
Ця відповідь спрацювала, я випадково додав не корисну відповідь голосування, вибачте!
taher

25
Дуже добре працював на Ubuntu 18.04
Almino Melo

2
@ TCB13 та будь-хто інший, хто стикається з цією проблемою. "Я не можу цього зробити ..." Ви маєте помилку в своєму синтаксисі SQL; перевірте посібник, який відповідає вашій версії сервера MariaDB, чи правильний синтаксис використовувати поруч із ... ". Використовуйте
кодера

3
ти врятуєш мій день :)
xger86x

50

Я намагався багато кроків, щоб виправити цю проблему. Є так багато джерел для можливого вирішення цього питання, що важко відфільтрувати сенс з дурниць. Я нарешті знайшов хороше рішення тут :

Крок 1: Визначте версію бази даних

$ mysql --version

Ви побачите такий вихід із MySQL:

$ mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

Або такий вихід для MariaDB:

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

Зверніть увагу, яку базу даних та яку версію ви використовуєте, оскільки ви будете ними користуватися пізніше. Далі вам потрібно зупинити базу даних, щоб мати доступ до неї вручну.

Крок 2: Зупинка сервера баз даних

Щоб змінити кореневий пароль, потрібно заздалегідь вимкнути сервер бази даних.

Ви можете зробити це для MySQL за допомогою:

$ sudo systemctl stop mysql

А для MariaDB з:

$ sudo systemctl stop mariadb

Крок 3: Перезапуск сервера баз даних без перевірки дозволу

Якщо ви запускаєте MySQL та MariaDB, не завантажуючи інформацію про привілеї користувача, це дозволить вам отримати доступ до командного рядка бази даних з привілеями root без надання пароля. Це дозволить вам отримати доступ до бази даних, не знаючи про це.

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

Запустіть базу даних, не завантажуючи таблиці грантів або включивши мережу:

$ sudo mysqld_safe --skip-grant-tables --skip-networking &

Амперсанд в кінці цієї команди змусить цей процес запуститись у фоновому режимі, щоб ви могли продовжувати використовувати свій термінал.

Тепер ви можете підключитися до бази даних як користувач root, який не повинен запитувати пароль.

$ mysql -u root

Натомість ви відразу побачите підказку оболонки бази даних.

Підказка MySQL

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Підказка MariaDB

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Тепер, коли у вас є кореневий доступ, ви можете змінити кореневий пароль.

Крок 4: Зміна паролю Root

mysql> FLUSH PRIVILEGES;

Тепер ми можемо фактично змінити кореневий пароль.

Для MySQL 5.7.6 та новіших версій, а також MariaDB 10.1.20 та новіших версій використовуйте таку команду:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

Для MySQL 5.7.5 і новіших версій , а також MariaDB 10.1.20 і новіших версій використовуйте:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

Не забудьте замінити new_passwordновим паролем на вибір.

Примітка: Якщо ALTER USERкоманда не працює, це зазвичай свідчить про більшу проблему. Однак ви можете спробувати UPDATE ... SETскинути пароль root.

[ВАЖЛИВО] Це конкретна лінія, яка вирішила мою конкретну проблему:

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';

Не забудьте перезавантажити таблиці грантів після цього.

В будь-якому випадку ви повинні побачити підтвердження того, що команда була успішно виконана.

Query OK, 0 rows affected (0.00 sec)

Пароль змінено, тому тепер ви можете зупинити ручний примірник сервера баз даних і перезапустити його, як це було раніше.

Крок 5: Перезавантажте сервер баз даних звичайно

Підручник проходить ще кілька кроків, щоб перезапустити базу даних, але єдиною частиною, яку я використав, було це:

Для MySQL використовуйте: $ sudo systemctl start mysql

Для MariaDB використовуйте:

$ sudo systemctl start mariadb

Тепер ви можете підтвердити, що новий пароль було застосовано правильно, запустивши:

$ mysql -u root -p

Тепер команда повинна запросити щойно призначений пароль. Введіть його, і вам слід отримати доступ до підказок бази даних, як очікувалося.

Висновок

Тепер у вас відновлений адміністративний доступ до сервера MySQL або MariaDB. Переконайтесь, що обраний вами новий корінний пароль є надійним та надійним та зберігайте його в безпечному місці.


1
Заява ALTER USER була введена в MariaDB 10.2.0.
Деносьє Бенуа

2
Оце Так ! саме ця лінія mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';була для мене такою рятівницею життя!
lucyjosef

35

Жодна з перерахованих вище відповідей не допомогла мені у цій проблемі, тож ось знайдене нами рішення .

Відповідна частина:

У системах Ubuntu, на яких працює MySQL 5.7 (та пізніших версіях), кореневий користувач MySQL встановлюється для автентифікації за допомогою плагіна auth_socket за замовчуванням, а не паролем. Це дозволяє забезпечити більшу безпеку та зручність використання у багатьох випадках, але це може також ускладнити речі, коли вам потрібно дозволити зовнішній програмі (наприклад, phpMyAdmin) отримати доступ до користувача.

Для того, щоб використовувати пароль для підключення до MySQL як root, вам потрібно буде переключити його метод аутентифікації з auth_socket на mysql_native_password. Для цього відкрийте підказку MySQL зі свого терміналу:

sudo mysql

Далі перевірте, який метод аутентифікації використовує кожен з ваших облікових записів користувачів MySQL за допомогою наступної команди:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Вихідні дані

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             |                                           | auth_socket           | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

У цьому прикладі ви бачите, що користувач root фактично підтверджує автентифікацію, використовуючи плагін auth_socket. Щоб налаштувати кореневий рахунок для автентифікації з паролем, запустіть наступну команду ALTER USER. Не забудьте змінити пароль на надійний пароль, який ви обрали, і зауважте, що ця команда змінить кореневий пароль, який ви встановили на кроці 2:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Потім запустіть FLUSH PRIVILEGES, який вказує серверу перезавантажити таблиці грантів та застосувати ваші нові зміни.

FLUSH PRIVILEGES;

Перевірте методи аутентифікації, які використовує кожен ваш користувач ще раз, щоб підтвердити, що root більше не автентифікується за допомогою плагіна auth_socket:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Вихідні дані

+------------------+-------------------------------------------+-----------------------+-----------+
| user             | authentication_string                     | plugin                | host      |
+------------------+-------------------------------------------+-----------------------+-----------+
| root             | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)

У цьому прикладі ви бачите, що користувач root MySQL тепер автентифікується за допомогою пароля. Після підтвердження цього на власному сервері ви можете вийти з оболонки MySQL:

exit


27

Для користувачів Ubuntu / Debian

( може працювати в інших дистрибутивах, особливо на основі Debian)

Виконайте такі дії, щоб підключитися як root(без пароля)

sudo /usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf

Якщо ви не хочете додавати --defaults-fileкожен раз, коли ви хочете підключитися як root, ви можете скопіювати його /etc/mysql/debian.cnfу свій домашній каталог:

sudo cp /etc/mysql/debian.cnf ~/.my.cnf

і потім:

sudo mysql

2
Це все, що потрібно. "root", мабуть, не "root" на Ubuntu, мабуть.
Хаїм Елія

21

Спробувавши всі відповіді інших, це те, що нарешті спрацювало для мене

sudo mysql -- It does not ask me for any password

-- Then in MariaDB/MySQL console:
update mysql.user set plugin = 'mysql_native_password' where User='root';
FLUSH PRIVILEGES;
exit;

Відповідь я знайшов у цьому дописі: https://medium.com/@chiragpatel_52497/solved-error-access-denied-for-user-root-localhost-of-mysql-programming-school-6e3611838d06


1
ЦІЙ ПЛУГІНСЬКИЙ ЛІНІЙ ДІЙСНО ДОПОМОГА. Я спробував багато комбінацій, але це єдиний, що працював для Ver 14.14 Distrib 5.7.27, для Linux (x86_64)
AlexNikonov

2
Це допомогло мені і з mysql 5.7. Тож застосовно не тільки до mariadb
подарок

Я просто використав це на MySQL 8 Ubuntu 20.04 і він працював. Інші відповіді skip-grant-table(my.conf або mysqlкоманда) не спрацювали. Я міг увійти за допомогою облікового запису служби ( askubuntu.com/a/120769/169836 ), але UPDATE mysql.user SET Password=PASSWORD('') WHERE User='root';не працював. Тільки при використанні частини плагіна все працювало. Спасибі ~
hamx0r

16

Для нових користувачів Linux це може бути непростим завданням. Дозвольте мені оновити це за допомогою mysql 8 (остання версія доступна зараз 8.0.12 як 12 вересня 2018 року)

  1. Відкрийте файл конфігурації "mysqld.cnf" за адресою "/etc/mysql/mysql.conf.d/".
  2. Додайте таблиці пропуску-грантів у наступний рядок тексту [mysql] та збережіть.
  3. Перезапустіть службу mysql як "sudo service mysql restart". Тепер ваш mysql не має жодної автентифікації.
  4. Підключіться до клієнта mysql (також відомий як mysql-shell) як mysql -u root -p . Наразі не потрібно вводити пароль.
  5. запустити привілеї змивання команд sql ;
  6. Скиньте пароль зараз як ПОЛІ ПОТРІБНОГО 'root' @ 'localhost' ІДЕНТИФІКОВАНО «MyNewPassword»;
  7. Тепер повернемося до нормального стану; видаліть цей рядок "skip-grant-table" з "mysqld.cnf" та перезапустіть службу.

Це воно.


5

На робочому столі MySQL ви можете перейти до лівої бічної панелі, у розділі Управління виберіть "Користувачі та привілеї", натисніть корінь у розділі "Облікові записи користувачів", у правому розділі натисніть вкладку "Обмеження облікового запису", щоб збільшити максимум запитів, оновлень тощо, та потім натисніть вкладку "Адміністративні ролі" і поставте прапорці, щоб надати доступ до облікового запису. Сподіваюся, що це допомагає!


4

Я зробив це, щоб встановити свій root-пароль при початковій настройці MySQL в OSx. Відкрийте термінал.

sudo sh -c 'echo /usr/local/mysql/bin > /etc/paths.d/mysql'

Закрийте термінал і відкрийте новий термінал. І наступні роботи працюють у Linux, щоб встановити root-пароль.

sudo /usr/local/mysql/support-files/mysql.server stop
sudo mysqld_safe --skip-grant-tables

(sudo mysqld_safe --skip-grant-table: Це не спрацювало для мене в перший раз. Але друга спроба, успіх був.)

Потім увійдіть у MySQL

mysql -u root

FLUSH PRIVILEGES;

Тепер змінити пароль:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpassword';

Перезапустіть MySQL:

sudo /usr/local/mysql/support-files/mysql.server stop
sudo /usr/local/mysql/support-files/mysql.server start

3

У моєму випадку під Debian 10 помилка

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

було вирішено (ДОБРИЙ ШЛЯХ)

sudo mysql -u root -p mysql

НЕБЕЗПЕЧЕНИЙ:

mysql -u root -p mysql

3

Тюх, нічого не працювало для мене! У мене є машина CentOS 7.4, на якій працює маріадб 5.5.64.

Що мені довелося зробити, це це, одразу після встановлення мариадбу з яму;

# systemctl restart mariadb
# mysql_secure_installation

mysql_secure_installationЧи прийме вас через ряд кроків, в тому числі «Встановити кореневої пароль? [Y / N]». Просто скажіть "у" і дайте йому пароль. Відповідайте на інші запитання, як хочете.

Потім ви можете зайти зі своїм паролем, використовуючи

# mysql -u root -p

Це виживе

# systemctl restart mariadb

Ключ

Потім я перевірив /bin/mysql_secure_installationвихідний код, щоб дізнатись, наскільки магічно вдалося змінити кореневий пароль, і жоден з інших відповідей тут не міг. Біт імпорту:

do_query "UPDATE mysql.user SET Password=PASSWORD('$esc_pass') WHERE User='root';"

... Це говорить SET Password=...і ні SET authentication_string = PASSWORD.... Отже, правильна процедура для цієї версії (5.5.64) така:

login using mysql -u root -p , using the password you already set.
Or, stop the database and start it with:
mysql_safe --skip-grant-tables --skip-networking &

З mysql> prompt:

use mysql;
select host,user,password from user where user = 'root';
(observe your existing passwords for root).
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root' AND host = 'localhost';
select host,user,password from user where user = 'root';
flush privileges;
quit;

вбити запущений mysqld_safe. перезапустити mariadb. Увійдіть в систему як привілейований користувач: mysql -u -p. Використовуйте новий пароль.

Якщо ви хочете, ви можете встановити всі кореневі паролі відразу. Я думаю, що це мудро:

mysql -u root -p
(login)
use mysql;
select host,user,password from user where user = 'root';
UPDATE mysql.user set Password = PASSWORD('your_new_cleartext_password') where user = 'root';
select host,user,password from user where user = 'root';
flush privileges;
quit;

Це здійснить оновлення для всіх кореневих паролів: тобто для "localhost", "127.0.0.1" та ":: 1"

Надалі, коли я перейду до RHEL8 чи що у вас є, я спробую пам'ятати, щоб перевірити / bin / mysql_secure_installation і побачити, як це зробили хлопці, хто налаштував mariadb для цієї ОС.


2

Якщо ви схожі на мене, і всі перераховані вище пропозиції не вдалися, перейдіть до видалення всіх версій mysql на вашій машині, знайдіть усі файли mysql, використовуючи цю команду, sudo find / -name "mysql"і rm -rfкожен файл чи каталог із доданим до нього ім'ям mysql (слід пропустити пов'язані файли до бібліотек мов програмування). Тепер встановіть нову версію MySQL і насолоджуйтесь. NB: Ви втратите всі свої дані, тому спочатку зважте свої варіанти.


1

Це може статися, якщо у вас недостатньо привілеїв. Введіть su, введіть кореневий пароль та спробуйте ще раз.


1

Гаразд, я знаю, що це стара тема, але якщо ви зайшли на цю сторінку через Google, як я, і жодне з перерахованих вище рішень не спрацювало, помилка виявилася на 100% глупоті. Я не підключився до сервера. Після з'єднання все було плавним плаванням.

У випадку, якщо це допомагає дізнатися мою настройку, я використовую Sequel Pro і намагаюся підключитися до нього з Node, використовуючи пакет NPM, mysql. Я не думав, що мені потрібно фактично підключатися (крім запуску Sequel Pro), тому що я вже робив це з мого додатка.

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


0

Рішення: Відмовтеся!

Почуйте мене, я пробув близько двох цілих днів, намагаючись змусити MySQL працювати безрезультатно, завжди застряг у помилках дозволу, жодна з яких не була виправлена ​​відповідями в цій темі. Це дійшло до того, що я думав, що якщо я продовжую, я зроблю з розуму.

Не постраждавши від того, щоб він працював, я надіслав команду встановити SQLite, використовуючи лише 450 Кб, і він працював ідеально від слова go.

Якщо у вас немає терпіння святого, ідіть із SQLite та заощадите собі багато часу, сил, болю та місця для зберігання ..!

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