ОШИБКА 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 |
+------------------+-------------------+

Как видите, root должен иметь доступ.

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

Он работает под управлением Ubuntu 16.04.1 LTS с Apache, MySQL и PHP, чтобы он мог размещать веб-сайты, и iRedMail 0.9.5-1, чтобы он мог размещать почту.

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

Если кто-то может сказать мне, как я могу исправить мою проблему входа в MySQL или как я устанавливаю iRedMail, поверх существующей установки MySQL. И да, я попробовал советы по установке, и я не могу найти эти переменные в файлах конфигурации.



3
sudo mysql_secure_installationпроще всего это исправить
Сергей Пономарев

Ответы:


1121

В некоторых системах, таких как 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плагин

Есть 2 способа решить эту проблему:

  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 заключается в том, что новый подключаемый модуль аутентификации по умолчанию - caching_sha2_password. Новый 'YOUR_SYSTEM_USER' будет иметь этот плагин auth, и теперь вы можете войти в оболочку bash с помощью "mysql -u YOUR_SYSTEM_USER -p" и предоставить пароль для этого пользователя в приглашении. Нет необходимости в шаге «UPDATE user SET plugin». Обновление плагина аутентификации по умолчанию для 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меня не пускают?
Hrvoje T

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 startMySQL сервер.

$  sudo service mysql stop
$  sudo service mysql start

Для получения полной информации вы можете обратиться по этой ссылке .

Прокомментируйте любые сомнения.


4
Это сработало для меня, используя Ubuntu 18. Большое спасибо.
Питер Дриннан

10
Работал так же на Ubuntu 18.04
sgtkuncoro

2
Именно то, что я искал. Спасибо :) Работал над Ubuntu 18
Manthan_Admane

2
это работало как очарование, lubuntu 19.04
Kvvaradha

3
Это хорошо работает. Ссылка полезная.
Кьохри

9

У меня была эта проблема на виртуальной машине Debian 8, с которой я взаимодействовал через Putty на моем рабочем столе Windows 10.

Я попробовал различные предложения здесь, но ничего не получилось, и я запускаю MariaDB на хосте Debian. В конце концов я обнаружил, что не могу запустить сервер БД в безопасном режиме, но мне это не нужно, и следующие команды действительно работают для меня, то есть позволяют вновь созданному пользователю 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 Брюне

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';

Здесь «admin» - ваш новый пароль, вы можете изменить его.

Шаг 4 exit

Спасибо. Вы сделали.


5

Нет необходимости судо

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

Чтобы разрешить доступ к учетной записи root, вам необходимо войти под своим именем пользователя

mysql -u $(whoami)

и вручную сменить пароль на root

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

Войти как root

mysql -u root -p

Вы правильный ответ для актуальной версии MySQL, спасибо!
Хьюго С

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 service 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/en/resetting-permissions.html

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


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

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

Ссылки ломаются. У mysql.com было много неработающих ссылок за эти годы. Вы должны скопировать и вставить соответствующую информацию здесь, что хорошо, если вы указали источник.
Гусь

1

ОС: Ubuntu18.04

MySQL: 5,7

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

  2. cp the 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 с официального веб-сайта MySQL APT Repo. Следуйте их документации о том, как добавить репо и установить его. Это не дает проблемы. Также, ответив @zetacu, вы можете проверить, что root в 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

так что я заново использую sudo,

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

на этот раз у меня получилось. смотри документы

а затем измените пароль root,

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.