CloudSQL MySQL8 root用户登录失败:caching_sha2_password认证异常
问题背景
拥有一个CloudSQL私有实例,通过堡垒机容器中的CloudSQL Auth Proxy从127.0.0.1访问,RDBMS为MySQL 8,实例由Terraform创建。
日常使用以下命令(通过另一个容器中的mysql客户端)连接:
gcloud compute ssh --zone "<bastion zone>" "<bastion name>" --project "<project id>" --tunnel-through-iap --command "sudo docker run --rm --network=host -it mysql mysql -u root -p -h 127.0.0.1"
尝试root用户登录时,出现错误:
Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
已做的操作:
- CloudSQL已启用传统认证,通过其他用户登录后查询用户信息,结果显示root用户的认证插件均为
mysql_native_password:mysql> select user,host,plugin from user; +-------------------+-----------+-----------------------+ | user | host | plugin | +-------------------+-----------+-----------------------+ | <the other user> | | mysql_native_password | | root | 127.0.0.1 | mysql_native_password | | root | ::1 | mysql_native_password | | root | localhost | mysql_native_password | +-------------------+-----------+-----------------------+ - 在Terraform实例配置中添加了数据库标志,并重启了实例:
database_flags { name = "default_authentication_plugin" value = "mysql_native_password" }
但问题依旧,root用户登录仍被要求使用sha2连接。
解决思路
强制指定认证插件连接:在mysql客户端命令中添加
--default-auth=mysql_native_password参数,强制客户端使用对应插件连接。修改后的命令:gcloud compute ssh --zone "<bastion zone>" "<bastion name>" --project "<project id>" --tunnel-through-iap --command "sudo docker run --rm --network=host -it mysql mysql -u root -p -h 127.0.0.1 --default-auth=mysql_native_password"MySQL 8.x客户端默认优先尝试
caching_sha2_password认证,即使服务器端用户配置为mysql_native_password,手动指定可规避客户端的默认行为。重置root用户密码:若root用户的密码是在
default_authentication_plugin设置前创建的,密码哈希可能仍为caching_sha2_password格式(即使plugin显示为mysql_native_password)。通过已登录的其他用户执行以下命令重置:ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '你的新密码'; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码'; ALTER USER 'root'@'::1' IDENTIFIED WITH mysql_native_password BY '你的新密码'; FLUSH PRIVILEGES;验证Terraform配置生效状态:用gcloud命令检查实例的数据库标志是否正确应用:
gcloud sql instances describe <你的实例名> --project <项目ID> | grep default_authentication_plugin若输出不是
mysql_native_password,说明Terraform配置未成功应用,需检查执行日志,确认database_flags是否被正确设置,必要时重新apply并重启实例。排除Docker容器环境干扰:直接在堡垒机系统中安装mysql客户端(不通过docker容器),执行连接命令测试:
mysql -u root -p -h 127.0.0.1 --default-auth=mysql_native_password若能正常登录,说明是docker容器内的mysql客户端存在版本或配置问题,可尝试指定具体镜像版本(如
mysql:8.0)或调整容器内客户端配置。检查root用户密码哈希格式:执行完整查询确认root用户的密码哈希类型:
SELECT user, host, plugin, authentication_string FROM mysql.user WHERE user = 'root';mysql_native_password的哈希以*开头,caching_sha2_password的哈希以$A$开头。若root@127.0.0.1的哈希为$A$开头,说明密码确实是sha2格式,必须重置密码。
内容的提问来源于stack exchange,提问作者Gabriele B

