php
,mariadb
和nginx
。我运行了mysql_secure_installation
并更改了root密码。现在当我尝试以root用户身份登录到
mysql
时,以普通用户帐户登录Ubuntu时,访问被拒绝。 当我使用
sudo mysql
登录时,mysql甚至都不问我密码。如果运行mysql_secure_installtion
,我会看到永远不会永久设置旧设置。 我在做什么错?
#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 楼
简而言之,在MariaDBUPDATE 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
评论
如果您想恢复为默认密码,则可以减少通过unix_socket插件的root访问:sql UPDATE mysql.user SET plugin ='unix_socket'WHERE user ='root';刷新权限