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


382

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

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

ПОМИЛКА 1698 (28000): Доступ заборонено користувачеві '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 |
+------------------+-------------------+

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

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

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

Увійти в базу даних MySQL працює чудово, перш ніж встановити iRedMail. Я також спробував, просто встановивши iRedMail, але потім root, також не працює ...

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


Я перейшов за цим посиланням, і перший варіант спрацював для мене: askubuntu.com/questions/763336/…
Mikael Arhelger

3
sudo mysql_secure_installationнайпростіший спосіб це виправити
Сергій Пономарьов

Відповіді:


1119

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

В основному означає, що: db_users, що використовує його, буде "автентичним" обліковими записами користувачів системи. Ви можете побачити, чи 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плагін

Є два способи вирішити це:

  1. Ви можете встановити root користувача, щоб використовувати mysql_native_passwordплагін
  2. Ви можете створити новий db_userз вами system_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.xx оновлено / замінено на auth_socketдля caching_sha2_passwordмене не встановлено системну установку з mysql 8.xx, проте кроки вище повинні допомогти вам зрозуміти проблему. Ось відповідь:

Однією із змін у MySQL 8.0.4 є те, що новий плагін аутентифікації за замовчуванням - це "кешування_ша2_парлова". Новий 'YOUR_SYSTEM_USER' матиме цей плагін auth, і ви можете увійти з bash shell тепер за допомогою "mysql -u YOUR_SYSTEM_USER -p" та вкажіть пароль для цього користувача у відповідь. Немає необхідності в кроці "ОНОВЛЕННЯ плагіна користувача". Інформацію про оновлення плагіна 8.0.4 за замовчуванням див. Https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/


5
Варіант 1 працював на мене. Але тоді мені теж потрібно було бігати sudo gedit /etc/phpmyadmin/config.inc.php. Потім я здійснив пошук AllowNoPasswordі прокоментував обидва рядки, які містили його. Тоді я зміг увійти як root без пароля.
Джо

7
Варіант 2 працює. Я думаю, що завжди найкраща практика створити нового користувача та використовувати root, щоб бути там!
PasinduJay

2
IDENTIFIED BY ''біт повинен , ймовірно,IDENTIFIED BY 'YOUR_PASSWD'
YakovL

4
Нарешті, відповідь, яка насправді працює !! Там є мільйон відповідей, які говорять, що робити mysqld_safe --skip-grant-tablesтощо, і це не працює.
Стюарт

4
Гаразд, як це зробити, якщо sudo mysql -u root -pмене не пускають?
Хрвойо Т

173

Перевірте тут:

НОВА версія MYSQL робить це так.

У новому my-sql, якщо пароль залишається порожнім під час встановлення, він базується на auth_socketплагіні.

Правильний спосіб - увійти в my-sql з sudoпривілеєм.

$ sudo mysql -u root -p

А потім оновлення пароля за допомогою:

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

Як тільки це робиться stop and startсервер mysql.

$  sudo service mysql stop
$  sudo service mysql start

Для отримання повної інформації ви можете звернутися за цим посиланням .

Прокоментуйте будь-які сумніви.


4
Це працювало для мене за допомогою Ubuntu 18. Дякую sooo.
Пітер Дрінан

10
Працював також на ubuntu 18.04
sgtkuncoro

2
Саме те, що я шукав. Дякую :) Працювали над Ubuntu 18
Manthan_Admane

2
це спрацювало як шарм, лубунту 19.04
Квадвара

3
Це добре працює. Посилання корисне.
kjohri

9

У мене виникло це питання на Debian 8 VM, з яким я спілкувався через Putty на своєму робочому столі Windows 10.

Я спробував тут різні пропозиції, але нічого не вийшло, і я запускаю MariaDB на хості Debian. Зрештою я виявив, що я не міг запустити db-сервер у безпечному режимі, але мені не потрібно було, і наступні команди насправді працювали для мене, тобто дозволяючи новоствореному користувачеві MySql увійти на сервер MySql / MariaDB:

sudo service mysql restart
sudo mysql # logs in automatically into MariaDB
use mysql;
update user set plugin='' where user='your_user_name';
flush privileges;
exit;
sudo service mysql restart # restarts the mysql service

