不支持caching_sha2_password的MYSQL8应如何连接

  张一帆   2019年03月01日


  真的好长时间没有在这个博客写东西了。自从17年底到18年下旬自己发生了天翻地覆的变化,所以没有太多时间也没有太多心情来写东西。虽然,目前的状况也还不太稳定。但是,心情变得好多了。所以,我想过来写一写东西了。

  这次想写的东西还挺多,一是顺便把之前的事情都按照时间点归总一下然后写个回忆录啥的。二是接着把我这段时间学过的东西、用过的东西、见过的东西写一写。这次写的东西就是我昨天重起php5.6时,遇到的早已见过的mysql8把plugin从“mysql_native_password”换成后“caching_sha2_password”服务连接不上的问题。其实,网上很多文章已经写了这个问题了,我也是在2018年4月份第一批遇到此问题的那批用户,那么我为啥要写这篇文章呢?因为,我想把我一边遇到问题一边解决问题的过程和为什么这么做的原因描述一下。我觉得这应该会更加有意义吧。

1.caching_sha2_password和mysql_native_password是什么

  这两个是MYSQL的加密插件的规则,也可以说是加密算法。mysql8之前的mysql5都用的是native,后来才改成了sha2。安全方面的考虑吧。

2.在哪里我可以看到这个值呢?

  1. 登录mysql
  2. use mysql;
  3. select * from user \G;

  这里面包含的就是系统记录的登录用户,如果你一般用的是账户为root的用户,那么你就会发现User一列会有个root的记录。其后还会包括plugin,这个就是你在用的加密算法。之后的authentication_string就是你的密码被算法加密后的密文了。

            Host: localhost
                User: root             (*)
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password             (*)
 authentication_string: *332A08JD6001FESDFDSLI11083DS41242991       (*)
      password_expired: N
 password_last_changed: 2019-02-28 19:43:03
     password_lifetime: 0
        account_locked: N
      Create_role_priv: Y
        Drop_role_priv: Y
Password_reuse_history: NULL
   Password_reuse_time: NULL

3.比如你在用PHP连接MYSQL时会报“requested authentication method unknown to the client [caching_sha2_password]”的错误,我们如何解决呢?

  首先,我们要明确一下问题。

  1. 正如上面列的mysql数据,你数据中plugin是什么?authentication_string加密前的密码是正确的么?如果你不确定密码的话你最好重置一下密码,如果不需要就跳到问题【5】
  2. 你的My.cnf(*unix)中的配置应该怎么配?

4.如何重置mysql密码

  1. 关闭mysql服务。
  2. 找到mysql的安装位置,并进入bin文件夹,会发现mysqld运行文件
  3. 运行 mysqld –skip-grant-tables #跳过登录检验环节直接启动mysql
  4. use mysql;
  5. ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘你的密码’ PASSWORD EXPIRE NEVER; #修改密码规则
  6. ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘你的密码’; #更新用户密码
  7. flush privileges; #刷新权限,必须做
  8. 重启你的机器,建议你做这一步
  9. 开启mysql服务

5.My.cnf的配置

  下面的配置是我的配置,标(*)的地方就是要将密码规则插件改mysql_native_password。(*)要在[mysqld]下面。因为在用php连接服务的时候会走这个配置。

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.
[mysqld]
default_authentication_plugin=mysql_native_password (*)
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin =~/logs/mysql/mysql-bin
# These are commonly set, remove the # and set as required.
# basedir = /usr/local/var/mysql/
 datadir = /usr/local/var/mysql
 port = 3306
# server_id = .....
 socket = /usr/local/var/run/mysql.sock
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client]
socket = /usr/local/var/run/mysql.sock
  1. 更改密码规则及密码
  1. 登录mysql
  2. use mysql;
  3. ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘你的密码’ PASSWORD EXPIRE NEVER; #修改密码规则
  4. ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘你的密码’; #更新用户密码
  5. flush privileges; #刷新权限,必须做
  6. 重启Mysql服务

  自此,sha2的连接问题可以告一段落了。我有时间把我18年4月份折腾mysql8的数据库文件的经验发出来吧。