无法从ubuntu 16.04中的普通用户帐户登录为mysql用户root
我刚安装了Ubuntu 16.04 LTS以及php
, mariadb
和nginx
软件包。 我运行了mysql_secure_installation
并更改了root密码。
现在,当我尝试使用root帐户登录到mysql
,同时以普通用户帐户登录Ubuntu时,我被拒绝访问。
当我使用sudo mysql
登录时,mysql甚至没有问我密码。 如果我运行mysql_secure_installtion
我发现永远不会设置旧设置。
我究竟做错了什么?
我最近将我的Ubuntu 15.04升级到16.04,这对我有用:
-
首先,在sudo mysql中连接
sudo mysql -u root
-
检查数据库中的帐户
SELECT User,Host FROM mysql.user; +------------------+-----------+ | User | Host | +------------------+-----------+ | admin | localhost | | debian-sys-maint | localhost | | magento_user | localhost | | mysql.sys | localhost | | root | 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> 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)
-
退出MySQL并尝试在没有sudo的情况下重新连接。
我希望这会帮助别人:)
如果您安装5.7并且没有为
root
用户提供密码,它将使用auth_socket
插件。 该插件不关心,也不需要密码。 它只检查用户是否使用UNIX套接字进行连接,然后比较用户名。
取自MySQL 5.7中的更改用户密码“plugin:auth_socket”
所以为了将plugin
更改回mysql_native_password
:
-
使用sudo登录:
sudo mysql -u root
-
更改
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;
这里的问题是,当安装/更新MariaDB或MySQL时(特别是如果在某些时候没有密码设置root),那么在Users表中密码实际上是空的(或忽略),并且登录取决于系统用户对应的给MySQL用户。 您可以通过切换到系统root来按如下方式测试,然后键入:
mysql -uroot -p
然后输入无密码或密码错误 。 您可能会被允许进入。(您甚至可以通过简单的#mysql从unix root登录,因为密码无关且用户已定义)。
那么发生了什么? 好吧,如果您以root用户身份登录并执行以下操作:
select User,host,plugin from mysql.user; +----------------+-----------+-----------------------+ | User | host | plugin | +----------------+-----------+-----------------------+ | root | localhost | auth_socket | +----------------+-----------+-----------------------+
你会注意到auth_socket
(它可以读取MariaDB上的unix_socket
)。 这些套接字忽略密码并允许相应的Unix用户进行密码检查。 这就是您可以使用root登录但不能使用其他用户登录的原因。
所以解决方案是更新用户不使用auth_socket/unix_socket
并正确设置密码。
在MariaDB(<10.2)上,截至2017年的Ubuntu版本16,这应该足够了:
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用户身上,因为其他用户将手动添加,而不是初始安装/更新的一部分。
如果您已从基础存储库安装MySQL / MariaDB,则用户无法从其Unix登录名作为MySQL root用户登录到MySQL(如果他们具有sudo访问权限则不适用)
-
登录MySQL root shell:
$ sudo mysql -u root -p
-
执行以下查询:
use mysql; update user set plugin='mysql_native_password' where user='root'; flush privileges; quit;
-
打开一个新shell,然后:
$ mysql -u root -p
资源:
http://www.itzgeek.com/how-tos/linux/debian/how-to-install-mariadb-on-debian-9.html
尝试创建新的mysql帐户,对我来说它已经工作(mysql 5.7.12):
-
以sudo身份登录:
sudo mysql -uroot
-
创建新用户并授予他权限(无密码):
CREATE USER 'admin'@'localhost' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
-
以新用户身份登录:
mysql -uadmin
首先尝试此代码,
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
以从前台运行进程到后台,然后通过以下方式validation您的访问权限:
mysql -u root -proot mysql> show grants;
如果您只是在root用户下运行mysql命令,您将被授予访问权限而不需要密码,因为root @ localhost启用了套接字身份validation。 。
设置密码的唯一方法是切换到本机身份validation,如:
$ sudo mysql
mysql> ALTER USER’root’@’localhost’IDENTIFIED WITH mysql_native_password BY’test’;
我不得不做两件事(感谢@Todor和@Loremhipsum):
update mysql.user set plugin = 'mysql_native_password' where User='root'; grant all privileges on *.* to 'root'@'localhost';
然后:
FLUSH PRIVILEGES;
我不建议删除用户root
。
我一直在调整我创建的一些配置脚本以使用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
值无效,刷新权限并继续生活。
我有同样的问题并运行以下修复它:
mysql_upgrade --force