Короче, на MariaDB
UPDATE mysql.user SET plugin = 'mysql_native_password',
Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
где вы заменяете NEWPASSWORD на нужный вам пароль, а все остальное дословно.
Проблема здесь в том, что когда MariaDB или MySQL установлены / обновлены (особенно если в какой-то момент root установлен без пароля), тогда в таблице Users пароль фактически пуст (или игнорируется), и вход в систему зависит от пользователя системы, соответствующего пользователю MySQL. Вы можете проверить это следующим образом, перейдя в корневой каталог системы, а затем введите:
mysql -uroot -p
Затем введите либо пароль, либо неверный пароль. Скорее всего, вас впустят. (Вы даже можете войти в систему из корня unix просто # mysql
потому, что пароль не имеет значения и пользователь определен).
Так что же происходит? Хорошо, если вы войдете в систему как root и сделаете следующее:
select User,host,plugin from mysql.user;
+----------------+-----------+-----------------------+
| User | host | plugin |
+----------------+-----------+-----------------------+
| root | localhost | auth_socket |
+----------------+-----------+-----------------------+
Вы заметите auth_socket
(что можно прочитать unix_socket
на MariaDB). Эти сокеты игнорируют пароли и позволяют соответствующему пользователю Unix войти без проверки пароля. Вот почему вы можете войти в систему как root, но не с другим пользователем.
Таким образом, решение состоит в том, чтобы обновить пользователей, чтобы они не использовали auth_socket/unix_socket
и правильно установить пароль.
На MariaDB (<10.2, см. Комментарии ниже), который на Ubuntu версии 16 на 2017 год, этого должно быть достаточно. NEWPASSWORD - это ваш пароль. mysql_native_password
вы вводите дословно.
UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
(Возможно, что установка плагина на пустой будет работать. YMMV. Я не пробовал это. Так что это альтернатива.)
UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
В противном случае:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';
затем
FLUSH PRIVILEGES;
Напомним, что решение, включающее удаление пользователя и воссоздание его с помощью «%», полностью блокирует меня из базы данных и может вызвать другие проблемы, если вы не получите grant
правильное утверждение - проще просто обновить корень, который у вас уже есть.
По моему опыту, проблема возникает только с пользователем root, так как другие пользователи будут добавлены вручную, а не частью первоначальной установки / обновления.