【问题标题】:Access denied for user 'root'@'localhost' (using password: YES) after new installation on Ubuntu在 Ubuntu 上新安装后,用户 'root'@'localhost' 的访问被拒绝(使用密码:YES)
【发布时间】:2015-03-20 00:39:58
【问题描述】:

今天我以 root 身份登录 Ubuntu 14.04.1 LTS ll

然后是apt-get install mariadb-server(不带 sudo,但以 root 身份)。

mySQL -h localhost -u root --password=<PW> 我得到了

拒绝用户“root”@“localhost”访问(使用密码:YES)

我使用mySQL -u root -p 登录数据库并做到了

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '<PW>';
FLUSH ALL PRIVILEGES;

但这并没有帮助。你有什么想法吗? 我没有找到类似问题的答案。

【问题讨论】:

  • 你试过重置root密码吗?

标签: mysql mariadb


【解决方案1】:

TL;DR: 要以 root 用户身份访问更新版本的 mysql/mariadb,在新安装后,您需要在 root shell 中(即sudo mysql -u root,或mysql -u root在由su -sudo -i 首先启动的shell 中)


刚刚在 Ubuntu 上完成了同样的升级,我遇到了同样的问题。

奇怪的是

sudo /usr/bin/mysql_secure_installation

会接受我的密码,并允许我设置它,但我无法通过mysql 客户端以root 登录

我必须使用 mariadb 启动

sudo mysqld_safe --skip-grant-tables

以 root 身份访问,而所有其他用户仍然可以正常访问。

查看mysql.user 表,我注意到root 用户的plugin 列设置为unix_socket,而所有其他用户设置为'mysql_native_password'。快速浏览此页面:https://mariadb.com/kb/en/mariadb/unix_socket-authentication-plugin/ 解释说,Unix 套接字通过将运行客户端的进程的uidmysql.user 表中的用户匹配来启用登录。换句话说,要以 root 身份访问 mariadb,您必须以 root 身份登录。

果然重启了需要身份验证的mariadb守护进程,我可以用root身份登录

sudo mysql -u root -p

sudo su -
mysql -u root -p

做完这件事后,我想到了如何在不执行 sudo 的情况下访问,这只是运行这些 mysql 查询的问题

GRANT ALL PRIVILEGES on *.* to 'root'@'localhost' IDENTIFIED BY '<password>';
FLUSH PRIVILEGES;

(用您想要的 mysql root 密码替换 &lt;password&gt;)。这为 root 用户启用了密码登录。

或者运行 mysql 查询:

UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE user = 'root' AND plugin = 'unix_socket';
FLUSH PRIVILEGES;

将更改 root 帐户以使用密码登录而不更改密码,但这可能会让您安装没有 root 密码的 mysql/mariadb。

在其中任何一个之后,您都需要重新启动 mysql/mariadb:

sudo service mysql restart

瞧,我可以通过mysql -u root -p从我的个人帐户访问

请注意这样做会降低安全性 据推测,MariaDB 开发人员选择像这样进行 root 访问是有充分理由的。

想一想,我很高兴不得不sudo mysql -u root -p,所以我要切换回那个,但我想我会发布我的解决方案,因为我在其他地方找不到。

【讨论】:

  • 顺便说一句,如果你像我一样懒惰,你可以用sudo service mysql restart节省大约两秒钟
  • &lt;password&gt; 的意思是“输入任意密码”、“输入计算机上 root 用户的密码”还是“按字面意思输入字符串 ”?
  • 授权语句中的 表示“提供您希望 mysql root 用户用于登录的密码”。出于安全原因,它应该与主机系统的 root 用户密码不同 - 尽管没有技术原因您不能使用相同的密码。
  • 感谢您的提示,非常适合开发人员,但您如何将其还原为原始?
  • @sam :要恢复更改的安全性,只需将插件更改回“unix_socket”:UPDATE mysql.user SET plugin = 'unix_socket' WHERE user = 'root' AND plugin = 'mysql_native_password'; FLUSH PRIVILEGES;
【解决方案2】:

在干净的 Ubuntu 16.04 LTS 中,localhost 的 MariaDB root 登录从密码样式更改为 sudo 登录样式...

那么,就这样吧

sudo mysql -u root

因为我们要使用密码登录,所以创建另一个用户'user'

在 MariaDB 控制台中...(您可以使用“sudo mysql -u root”进入 MariaDB 控制台)

use mysql
CREATE USER 'user'@'localhost' IDENTIFIED BY 'yourpassword';
\q

然后在 bash shell 提示符下,

mysql-workbench

您可以在 localhost 上使用 'user' 和 'yourpassword' 登录

【讨论】:

    【解决方案3】:

    来自超级用户accepted answer

    sudo mysql -u root
    use mysql;
    update user set plugin='' where User='root';
    flush privileges;
    exit;
    

    【讨论】:

      【解决方案4】:

      试试命令

      sudo mysql_secure_installation
      

      按回车键并在 mysql/mariadb 中为 root 分配一个新密码。

      如果遇到类似

      的错误

      ERROR 2002 (HY000): 无法通过套接字连接到本地 MySQL 服务器 '/var/run/mysqld/mysqld.sock'

      使用

      启用服务
      service mysql start
      

      现在如果你用

      重新输入
      mysql -u root -p
      

      如果您按照问题输入 sudo sumysql -u root -p 现在将权限应用到 root

      GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '&lt;password&gt;';

      这解决了我在 MariaDB 中的问题。

      祝你好运

      【讨论】:

        【解决方案5】:

        我必须以 root 身份登录 Ubuntu 才能以 root 身份访问 Mariadb。它可能与第一次安装时提示您执行的“Harden ...”有关。所以:

        $ sudo su
        [sudo] password for user: yourubunturootpassword
        # mysql -r root -p
        Enter password: yourmariadbrootpassword
        

        你进去了。

        【讨论】:

          【解决方案6】:

          刷新权限的新命令是:

          FLUSH PRIVILEGES

          旧命令FLUSH ALL PRIVILEGES 不再起作用。

          您将收到如下所示的错误:

          MariaDB [(none)]> FLUSH ALL PRIVILEGES; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ALL PRIVILEGES' at line 1

          希望这会有所帮助:)

          【讨论】:

            【解决方案7】:

            运行 mysql_upgrade。

            检查一下

            SHOW GRANTS FOR 'root'@'localhost';
            

            GRANT ALL PRIVILEGES ON ... WITH GRANT OPTION 
            

            检查表是否存在_mysql.proxies_priv_。

            Access denied for user 'root'@'localhost' while attempting to grant privileges. How do I grant privileges?

            【讨论】:

              【解决方案8】:

              像 Ubuntu 这样的系统更喜欢使用 auth_socket 插件。它将尝试通过比较您在数据库中的用户名和发出 mysql 请求的进程来进行身份验证;在here中有描述

              socket插件检查socket用户名(操作 system user name) 匹配客户端指定的 MySQL 用户名 程序到服务器,并且仅当名称 匹配。

              相反,您可能希望返回 mysql_native_password,这将需要用户/密码进行身份验证。

              关于实现的方法,我推荐this

              【讨论】:

                猜你喜欢
                • 2013-05-07
                • 2020-03-18
                • 1970-01-01
                • 2019-08-14
                • 2016-07-11
                相关资源
                最近更新 更多