Якщо вищезгадане не дуже спрацьовує для вас, виконайте кроки, викладені в дописі zetacu ( zetacu ), а потім виконайте мої кроки.

Тепер ви повинні мати можливість використовувати віддалений клієнт-термінал і надійно увійти в mysql за допомогою команди:

mysql -u your_user_name -p

* введіть пароль, коли буде запропоновано


Це просто. Ну, тільки перша команда не дозволяє виконати другу, тож я налаштую її редагування - будь ласка, подивіться, чи я правий ...
kokbira

7

Я б запропонував видалити з'єднання 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

@ingernet, можливо, це через деякі інші проблеми, якими ви нехтували під час інсталяції
Eminem347

@PJBrunet, можливо, причина вашої версії Mysql інша
Eminem347

Досить справедливо, але найкраще всебічне рішення.
PJ Brunet

6

Після години боротьби з рішенням тут це не спрацювало, тоді я знайшов відео на YouTube, де написано, що стовпець паролів тепер називається authentication_string. Тож я зміг змінити свій пароль так: Спершу потрапляйте в mysql з терміналу

sudo mysql

то всередині mysql введіть те, що після mysql>

mysql> use mysql
mysql> update user set authentication_string=PASSWORD("mypass") where user='root';
mysql> flush privileges;
mysql> quit;

в цей момент ви перебуваєте з mysql назад до свого звичайного термінального місця. Вам потрібно перезапустити mysql, щоб це набуло чинності. для цього типу:

sudo service mysql restart

Для кращого розуміння зверніться до цього відеопосилання


5

крок 1. sudo mysql -u root -p

крок 2. USE mysql;

крок 3. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'admin';

Тут "адміністратор" - ваш новий пароль, і ви можете його змінити.

крок 4. exit

Дякую. Ви закінчили.


5

Судо не потрібно

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

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

mysql -u $(whoami)

і вручну змінити пароль для root

use mysql;
set password for 'root'@'localhost' = password('YOUR_ROOT_PASSWORD_HERE');
flush privileges;
quit

Увійти як "корінь"

mysql -u root -p

Ви правильна відповідь для фактичної версії mysql, дякую!
Hugo S

3

Перший крок: перейдіть до /etc/phpmyadmin/config.inc.php, а потім рядки для коментарів, де ви знайдете AllowNoPassword. Другий крок: увійдіть у свій обліковий запис mysql за замовчуванням

mysql -u root -p
use mysql;
update user set plugin="" where user='root';
flush privilege;

і це все!


3

Це працювало для мене:

mysql --user=root mysql
CREATE USER 'some_user'@'%' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'some_user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

3

Я також зіткнувся з тим же питанням вперше.

Тепер це виправлено:

По-перше, ви скопіюєте /etc/mysql/mysql.conf.d/mysqld.cnfфайл і минуле в /etc/mysql/my.cnf.

Це можна зробити за допомогою команди:

sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf

Тепер давайте залишити пароль:

Використовуйте наступні команди у своєму терміналі:

sudo service mysql stop 
sudo service mysql start
sudo mysql -u root

Тепер ви знаходитесь всередині консолі mysql.

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

USE mysql
update mysql.user set authentication_string=password('newpass') where user='root' and Host ='localhost';
update user set plugin="mysql_native_password"; 
flush privileges;
quit

Тепер ми можемо прибирати /etc/mysql/my.cng

Відкрийте вищезазначений файл у своєму редакторі та видаліть цілі рядки всередині файлу.

Після цього давайте перезапустимо mysql:

sudo mysql service restart 

Тепер давайте використовувати mysql з новоствореним паролем:

sudo mysql -u root -p

Нарешті введіть свій щойно створений пароль.


1
Добре працювали! але вашу відповідь потрібно оновити !! /etc/mysql/my.cnf, а не /etc/mysql/my.cng, а для сервісу перезавантажте свою службу sudo mysql restart
essayoub

3

Я знайшов своє рішення після години досліджень тут.

Зупиніть MySQL

sudo service mysql stop

Складіть каталог служб MySQL.

sudo mkdir /var/run/mysqld

Надати користувачеві MySQL дозвіл на запис у службовий каталог.

sudo chown mysql: /var/run/mysqld

Запустіть MySQL вручну, без перевірки дозволів чи встановлення мереж.

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

