GitLab CI+Docker+Laravel数据库迁移失败:认证方法未知
解决GitLab CI中MySQL 8.0数据库迁移认证失败问题
问题分析
你遇到的SQLSTATE[HY000] [2054]错误,核心原因是MySQL 8.0默认启用了caching_sha2_password认证插件,但你的应用使用的数据库客户端(比如旧版本的PHP mysqlnd扩展)不支持这种新的认证方式,导致连接握手失败。
快速解决方案(GitLab CI配置调整)
直接修改GitLab CI的MySQL服务配置,强制它使用兼容旧客户端的mysql_native_password认证方式:
before_script: - bash .gitlab-ci.sh - export APP_ENV=testing services: # 修改services配置,添加启动命令指定认证插件 - name: mysql:8.0 command: ["--default-authentication-plugin=mysql_native_password"] variables: MYSQL_DATABASE: test_db MYSQL_ROOT_PASSWORD: testdb DB_HOST: mysql DB_USERNAME: root DOCKER_DRIVER: overlay2 # 补全你之前截断的配置
额外验证步骤(可选)
如果调整后还是有问题,可以在CI的job里添加一个测试命令,确认MySQL的认证插件配置是否生效:
# 在before_script里新增这条命令,查看用户认证插件 mysql -h $DB_HOST -u $DB_USERNAME -p$MYSQL_ROOT_PASSWORD -e "SELECT user, plugin FROM mysql.user;"
执行后如果看到root用户的plugin是mysql_native_password,说明配置生效了。
其他可能的排查点
- 检查你的
.gitlab-ci.sh脚本是否安装了正确的数据库客户端依赖,比如PHP项目要确保mysqlnd扩展是最新版本(部分旧版本确实不支持caching_sha2_password)。 - 确认你的应用配置文件里的数据库连接参数和CI变量完全一致,比如
DB_PASSWORD是否正确关联到$MYSQL_ROOT_PASSWORD。
内容的提问来源于stack exchange,提问作者twigg
相关产品推荐
相关产品推荐

