ПОМИЛКА 1698 (28000): Доступ заборонено для користувача 'root'@'localhost'

Я встановлюю новий сервер і продовжую стикатися з цією проблемою.

Коли я намагаюся увійти в базу даних MySQL з правами користувача root, я отримую помилку:

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

Не має значення, чи підключаюся я через термінал (SSH), через PHPMyAdmin або MySQL-клієнт, наприклад, Navicat. Всі вони зазнають невдачі.

Я подивився в таблицю mysql.user і отримав наступне:

+------------------+-------------------+
| user             | host              |
+------------------+-------------------+
| root             | %                 |
| root             | 127.0.0.1         |
| amavisd          | localhost         |
| debian-sys-maint | localhost         |
| iredadmin        | localhost         |
| iredapd          | localhost         |
| mysql.sys        | localhost         |
| phpmyadmin       | localhost         |
| root             | localhost         |
| roundcube        | localhost         |
| vmail            | localhost         |
| vmailadmin       | localhost         |
| amavisd          | test4.folkmann.it |
| iredadmin        | test4.folkmann.it |
| iredapd          | test4.folkmann.it |
| roundcube        | test4.folkmann.it |
| vmail            | test4.folkmann.it |
| vmailadmin       | test4.folkmann.it |
+------------------+-------------------+

Як бачите, root повинен мати доступ.

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

Він працює під управлінням Ubuntu 16.04.1 LTS з Apache, MySQL та PHP, що дозволяє розміщувати на ньому веб-сайти, та iRedMail 0.9.5-1, що дозволяє розміщувати на ньому пошту.

Вхід в базу даних MySQL працює нормально до того, як я встановлюю iRedMail. Я також спробував, просто встановити iRedMail, але потім root, також не працює ...

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

Рішення

У деяких системах, таких як Ubuntu, mysql за замовчуванням використовує UNIX auth_socket plugin.

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

$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user;

+------------------+-----------------------+
| User             | plugin                |
+------------------+-----------------------+
| root             | auth_socket           |
| mysql.sys        | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------+

Як видно із запиту, користувач root використовує плагін auth_socket.

Вирішити цю проблему можна 2 способами:

  1. Можна задати користувачеві root використання плагіна `mysql_native_password
  2. Можна створити нового користувача db_user з вашим ystem_user (рекомендується)

Варіант 1:

$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ service mysql restart

Варіант 2: (замініть YOUR_SYSTEM_USER на ваше ім'я користувача)

$ sudo mysql -u root # I had to use "sudo" since is new installation

mysql> USE mysql;
mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY '';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost';
mysql> UPDATE user SET plugin='auth_socket' WHERE User='YOUR_SYSTEM_USER';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ service mysql restart

Пам'ятайте, що якщо ви використовуєте варіант #2, вам доведеться підключатися до mysql від імені вашого системного користувача (mysql -u YOUR_SYSTEM_USER)

Примітка: У деяких системах (наприклад, Debian stretch) плагін 'auth_socket' називається 'unix_socket', тому відповідна SQL команда повинна бути: UPDATE user SET plugin='unix_socket' WHERE User='YOUR_SYSTEM_USER';.

Оновлення: З коментаря @andy здається, що mysql 8.x.x оновив/замінив auth_socket для caching_sha2_password У мене немає налаштувань системи з mysql 8.x.x, щоб перевірити це, однак наведені вище кроки повинні допомогти вам зрозуміти проблему. Ось відповідь:

Однією зі змін, починаючи з MySQL 8.0.4, є те, що новим плагіном автентифікації за замовчуванням є 'caching_sha2_password'. Новий 'YOUR_SYSTEM_USER' буде мати цей плагін авторизації і тепер ви можете увійти в систему з оболонки bash за допомогою "mysql -u YOUR_SYSTEM_USER -p" і вказати пароль для цього користувача у відповідному запиті. Немає необхідності в кроці &quo ;UPDATE user SET plugin&quo ;. Оновлення плагіна за замовчуванням до версії 8.0.4 див. за посиланням https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/.

Коментарі (23)

Я б запропонував прибрати з'єднання Mysql -

ОНОВЛЕННЯ-Це для Mysql версії 5.5, якщо ваша версія відрізняється, будь ласка, змініть перший рядок відповідно

sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-core-5.5 mysql-client-core-5.5
sudo rm -rf /etc/mysql /var/lib/mysql
sudo apt-get autoremove
sudo apt-get autoclean

І встановіть знову, але цього разу встановіть пароль root самостійно. Це заощадить багато зусиль.

sudo apt-get update
sudo apt-get install mysql-server
Коментарі (3)

Ви хочете отримати доступ до MySQL від імені користувача root, але ви не надаєте правильний пароль root.

Якщо вам потрібно встановити новий пароль для root, на сайті MySQL є чудова документація про те, як це зробити: http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html

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

Коментарі (3)