考虑:

./mysqladmin -u root -p** '_redacted_'  

输出(包括输入密码):

输入密码: Mysqladmin: connect to server at 'localhost' failed错误 '用户'root'@'localhost'(使用密码:YES)拒绝访问'

我该如何解决这个问题?


当前回答

之前的答案都没有帮助我解决这个问题,所以这里是我找到的解决方案。

相关部分:

In Ubuntu systems running MySQL 5.7 (and later versions), the root MySQL user is set to authenticate using the auth_socket plugin by default rather than with a password. This allows for some greater security and usability in many cases, but it can also complicate things when you need to allow an external program (e.g., phpMyAdmin) to access the user. In order to use a password to connect to MySQL as root, you will need to switch its authentication method from auth_socket to mysql_native_password. To do this, open up the MySQL prompt from your terminal: sudo mysql Next, check which authentication method each of your MySQL user accounts use with the following command: SELECT user,authentication_string,plugin,host FROM mysql.user; Output +------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | | auth_socket | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec) In this example, you can see that the root user does in fact authenticate using the auth_socket plugin. To configure the root account to authenticate with a password, run the following ALTER USER command. Be sure to change password to a strong password of your choosing, and note that this command will change the root password you set in Step 2: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; Then, run FLUSH PRIVILEGES which tells the server to reload the grant tables and put your new changes into effect: FLUSH PRIVILEGES; Check the authentication methods employed by each of your users again to confirm that root no longer authenticates using the auth_socket plugin: SELECT user,authentication_string,plugin,host FROM mysql.user; Output +------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec) You can see in this example output that the root MySQL user now authenticates using a password. Once you confirm this on your own server, you can exit the MySQL shell: exit

其他回答

根据MariaDB官方文档,在MariaDB 10.4.3及以后版本中,默认安装了unix_socket身份验证插件。

为了禁用它,并恢复到前面的mysql_native_password认证方法,在my.cnf文件的[mysqld]部分中添加下面的行:

[mysqld]
unix_socket=OFF

然后运行:

mysql_install_db --auth-root-authentication-method=normal

然后启动mysqld

这个命令可以正常工作:

mysqladmin -u root password CHANGEME

有关更多信息,请参见配置mysql_install_db恢复到以前的身份验证方法。

打开并编辑/etc/my.cnf或/etc/mysql/my.cnf,具体取决于你的发行版。 在[mysqld]下添加skip-grant-tables 重新启动MySQL 你现在应该可以使用下面的命令MySQL -u root -p登录MySQL 运行mysql> flush特权; 设置新密码ALTER USER 'root'@'localhost' IDENTIFIED by 'NewPassword' 回到/etc/my.cnf,删除/comment skip-grant-tables 重新启动MySQL 现在你可以用新密码mysql -u root -p登录了

我尝试了很多步骤来纠正这个问题。这个问题有很多可能的解决方案,很难从废话中筛选出有意义的东西。我终于在这里找到了一个很好的解决方案:

步骤1:确定数据库版本

mysql --version

使用MySQL,你会看到如下输出:

mysql  Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using  EditLine wrapper

MariaDB的输出如下:

mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

请注意您正在运行的数据库和版本,因为稍后将使用它们。接下来,您需要停止数据库,以便手动访问它。

步骤2:停止数据库服务器

要修改root密码,必须先关闭数据库服务器。

你可以这样做MySQL:

sudo systemctl stop mysql

对于MariaDB来说:

sudo systemctl stop mariadb

步骤3:不进行权限检查,重新启动数据库服务器

如果您运行MySQL和MariaDB而不加载用户权限信息,它将允许您使用根权限访问数据库命令行,而无需提供密码。这将允许您在不知情的情况下访问数据库。

为此,您需要停止数据库加载授权表,授权表存储用户特权信息。因为这有一点安全风险,所以您也应该跳过网络连接,以防止其他客户端连接。

启动数据库而不加载授权表或启用网络:

sudo mysqld_safe --skip-grant-tables --skip-networking &

此命令末尾的&号将使此进程在后台运行,以便您可以继续使用您的终端。

现在您可以作为根用户连接到数据库,不需要输入密码。

mysql -u root

您将立即看到一个数据库shell提示符。

MySQL提示

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

MariaDB 提示符

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

现在您拥有了根访问权限,您可以更改根密码。

步骤4:修改root用户密码

mysql> FLUSH PRIVILEGES;

现在我们可以修改根密码了。

对于MySQL 5.7.6及更新版本,以及MariaDB 10.1.20及更新版本,使用以下命令:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

对于MySQL 5.7.5及以上版本,以及MariaDB 10.1.20及以上版本,使用:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

确保用您选择的新密码替换new_password。

注意:如果ALTER USER命令不起作用,通常表明有更大的问题。但是,您可以尝试UPDATE…SET重置根密码。

[重要]这句话解决了我的问题:

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('new_password') WHERE User = 'root' AND Host = 'localhost';

记住在此之后重新加载授权表。

在这两种情况下,您都应该看到命令已成功执行的确认。

Query OK, 0 rows affected (0.00 sec)

密码已经更改,因此现在可以停止数据库服务器的手动实例,并像以前一样重新启动它。

步骤5:正常重启数据库服务器

本教程介绍了一些重启数据库的进一步步骤,但我使用的唯一部分是:

对于MySQL,使用:

sudo systemctl start mysql

对于MariaDB,使用:

sudo systemctl start mariadb

现在,您可以通过运行以下命令确认新密码已正确应用:

mysql -u root -p

该命令现在应该提示输入新分配的密码。输入它,您应该可以像预期的那样访问数据库提示符。

结论

现在恢复了对MySQL或MariaDB服务器的管理访问。确保你选择的新根密码是强大和安全的,并把它放在安全的地方。

我试图利用Mac上的Docker桌面来运行5.7.35和这个Docker -compose。Yml配置允许它工作:

特别是这一行…

命令:default-authentication-plugin = mysql_native_password

...这招奏效了

version: '3.3'
services:
  mysql_db:
    image: mysql:5.7
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'your_password'
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - ~/your/volume/path:/var/lib/mysql

有时会在安装时设置默认密码-如文档中所述。可以通过以下命令确认。

sudo grep 'temporary password' /var/log/mysqld.log