NavicatPremium连接MySQL出现异常Authentication plugin ‘caching_sha2_password‘ cannot be loaded的解决方案

本文介绍了如何在MySQL 8.0环境下修复Navicat连接问题,通过修改root用户密码加密规则并切换回mysql_native_password,成功解决了因身份验证机制变化导致的连接异常。

一、出现异常原因

由于个人本机安装的mysql是8.0,在使用Navicat连接数据库时,出现Authentication plugin 'caching_sha2_password' cannot be loaded异常。

通过搜集资料得知mysql 8.0 默认更改了身份验证机制(caching_sha2_password),从版本5.7之前 mysql_native_password 更改为 caching_sha2_password。 Navicat客户端不支持新的加密方式,所以出现此异常。

二、异常解决方案

1、登陆MySQL客户端

 2. 修改账户密码加密规则和更新用户密码

1)、修改加密规则

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;

执行结果

 2)、更新用户密码

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

执行结果 

3. 刷新权限和更新密码

1)、刷新权限

 FLUSH PRIVILEGES;

2)、重置密码

alter user 'root'@'localhost' identified by 'root';

执行结果

 在从新使用Navicat连接数据库已无问题。

NimBLE(轻量级蓝牙协议栈)中的GATT(Generic Attribute Profile)缓存机制在设备连接过程中起着重要作用,尤其是在服务发现和属性同步方面。GATT客户端通常会缓存远程设备的服务、特征及其描述符信息,以提高性能并减少重复的属性读取操作。 ### NimBLE GATT 缓存行为 NimBLE GATT客户端维护一个称为“GATT数据库缓存”(GATT database cache)的数据结构,用于存储从远程设备读取到的服务、特征值等信息。该缓存机制允许客户端在重新连接时避免重复执行完整的服务发现过程,从而提升效率[^2]。 当客户端首次连接到GATT服务器时,它会通过`GATT Discover All Primary Services`命令来获取所有主服务,并将这些服务的信息保存在本地缓存中。随后的连接可以使用缓存数据,而无需再次进行完整的服务发现操作。 ### 管理与修复GATT缓存问题 如果遇到GATT缓存不一致或过期的问题,可能的原因包括: - 设备端GATT数据库发生了变化,但客户端未更新缓存; - 缓存未正确初始化或释放; - 多个连接实例之间的缓存管理冲突。 为了解决这些问题,可以采取以下策略: 1. **强制刷新缓存**:在每次连接后调用`ble_gattc_disc_all_svcs()`函数,强制执行一次完整的服务发现操作,忽略已有的缓存数据。 ```c int rc = ble_gattc_disc_all_svcs(conn_handle, NULL, NULL); ``` 2. **清除缓存**:在断开连接时手动调用API清除缓存,例如使用`ble_gattc_clear_state()`函数来重置GATT客户端状态[^2]。 ```c ble_gattc_clear_state(conn_handle); ``` 3. **配置缓存持久化策略**:根据应用需求决定是否需要持久化存储GATT缓存数据。如果不希望跨连接共享缓存,则应在每次连接时重新初始化GATT客户端。 4. **调试与日志记录**:启用NimBLE的日志系统,跟踪GATT事件和缓存更新情况,以便分析问题根源。 5. **确保正确的MTU协商**:如果MTU(Maximum Transmission Unit)设置不当,可能导致某些长属性无法正确读取,进而影响缓存内容的完整性。应确保客户端与服务器之间完成了MTU交换流程。 6. **处理并发访问**:若多个线程或任务同时操作GATT资源,需引入适当的同步机制,如互斥锁或信号量,防止竞态条件导致缓存损坏。 ### 示例代码:刷新GATT缓存 下面是一个简单的示例代码片段,演示如何在连接建立后刷新GATT缓存: ```c static int on_gap_event(struct ble_gap_event *event, void *arg) { switch (event->type) { case BLE_GAP_EVENT_CONNECT: if (event->connect.status == 0) { // 连接成功,刷新GATT缓存 ble_gattc_clear_state(event->connect.conn_handle); ble_gattc_disc_all_svcs(event->connect.conn_handle, NULL, NULL); } break; default: break; } return 0; } ``` 通过上述方法,可以有效地管理和修复与NimBLE GATT缓存相关的问题。实际应用中还需结合具体场景调整策略,并充分测试验证效果。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值