MariaDB - 无法以root用户身份登录

emi*_*ir0 7 mysql mariadb

我试图在Ubuntu(16.04.02)上设置MariaDB(10.0.29).在我安装并启动进程(sudo service mysql start)之后,root即使我最初将密码设置为空白,也无法登录.

mysql -u root会拒绝我的访问.我登录sudo mysql并检查了用户表,即.select user, password, authentication_string from mysql.user和预期一样:

+---------+----------+-----------------------+ 
| User    | password | authentication_string |
+---------+----------+-----------------------+
| root    |          |                       |
+---------+----------+-----------------------+
Run Code Online (Sandbox Code Playgroud)

我还创建了一个新用户,即.create user 'test'@'localhost' identified by '';当我尝试做mysql -u test(空密码)时,它按预期工作并登录我.

用户表如下所示:

+---------+----------+-----------------------+
| User    | password | authentication_string |
+---------+----------+-----------------------+
| root    |          |                       |
| test    |          |                       |
+---------+----------+-----------------------+
Run Code Online (Sandbox Code Playgroud)

所以,任何人都可以告诉我为什么我不能像root空密码一样登录,但我可以登录test

ele*_*nst 17

与本机MariaDB软件包(由MariaDB本身提供的软件包)不同,默认情况下由Ubuntu生成的软件包具有针对本地根的unix_socket认证.检查,运行

SELECT user, host, plugin FROM mysql.user;
Run Code Online (Sandbox Code Playgroud)

如果你unix_socketplugin专栏中看到,那就是原因.

要返回通常的密码验证,请运行

UPDATE mysql.user SET plugin = '' WHERE plugin = 'unix_socket';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

(选择WHERE适合您目的的条款,上面只是一个例子)


TCB*_*B13 5

您遇到的问题是由于 MariaDB 10.4 的身份验证系统发生了变化:

经过以上改动,人人皆可的全能root账号终于没了。(...) 因为 root 帐户是自动安全创建的。它们被创建为:CREATE USER root@localhost IDENTIFIED VIA unix_socket OR mysql_native_password USING 'invalid'

如果你真的想访问你的数据库root,你应该通过 cli 登录mariadb -p并运行:

ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("your-password-here");
Run Code Online (Sandbox Code Playgroud)

来源:https : //mariadb.com/kb/en/library/authentication-from-mariadb-104/#altering-the-user-account-to-revert-to-the-previous-authentication-method

关于下面的其他解决方案:它们将不起作用,因为 MariaDB 也不允许您更新plugin列:ERROR 1348 (HY000): Column 'plugin' is not updatable.~


2020 年更新:虽然我上面的解决方案有效,但它用unix_socket密码替换了默认的 root身份验证。我注意到这会破坏诸如 mariadb 升级/您自己的维护脚本之类的任务,这些脚本期望在以 root 身份运行时无需额外密码即可连接到数据库。

我的建议是添加一个新的 root 登录名,如下所示:

CREATE USER `root`@`%` IDENTIFIED WITH mysql_native_password using PASSWORD('your-password-here');
GRANT ALL PRIVILEGES ON *.* TO `root`@`%` WITH GRANT OPTION;
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

这将有效地仍然允许 root 登录的默认行为,并使用密码添加对数据库的外部访问