无法从ubuntu 16.04中的普通用户帐户作为mysql用户root登录


203

我刚安装了Ubuntu LTS 16.04与包一起phpmariadbnginx。我运行mysql_secure_installation并更改了root密码。

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

当我使用登录时sudo mysql,mysql甚至都不问我密码。如果我跑步,mysql_secure_installtion我会看到旧设置永远不会永久设置。

我究竟做错了什么?

Answers:


359

我最近将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'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  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)
    
  6. 退出MySQL并尝试在没有sudo的情况下重新连接。

我希望这会帮助某人:)


16
这是唯一对我有用的东西,当您在16.04上安装mysql-server时,有人确切知道root用户会发生什么吗?
Ruggi

32
握住它,这并不%意味着您可以从任何地方...远程连接?
Stevie G

9
您可以将行更改为:CREATE USER'root'@'localhost'IDENTIFIED BY'';
vladnev

11
对于安全性考虑:不安全的root @ localhost mysql连接模式是本地开发的主要内容,绝对没有其他地方。
查尼·凯

5
在这里为新的root用户授予的声明不会给root以“ with grant”,因此root不能在不运行此命令 的情况下进行授予:dba.stackexchange.com/a/62046/115679请将Grant声明更改为grant all privileges on *.* to 'root'@'localhost' with grant option;
Loren

132

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

取自MySQL 5.7中带有“插件:auth_socket”的更改用户密码

因此为了将其更改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;

2
谢谢,由于某种原因,我认为在apt-get升级后,此设置会突然自动设置...
Tominator

4
另外,我更喜欢这个答案-破坏性更小;-)
benzkji

3
对于MariaDB <10.2,要更改插件以及密码,请执行以下查询:UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;来源:stackoverflow.com/a/41537019/1004587
Pothi Kalimuthu

5
这应该是公认的答案
Geo

3
我希望我可以投票两次。
詹姆斯·史密斯

21

简而言之,关于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并正确设置密码。

在截至2017年的Ubuntu版本16上的MariaDB(<10.2,请参阅下面的注释)上,就足够了。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用户上,因为其他用户将被手动添加,而不是初始安装/更新的一部分。


2
发现这很完美。让我感到奇怪的是,为什么用root密码更改mysql_secure_installation并没有相同的效果。它在哪里存储新密码?
Mausy5043

您可以随时编辑答案并进一步讲解每个命令吗?我不清楚哪个适用。是UPDATE适用于MariaDB <10.2和ALTER其他版本的两个s 吗?第二个是第UPDATE一个的替代品,还是我们需要同时输入两者?最后,'mysql_native_password'是逐字键入的内容,还是我们应该将其替换为MySQL的预期根密码?
迈克尔·谢珀

1
@MichaelScheper已经有一段时间了,所以我不想编辑太多,但这就是我所记得的。(1)仅执行第一个UPDATE(可能不需要<10.2)。(2)是的,逐字键入“ mysql_native_password”。本质上,您正在做的就是告诉mariadb:“不要使用Unix特权,而要使用数据库特权”。该mysql_native_password是选项。
加泽尔

该死,我拼写的“特权”错了!
Gazzer

1
看来您也只错过了1.5分钟的编辑时间限制!有时我也为此感到沮丧。无论如何,谢谢!
Michael Scheper '18

8

如果您已从基本存储库安装了MySQL / MariaDB,则用户无法从其Unix登录名作为MySQL根用户登录MySQL(如果具有sudo访问权限,则不适用)

  1. 登录到MySQL root shell:

    $ sudo mysql -u root -p
    
  2. 执行以下查询:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. 打开一个新的shell,然后:

    $ mysql -u root -p
    

资源


当我这样做时,我不能再将sudo mysql作为root了。我必须先使用su,然后才能以root用户身份登录mysql。所以我将其更改回auth_socket。
直到

单一命令:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
克里斯·斯特里钦斯基

如果您想失去对MySQL实例的访问权限,那么此答案是简单的方法。
Danila Vershinin

2

尝试创建新的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
    

2

我不得不做两件事(感谢@Todor和@Loremhipsum):

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

接着:

FLUSH PRIVILEGES;

我不建议删除user root


1

首先尝试此代码,

echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql 
echo "FLUSH PRIVILEGES;" >> your_init_file.sql

接着,

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

然后按Ctrl+Z并输入:bg以从前台到后台运行该进程,然后通过以下方法验证您的访问权限:

mysql -u root -proot
mysql> show grants;

1

如果您仅在root用户下运行mysql命令,则将被授予访问权限而无需输入密码,因为已为root @ localhost启用了套接字身份验证。。

设置密码的唯一方法是切换到本地身份验证,例如:

$ sudo mysql

mysql> ALTER USER'root'@'localhost'用mysql_native_password标识'test';


0

我一直在修改我创建的一些配置脚本以使用MariaDB,并遇到了这个确切的问题。在这里汇集了大量信息,Gazzer的回答实际上是零。全部归结为auth_socket/ unix_socket设置。

因此,当使用MariaDB 5.5(在Ubuntu 14.04下)和MariaDB 10(在Ubuntu 16.04下)时,登录MySQL并运行此命令可立即清除所有内容:

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

其他答案(包括Loremhipsum所发表的文章中投票率最高的答案)通过建议删除用户然后重新创建它们来真正鼓励不良做法。对我来说,这是一个非常彻底的解决方案。最好/最简单的解决方案是使plugin值无效,清除特权并继续生活。


-1

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

mysql_upgrade --force

可悲的是,这没有用。我正在重新安装ubuntu。
Codescope

1
我刚刚重新安装了ubuntu 16.04,并安装了mariad-server。安装后,我运行mysql_secure_installation并设置密码。在完成了mysql_secure_installation中的其余步骤之后,我再次运行了它,看来它没有保存更改。我仍然无法从普通用户帐户登录。可能是错误吗?
codescope

这将永远无济于事。这个问题没有什么根本与实际安装MariaDB的二进制文件,而是用户的root设定与plugin是非标准设置。在这种情况下,DB升级可能会有所帮助的唯一极端情况是,如果mysql_upgrade流程本身考虑到了plugin我怀疑的设置,那是唯一的情况。
JakeGould
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.