关于mysql Error 1045(28000):Access denied for user ‘root‘@‘localhost‘(using password:YES)的处理方法

问题现象:

 这个问题就让我很恼火,毕竟刚处理完一个:连接Mysql服务器提示:1130-Host XXX is not allowed to connect to this MySQL server的处理方法_yeyuningzi的博客-CSDN博客

然后就又出了这个幺蛾子。。。。废话不多说,我记录一下,这次我的处理步骤

由于这次,我是可以通过远程登录的,于是通过工具远程登录就行:

1、要是用命令列界面工具,则是要跳转一次到mysql库,

use mysql;//跳转到mysql数据库

 

 

2、选中mysql库之后,做一个授权:grant all privileges on *.* to 'root'@'172.0.0.1' identified by 'password';

grant all privileges on *.* to 'root'@'172.0.0.1' identified by 'password';

(高版本mysql 的数据库字段不同,是authentication_string,如果字段名不对则会提示:Unknown column 'password' in 'field list'

 

3、然后flush privileges;使得设置生效

注意: flush privileges;语句很重要,一定不要省略了。

4、本地登录的时候  确认一下:

对于这个:mysql Error 1045(28000):Access denied for user ‘root‘@‘localhost‘(using password:YES)问题 ,我思前想后,可能问题可能出现在这里:

在上一个问题(详见:(13条消息) 连接Mysql服务器提示:1130-Host XXX is not allowed to connect to this MySQL server的处理方法_yeyuningzi的博客-CSDN博客_mysql连接提示1130)处理的时候,最开始没有做任何操作时通过select user,password,host from user;语句查询到的user表信息是这样的:

root用户从host是localhost的地方登录的时候 是有密码的,因此当时是可以通过本地登录。

而host为127.0.0.1的时候,password字段是空的,所以当使用root用户的密码从127.0.0.1登录时,由于数据库里密码字段是空的,所以随便传入的什么样的密码都会因为不匹配,自然而然的不能登录。

在处理那个问题的时候我在更新用户允许登录的客户端情况时使用的是update语句:

执行update查询到的user表信息:

所以当host是127.0.0.1 的时候 是没有密码的!由于当时,我并没有重新本地登录,所以我没有发现这个问题。  当我再次操作的时候这个问题就爆发了。

所以,mysql root用户远程登录的问题应该要考虑到这一点,如果要既能远程登录又能本地登录,那么至少这个user表内容应该是类似这样的:

所以 在最初解决root登录问题的时候应该考虑使用这样的语句:

grant all privileges on *.* to 'root'@'%' identified by 'password';

然后再flush privileges;使得设置生效

考虑直接将root用户授权所有的客户端登录或者是根据需要授权给指定IP远程登录

如:grant all privileges on *.* to 'root'@'192.168.0.192' identified by 'password';。

==================================================================================================================================================

处理这个问题的时候,我也参考了其他的资料,其中有一个是说关闭mysql服务之后修改mysql的配置文件my.ini文件,然后再重启服务,

参见:1045-Access denied for user 'root'@'localhost'解决方法 - 吃啥鸭 - 博客园 

在这里的时候我踩了个坑,通常情况下如果修改了my.ini文件:

使用了skip_grant_tables这样的设定之后,登录的时候是不验证密码的,也就是可以这样登录:

 但是如果是这种情况,在我的环境里 mysql是5.1.36环境下,使用如图里的授权语句 grant all privileges on *.* to 'root'@'%' identified by 'password';这样的语句的时候包报错 

Error 1290 (HY000) The MySQL server is running with the --skip-grant-tables option so it cannot excute this statement.

根据报错,使用skip-grant-tables选项时,是不能使用grant 语句授权的  。

所以 这个方式对我来说 行不通。 

### 解决方案 在 Windows 上遇到 MySQL 登录错误 `ERROR 1045` 的情况通常是因为用户名、密码不匹配或者权限设置不当引起的。以下是详细的解决方案: #### 方法一:重置 root 密码 如果忘记了 root 用户的密码,可以通过以下方法重新设置[^5]。 1. **停止 MySQL 服务** 打开命令提示符(以管理员身份运行),输入以下命令来停止 MySQL 服务: ```cmd net stop mysql ``` 2. **跳过权限表启动 MySQL** 使用 `--skip-grant-tables` 参数启动 MySQL 服务,这样可以绕过权限验证: ```cmd mysqld --shared-memory --skip-grant-tables ``` 3. **登录到 MySQL 并修改密码** 打开另一个命令窗口,执行以下命令进入 MySQL 命令行工具: ```cmd mysql -u root ``` 修改 root 用户的密码(假设新密码为 `new_password`): ```sql ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; FLUSH PRIVILEGES; EXIT; ``` 4. **正常重启 MySQL 服务** 关闭之前使用 `--skip-grant-tables` 启动的服务,并通过常规方式启动 MySQL 服务: ```cmd net start mysql ``` #### 方法二:检查用户权限 有时即使提供了正确的用户名和密码,仍然会因为权限不足而无法登录。此时需要确认用户的权限设置是否正确[^4]。 1. 进入 MySQL 数据库并查看当前用户权限: ```sql SHOW GRANTS FOR 'root'@'localhost'; ``` 2. 如果发现权限受限,则可以通过以下语句授予完全权限: ```sql GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES; ``` 3. 若希望允许从其他主机访问该数据库实例,可将 `'localhost'` 替换为 `'%'` 或指定的具体 IP 地址: ```sql GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION; FLUSH PRIVILEGES; ``` #### 方法三:检查配置文件 某些情况下可能是由于 MySQL 配置文件中的绑定地址或插件冲突导致的问题[^2]。 1. 编辑 MySQL 配置文件(通常是 `my.ini` 文件),找到 `[mysqld]` 节下的 `bind-address` 设置,默认值可能为 `127.0.0.1`。将其更改为 `0.0.0.0` 来支持外部连接: ```ini bind-address=0.0.0.0 ``` 2. 确认使用的认证插件兼容性。对于较新的版本(如 MySQL 8.x),默认采用 `caching_sha2_password` 插件,这可能导致旧客户端无法连接。可通过更改插件解决此问题: ```sql ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; ``` --- ### 总结 上述三种方法分别针对忘记密码、权限不足以及配置文件异常的情况提供了解决思路。具体操作时需根据实际情况选择合适的方法处理。 ```python import mysql.connector try: connection = mysql.connector.connect( host='localhost', user='root', password='your_new_password', database='test' ) cursor = connection.cursor() cursor.execute("SELECT VERSION()") result = cursor.fetchone() print(f"MySQL Version: {result[0]}") except Exception as e: print(e) finally: if connection.is_connected(): cursor.close() connection.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值