无法从 ubuntu 16.04 中的普通用户帐户以 mysql 用户 root 身份登录

无法从 ubuntu 16.04 中的普通用户帐户以 mysql 用户 root 身份登录

我刚刚安装了 Ubuntu 16.04 LTS 以及软件包phpmariadbnginx。我运行mysql_secure_installation并更改了 root 密码。

现在,当我尝试mysql使用 root 帐户登录,同时以普通用户帐户登录 Ubuntu 时,访问被拒绝。

当我使用 登录时sudo mysql,mysql 甚至不会询问我密码。如果我运行,mysql_secure_installtion我会看到旧设置从未被永久设置。

我究竟做错了什么?

答案1

我最近将我的 Ubuntu 15.04 升级到 16.04,这对我来说很有效:

  1. 首先,使用 sudo mysql 连接

     sudo mysql -u root
    
  2. 检查数据库中的账户

     SELECT User,Host FROM mysql.user;
     +------------------+-----------+
     | User             | Host      |
     +------------------+-----------+
     | admin            | localhost |
     | debian-sys-maint | localhost |
     | magento_user     | localhost |
     | mysql.sys        | localhost |
     | root             | localhost |
    
  3. 删除当前 root@localhost 帐户

     mysql> DROP USER 'root'@'localhost';
     Query OK, 0 rows affected (0,00 sec)
    
  4. 重新创建您的用户

     mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY '';
     Query OK, 0 rows affected (0,00 sec)
    
  5. 向您的用户授予权限(不要忘记刷新权限)

     mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
     Query OK, 0 rows affected (0,00 sec)
    
     mysql> FLUSH PRIVILEGES;
     Query OK, 0 rows affected (0,01 sec)
    
  6. 退出 MySQL 并尝试从本地机器以不使用 sudo 的方式重新连接。

编辑:先前版本的回答帖子建议创建一个用户'root'@'%'。但是,创建用户更安全,'root'@'localhost'因此只能从本地主机进行连接,而不能远程进行连接。这两种解决方案对于本地开发同样有效。

我希望这会对某人有所帮助:)

答案2

如果您安装 5.7 并且不向用户提供密码root,它将使用该auth_socket插件。该插件不关心密码,也不需要密码。它只是检查用户是否使用 UNIX 套接字进行连接,然后比较用户名。

取自使用“插件:auth_socket”在 MySQL 5.7 中更改用户密码

因此为了将其改pluginmysql_native_password

  1. 使用 sudo 登录:

    sudo mysql -u root
    
  2. plugin使用单个命令更改和设置密码:

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
    

当然你也可以使用上面的命令设置一个空密码。

仅供记录(和MariaDB < 10.2用户),还有另一种方法可以仅更改plugin而不提供密码(将其留空):

update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;

答案3

简而言之,在 MariaDB 上

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

其中,将 NEWPASSWORD 替换为您想要的密码,并将其余所有内容逐字逐句地替换。

这里的问题是,当安装/更新 MariaDB 或 MySQL 时(特别是如果在某个时候设置了 root 而没有密码),则在用户表中,密码实际上为空(或被忽略),并且登录取决于与 MySQL 用户相对应的系统用户。您可以通过切换到系统 root 来按如下方式测试,然后输入:

mysql -uroot -p

然后输入无密码或错误的密码。您可能会被允许进入。(您甚至可以简单地从 unix root 登录,# mysql因为密码无关紧要,并且用户已定义)。

那么发生了什么?好吧,如果你以 root 身份登录并执行以下操作:

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

你会注意到auth_socket(在 MariaDB 上可能会看到unix_socket)。这些套接字会忽略密码,并允许相应的 Unix 用户没有密码检查。这就是为什么你可以使用但不能与其他用户共享。

因此解决方案是更新用户不要使用auth_socket/unix_socket并正确设置密码。

在 MariaDB(<10.2,见下面的评论)上(截至 2017 年,Ubuntu 版本为 16),这应该足够了。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完全正确地获得语句 - 更容易简单地更新您已有的根。

根据我的经验,该问题仅发生在根用户身上,因为其他用户将被手动添加,而不是初始安装/更新的一部分。

答案4

尝试创建新的 mysql 帐户,对我来说它已经起作用了(mysql 5.7.12):

  1. 以 sudo 身份登录:

    sudo mysql -uroot
    
  2. 创建新用户并授予其权限(无密码):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. 以新用户身份登录:

    mysql -uadmin
    

相关内容