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

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

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

当我使用sudo mysql登录时,mysql甚至没有问我密码。 如果我运行mysql_secure_installtion我发现永远不会设置旧设置。

我究竟做错了什么?

我最近将我的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的情况下重新连接。

我希望这会帮助别人:)

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

取自MySQL 5.7中的更改用户密码“plugin:auth_socket”

所以为了将plugin更改回mysql_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; 

这里的问题是,当安装/更新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访问权限则不适用)

  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 

资源:

http://www.itzgeek.com/how-tos/linux/debian/how-to-install-mariadb-on-debian-9.html

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

首先尝试此代码,

 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