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

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

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

我在做什么错?

评论

如果您想恢复为默认密码,则可以减少通过unix_socket插件的root访问:sql UPDATE mysql.user SET plugin ='unix_socket'WHERE user ='root';刷新权限

#1 楼

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

检查数据库中是否存在您的帐户

sudo mysql -u root



删除当前root @ localhost帐户

SELECT User,Host FROM mysql.user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| admin            | localhost |
| debian-sys-maint | localhost |
| magento_user     | localhost |
| mysql.sys        | localhost |
| root             | localhost |



重新创建用户

mysql> DROP USER 'root'@'localhost';
Query OK, 0 rows affected (0,00 sec)



授予用户权限(不要忘记刷新权限) )

mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
Query OK, 0 rows affected (0,00 sec)


退出MySQL并尝试在没有sudo的情况下重新连接。

评论


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

–鲁吉
16年8月18日在17:45



握住它,不是%%表示您可以从任何地方...远程连接吗?

–斯蒂芬
16年11月4日在8:01

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

–vladnev
16 Dec 5'在8:36

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

– Charney Kaye
17年1月11日在20:31

在此,为新的root用户授予的语句不会为root提供“ with grant”,因此root无法在不运行此命令的情况下进行授予:dba.stackexchange.com/a/62046/115679请更改Grant语句以授予所有特权*。*到带有授予选项的'root'@'localhost';

–罗伦
17年4月4日14:17



#2 楼


如果您安装5.7并且未向root用户提供密码,则它会使用auth_socket插件。该插件无关紧要,
不需要密码。它只是检查用户是否正在使用UNIX套接字连接
,然后比较用户名。 />
因此,为了将plugin改回mysql_native_password



使用sudo登录: >

使用单个命令更改plugin并设置密码:

sudo mysql -u root



当然,您也可以使用以下命令上面设置了一个空密码。

为了记录,(和MariaDB < 10.2用户)还有另一种方法,只更改plugin而不提供密码(将其保留为空): br />
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';


评论


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

–终结者
16-10-28在9:32

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

– Benzkji
17年1月30日在11:27

对于MariaDB <10.2,要更改插件以及密码,请执行以下查询:UPDATE mysql.user SET plugin ='mysql_native_password',密码= PASSWORD('secret')WHERE User ='root';冲洗特权;资料来源:stackoverflow.com/a/41537019/1004587

–波西·卡利穆图(Pothi Kalimuthu)
17年7月11日在11:12

这应该是公认的答案

– Geo C.
17年11月17日在12:48

我希望我可以投票两次。

–詹姆斯·史密斯(James Smith)
18年3月22日在16:10

#3 楼

简而言之,在MariaDB

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


上,将NEWPASSWORD替换为所需的密码,而其他所有内容则逐字记录。当安装/更新MariaDB或MySQL时(尤其是在某个时候设置了root且没有密码),那么在Users表中,密码实际上为空(或忽略),并且登录取决于与MySQL用户相对应的系统用户。
可以切换到系统根目录,然后按以下步骤进行测试,然后键入:您可能会被允许进入。(您甚至可以通过# mysql从Unix根目录登录,因为密码无关紧要,并且用户已定义)。

那是怎么回事?好吧,如果您以root用户身份登录并执行以下操作:

mysql -uroot -p


,您会注意到auth_socket(在MariaDB上可能显示为unix_socket)。这些套接字忽略密码,并允许相应的Unix用户进入而无需密码检查。这就是为什么您可以使用root用户登录,但不能使用其他用户登录。

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

在截至2017年的Ubuntu版本16上的MariaDB(<10.2,请参阅下面的注释)上,这已足够。 NEWPASSWORD是您的密码。 mysql_native_password您逐字键入。

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


(将插件设置为空是可行的。YMMV。我没有尝试过。所以这是另一种选择。)

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


否则:

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


然后

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


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

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

评论


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

–Mausy5043
18年7月28日在10:14

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

– Michael Scheper
18/12/17在2:23



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

–Gazzer
18/12/17在4:26

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

–Gazzer
18/12/17在4:32

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

– Michael Scheper
18/12/21在2:01



#4 楼

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

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



/>登录到MySQL根shell:

sudo mysql



检查为不同用户启用的身份验证方法(可选)

SELECT * FROM mysql.user;

/>

使root使用密码进行身份验证: />
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here';



使用密码退出并进行身份验证

FLUSH PRIVILEGES;




评论


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

–直到
18年1月22日在14:17

单个命令:mysql -u root -p -e“使用mysql;更新用户集plugin ='mysql_native_password',其中user ='root';刷新权限;”

–克里斯·斯特里钦斯基(Chris Stryczynski)
18年7月23日在18:43

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

–达尼拉(Danila Vershinin)
19年8月22日在8:56

是。这使问题恶化了。

– Guissmo
20 May 30 '13:18

#5 楼

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



以sudo身份登录: />

创建新用户并授予他特权(无密码): />
sudo mysql -uroot




#6 楼

如果仅在root用户下运行mysql命令,则无需询问密码即可获得访问权限,因为已为root @ localhost启用了套接字身份验证。
。 :

$ sudo mysql
ALTER USER'root'@'localhost'通过'test'进行身份验证
mysql_native_password

#7 楼

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

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


然后:

FLUSH PRIVILEGES;


我不建议删除用户root

#8 楼

首先尝试使用此代码,然后依次按Ctrl+Z并键入:bg到从前台到后台运行该过程,然后通过以下方法验证您的访问权限:

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


#9 楼

我一直在修改我创建的一些配置脚本以使用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值无效,刷新特权并继续工作。

#10 楼

我遇到了同样的问题,并运行了以下修复程序:

mysql_upgrade --force


评论


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

– Codescope
16年5月3日,9:58

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

– Codescope
16年3月3日,11:45



这将永远无济于事。该问题与MariaDB二进制文件的实际安装无关,而是使用非标准插件设置来设置用户root。在这种情况下,数据库升级可能会有所帮助的唯一极端情况是,如果mysql_upgrade进程本身考虑了插件设置,我对此表示怀疑。

–Giacomo1968
17-10-20在1:37