Увійдіть без пароля.

 mysql -uroot mysql

оновити пароль

UPDATE mysql.user SET authentication_string=PASSWORD('YOURNEWPASSWORD'), plugin='mysql_native_password' WHERE User='root' AND Host='%';
EXIT;

Вимкніть MySQL.

sudo mysqladmin -S /var/run/mysqld/mysqld.sock shutdown

Запускайте сервіс MySQL нормально.

sudo service mysql start

Це отримало мені підказку mysql, коли НІЩО НЕ БУДЕ! Дякую!
UserX

2

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

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

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


Дякую за кошторис, але мені не вдалося змусити його працювати, тому я вирішив встановити iRedMail із базою даних pgSQL.
Фолькман

Роджер Фолкман! Приємно знати, що ви вирішили свою проблему як завгодно.
Крістіан Гонсалвес

Розрив посилань. Протягом багатьох років на mysql.com було багато ламаних посилань. Ви повинні скопіювати та вставити відповідну інформацію сюди, що добре, якщо ви приписуєте джерело.
Гусь

1

os: Ubuntu18.04

mysql: 5.7

  1. додайте skip-grant-tablesфайл у кінець файлу mysqld.cnf

  2. cp my.cnf

sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf
  1. скинути пароль
(base)   ~ sudo service mysql stop 
(base)   ~ sudo service mysql start
(base)   ~ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed, 3 warnings
mysql> update mysql.user set authentication_string=password('newpass') where user='root' and Host ='localhost';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

mysql> update user set plugin="mysql_native_password"; 
Query OK, 0 rows affected (0.00 sec)
Rows matched: 4  Changed: 0  Warnings: 0

mysql>  flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye
  1. видалити skip-grant-tablesз my.cnf
(base)   ~ sudo emacs /etc/mysql/mysql.conf.d/mysqld.cnf 
(base)   ~ sudo emacs /etc/mysql/my.cnf                 
(base)   ~ sudo service mysql restart
  1. відкрити mysql
(base)   ~ mysql -uroot -ppassword 
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> 
  1. перевірити політику паролів
mysql> select @@validate_password_policy;
+----------------------------+
| @@validate_password_policy |
+----------------------------+
| MEDIUM                     |
+----------------------------+
1 row in set (0.00 sec)


mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
6 rows in set (0.08 sec)!
  1. змінити конфігурацію validate_password
mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.05 sec)

mysql> set global validate_password_mixed_case_count=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_number_count=3;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_special_char_count=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_length=3;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_dictionary_file    |       |
| validate_password_length             | 3     |
| validate_password_mixed_case_count   | 0     |
| validate_password_number_count       | 3     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 0     |
+--------------------------------------+-------+
6 rows in set (0.00 sec)

зауважте, ви повинні знати, що ви помилка викликана чим? validate_password_policy?

ви повинні вирішити скинути пароль, щоб заповнити політику або змінити політику.


0

Це сталося і зі мною. Проблема полягає в репортажі mysql, який поставляється вже з дистрибутивом Linux. Отже, коли ви просто робите: $ sudo apt install mysql-server він встановлює mysql зі свого репо за замовчуванням, що спричиняє цю проблему. Тож для подолання цього вам потрібно видалити встановлений mysql $ sudo apt remove mysql* --purge --auto-remove

Потім завантажте mysql repo з офіційного веб-сайту mysql MySQL APT Repo Дотримуйтесь їх документації щодо того, як додати репо і встановити її. Це не викликає жодних проблем. Також, як відповів @zetacu, ви можете переконатися, що корінь mysql справді використовує плагін mysql_native_password


0

в моєму випадку,

dev@Dev-007:~$ mysql -u root -p
Enter password: 
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

Я впевнений, що мій пароль був правильним, інакше буде код помилки ERROR 1045 (28000): Access denied for user

тому я переглядаю судо,

dev@Dev-007:~$ sudo mysql -u root -p

цього разу це працювало на мене. дивись документи

а потім змінити кореневий пароль,

mysql> alter user 'root'@'%' identified with mysql_native_password by 'me123';
Query OK, 0 rows affected (0.14 sec)

mysql> 

потім перезавантажте сервер за допомогою sudo /etc/init.d/mysql restart

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