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

cod*_*ope 261 mysql permissions

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

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

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

我究竟做错了什么?

小智 472

我最近将我的 Ubuntu 15.04 升级到 16.04,这对我有用:

  1. 首先,在sudo mysql中连接

    sudo mysql -u root
    
    Run Code Online (Sandbox Code Playgroud)
  2. 检查您的数据库中存在的帐户

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
    Run Code Online (Sandbox Code Playgroud)
  3. 删除当前 root@localhost 帐户

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

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

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0,00 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0,01 sec)
    
    Run Code Online (Sandbox Code Playgroud)
  6. 退出 MySQL 并尝试在没有 sudo 的情况下重新连接。

我希望这会帮助某人:)

  • 等等,难道`%` 不是意味着你可以从任何地方...远程连接吗? (42认同)
  • 这是唯一对我有用的方法,有人知道在 16.04 上安装 mysql-server 时 root 用户到底发生了什么吗? (18认同)
  • 出于安全考虑:不安全的 root@localhost mysql 连接模式是本地开发的基本要素 *** 但是 *** 绝对不会出现在其他任何地方。 (14认同)
  • 您可以将行更改为: CREATE USER 'root'@'localhost' IDENTIFIED BY ''; (11认同)
  • 这里新 root 用户的授权声明没有给 root 提供“with grant”,所以 root 不能在不运行此之后授予:http://dba.stackexchange.com/a/62046/115679 请将授权声明更改为`使用授权选项将 *.* 上的所有权限授予 'root'@'localhost';` (5认同)
  • 这里到底发生了什么?它似乎只是像以前一样重新创建 root 用户。这个新的 root 用户和原来的 root 用户有什么区别? (4认同)
  • @JakeWilson 区别如下所述:https://askubuntu.com/a/964762/110005 此解决方案有效的原因是根是从头开始创建的,但其实施将导致未来的赠款问题,如这些中所述注释。简单地更新您拥有的 root 用户比创建一个新用户要容易得多。 (2认同)
  • “IDENTIFIED BY ''”是不是意味着任何人都可以在不提示输入密码的情况下以 root 身份登录?与 `'root'@'%'` 配合得很好,允许任何人从任何地方登录到您的服务器 =-D。我想知道这个答案是否是由擦除您数据库中的数据并要求赎金的黑客发布的...... (2认同)

Tod*_*dor 171

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

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

所以为了改pluginmysql_native_password

  1. 使用 sudo 登录:

    sudo mysql -u root
    
    Run Code Online (Sandbox Code Playgroud)
  2. plugin使用单个命令更改并设置密码:

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
    
    Run Code Online (Sandbox Code Playgroud)

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

只是为了记录,(和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;
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案 (9认同)
  • 另外,我更喜欢这个答案——它的破坏性要小得多;-) (5认同)
  • 对于 MariaDB &lt; 10.2,要更改插件和密码,这里是查询:`UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; 同花顺特权;` 来源:/sf/answers/2907591361/ (5认同)
  • 我希望我能投票两次。 (4认同)
  • 谢谢,由于某种原因,我认为在 apt-get 升级后突然自动设置了...... (2认同)

Gaz*_*zer 30

简而言之,在 MariaDB 上

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
Run Code Online (Sandbox Code Playgroud)

在那里你用你想要的密码替换 NEWPASSWORD,以及其他所有内容。

这里的问题是,当安装/更新 MariaDB 或 MySQL 时(尤其是在某些时候 root 没有设置密码)然后在用户表中密码实际上是空的(或被忽略),并且登录取决于相应的系统用户给 MySQL 用户。您可以通过切换到系统 root 来测试如下,然后键入:

mysql -uroot -p
Run Code Online (Sandbox Code Playgroud)

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

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

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+
Run Code Online (Sandbox Code Playgroud)

你会注意到auth_socket(可以unix_socket在 MariaDB 上阅读)。这些套接字忽略密码并允许相应的 Unix 用户在没有密码检查的情况下进入。这就是为什么您可以使用root登录但不能使用其他用户登录的原因。

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

在 2017 年的 Ubuntu 版本 16 上的 MariaDB(<10.2,请参阅下面的评论)上,这应该就足够了。NEWPASSWORD 是您的密码。mysql_native_password你逐字输入。

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
Run Code Online (Sandbox Code Playgroud)

(可能将插件设置为空会起作用。YMMV。我没有尝试过。所以这是一种替代方法。)

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';
Run Code Online (Sandbox Code Playgroud)

除此以外:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';
Run Code Online (Sandbox Code Playgroud)

然后

FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

作为记录,涉及删除用户并使用 '%' 重新创建它的解决方案让我完全被锁定在数据库之外,并且可能导致其他问题,除非您得到grant完全正确的语句 - 更容易简单地更新您已经拥有的根。

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

  • 发现这完美地工作。让我想知道为什么用 `mysql_secure_installation` 更改 root 密码没有同样的效果。它在哪里存储新密码? (2认同)

Gay*_*tti 16

默认情况下,root用户设置为通过auth_socket密码而不是密码进行身份验证。

为了使用密码身份验证,请执行以下操作:

  1. 登录到 MySQL 根 shell:

    sudo mysql
    
    Run Code Online (Sandbox Code Playgroud)
  2. 检查为不同用户启用的身份验证方法(可选)

    SELECT * FROM mysql.user;
    
    Run Code Online (Sandbox Code Playgroud)
  3. root用密码进行身份验证:

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here';
    
    Run Code Online (Sandbox Code Playgroud)
  4. 刷新权限以使更改生效;

    FLUSH PRIVILEGES;
    
    Run Code Online (Sandbox Code Playgroud)
  5. 退出并使用您的密码进行身份验证

     exit
     mysql -u root -p 
    
    Run Code Online (Sandbox Code Playgroud)


小智 3

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

  1. 以 sudo 身份登录:

    sudo mysql -uroot
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建新用户并授予他权限(无密码):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
    Run Code Online (Sandbox Code Playgroud)
  3. 以新用户身份登录:

    mysql -uadmin
    
    Run Code Online (Sandbox Code Playgroud)


小智 -2

我遇到了同样的问题并运行以下命令修复了它:

mysql_upgrade --force
Run Code Online (Sandbox Code Playgroud)