mysql 如何修复用户“root”@“localhost”的访问被拒绝

mysql 如何修复用户“root”@“localhost”的访问被拒绝

在我搞砸某件事之前,当我使用登录$ mysql -u root -p并显示数据库时:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| game_data          |
| test               |
+--------------------+

然后我尝试创建一个新用户,并发现权限有问题。

因此我删除了新用户,并且我猜我意外删除了“root”和“Admin”。

然后我尝试再次创建“root”,但是在授予所有权限时出现访问被拒绝错误。

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'password' with grant option;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

如果我再次使用登录 MySQL $ mysql -u root -p,并显示数据库,

+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+

所有其他数据库都消失了。

我现在该如何修复 MySQL?

我找不到数据库“mysql”,无法创建数据库,无法创建用户,我尝试做的任何事情都会出现错误。

错误 1045 (28000):拒绝用户“root”@“localhost”访问(使用密码:是)。

我应该使用 MacPorts 重新安装 MySQL 吗?如果重新安装,我会丢失数据库game_data,对吗?

答案1

请遵循以下步骤。

  1. --skip-grant-tables使用选项(安全设置)启动 MySQL 服务器实例或守护进程。

     $ sudo mysqld --skip-grant-tables
    
  2. 执行这些语句。

     $ sudo mysql -u root mysql
     $mysql> UPDATE user SET Password=PASSWORD('my_password') where USER='root';
     $mysql> FLUSH PRIVILEGES;
    

如果您遇到上述未知字段密码错误,请使用:

update user set authentication_string=password('my_password') where user='root';
  1. 最后,重新启动不带该选项的实例/守护进程--skip-grant-tables

     $ /etc/init.d/mysql restart
    

您现在就可以使用新密码进行连接了。

$ sudo mysql -u root -p

输入密码:my_password

修复 MySQL“无法锁定 ibdata1”错误

sudo mv /usr/local/mysql/data/ibdata1 /usr/local/mysql/data/ibdata1.bak
sudo mv /usr/local/mysql/data/ib_logfile0 /usr/local/mysql/data/ib_logfile0.bak
sudo mv /usr/local/mysql/data/ib_logfile1 /usr/local/mysql/data/ib_logfile1.bak
sudo cp -a /usr/local/mysql/data/ibdata1.bak /usr/local/mysql/data/ibdata1
sudo cp -a /usr/local/mysql/data/ib_logfile0.bak /usr/local/mysql/data/ib_logfile0
sudo cp -a /usr/local/mysql/data/ib_logfile1.bak /usr/local/mysql/data/ib_logfile1
sudo /etc/init.d/mysql restart

答案2

以上方法对我都没什么帮助。我发现我需要清除插件方法。在 5.6 中,我可以这样做:

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

在 5.7 中,我发现我需要:

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

根据文档,如果将插件设置为空字符串,它应该默认为 mysql_native_password,但可能会被空密码哈希混淆。如需了解更多细节,您可以阅读此处的文档:https://dev.mysql.com/doc/refman/5.7/en/native-authentication-plugin.html

答案3

还要确保表中所需的记录user有空plugin字段(例如,可以有"unix_socket")。

从 5.5.7 版本开始,mysql 有各种身份验证插件支持 https://dev.mysql.com/doc/refman/5.6/en/authentication-plugins.html

因此,如果您有非空plugin字段,那么密码将被忽略,并且 mysql 错误日志中会出现警告(对我来说是/var/log/mysql/error.log):

[Warning] 'user' entry 'root@localhost' has both a password and an authentication plugin specified. The password will be ignored.

答案4

尝试一下:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 
UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;

相关内容