在我搞砸某件事之前,当我使用登录$ 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
请遵循以下步骤。
--skip-grant-tables
使用选项(安全设置)启动 MySQL 服务器实例或守护进程。$ sudo mysqld --skip-grant-tables
执行这些语句。
$ 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';
最后,重新启动不带该选项的实例/守护进程
--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;