美文网首页Python
记一次 MySQL 8.0 与 caching_sha2_pas

记一次 MySQL 8.0 与 caching_sha2_pas

作者: 章光辉_数据 | 来源:发表于2020-03-30 10:15 被阅读0次

    某天发现无法用客户端远程登录 MySQL 了,客户端提示:

    Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2): image not found

    同时,用 python 脚本连接客户端也出现了报错:

    RuntimeError: cryptography is required for sha256_password or caching_sha2_password

    查看官方文档,找到了原因:

    • MySQL 8.0的首选身份验证插件是 caching_sha2_password,它提供了比旧的身份验证插件 mysql_native_password 更安全的密码哈希 。但是,它也具有兼容性影响。
    • 如果客户端或连接器是基于 Client/Server 协议实现的,而该实现是无法正常处理无法识别的默认身份验证插件的,所以连接会失败并报出上面的错误。

    总结下来,结论就是:问题出在客户端或者连接器上,谁让你们的实现方式没有适配最新的 MySQL 8.0(怪我咯?)

    所以,要么客户端或连接器改,要么服务端改。

    改客户端或连接器的连接方式

    我是在 Python 环境下遇到的问题,两步解决:

    1. 修改 Python 连接 MySQL 的驱动为 pymysql。
    pip install PyMySQL
    

    然后,数据库连接字符串改成

    mysql+pymysql://username:password@server/db
    
    1. 安装 cryptography 模块。

    这一步骤是以防万一,有网友反馈使用了 pymysql 模块可能还是会出现报错 cryptography is required for sha256_password or caching_sha2_password,其实只要再安装 cryptography 模块就可以了。

    pip install cryptography
    

    也期待有小伙伴分享其他解决方案。

    改服务端的身份验证插件

    现在要考虑两个问题:

    • 如何处理已有的账号,使得这些账号可以正常访问?-> 重置身份验证插件
    • 如何避免今后新账号,不要再出现这个问题?-> 修改数据库配置

    重置身份验证插件

    登录 MySQL 所在主机,用有权限的账号,以本地登录的方式进入 MySQL。

    对受到影响的账号,修改身份认证方式。

    ALTER USER '用户名'@'HOST' IDENTIFIED WITH mysql_native_password BY '旧密码';
    

    如果不想每次遇到问题了再修改,索性就把所有可能会遇到问题的账号都改了:

    首先,查看目前有哪些账号的身份验证插件用了 caching_sha2_password:

    select user, host 
    from mysql.user 
    where plugin = 'caching_sha2_password';
    

    然后对上述结果,执行一遍 alter 语句。

    修改数据库配置

    修改数据库的配置文件 my.cnf,指定默认的身份验证插件为旧插件。

    [mysqld]
    default_authentication_plugin=mysql_native_password
    

    相关文章

      网友评论

        本文标题:记一次 MySQL 8.0 与 caching_sha2_pas

        本文链接:https://www.haomeiwen.com/subject/adumuhtx.html