Docker Flyway MySQL 8:客户端不支持服务器请求的身份验证协议。考虑升级MariaDB客户端。

6
我正在Docker容器中运行我的应用程序,使用flyway迁移工具连接MySQL DB(8.0.11)时出现错误: 以下是完整的错误信息:
无法从数据库获取连接 (jdbc:mysql://docker-mysql:3306) 用户名为 'deepti':
客户端不支持服务器所请求的身份验证协议。
请考虑升级MariaDB客户端。插件为=caching_sha2_password
这是我的docker-compose.yml:
version: '3'
services: docker-mysql: image: mysql:8.0.11 environment: - MYSQL_ROOT_PASSWORD=... - MYSQL_DATABASE=test1 - MYSQL_USER=... - MYSQL_PASSWORD=...
flyway-service-i: image: boxfuse/flyway command: -url=jdbc:mysql://docker-mysql:3306 -schemas=test1 -user=... -password=... migrate volumes: - "../resources/db/migration:/flyway/sql" depends_on: - docker-mysql
spring-boot-jpa-docker-webapp: image: deepti/spring-boot-docker depends_on: - docker-mysql ports: - 8080:8080 environment: - DATABASE_HOST=docker-mysql - DATABASE_USER=... - DATABASE_PASSWORD=... - DATABASE_NAME=test1 - DATABASE_PORT=3306
请问有人可以帮我解决这个问题吗?谢谢。

相关链接:https://dev59.com/TKvka4cB1Zd3GeqPuIKZ - Mark Rotteveel
1个回答

13
MySQL的默认身份验证方法在8.0.4版本中更改为caching_sha2_password。看起来MariaDB连接器不支持它
您可以通过添加下面显示的命令默认身份验证插件恢复为旧版本:
version: '3'

services: 
  docker-mysql:
    image: mysql:8.0.11
    command: --default-authentication-plugin=mysql_native_password
    environment:
...

对于已经使用认证方法创建的数据库中的任何现有用户,您可以更改用户以使用:

ALTER USER 'username'@'ip_address' IDENTIFIED WITH mysql_native_password BY 'password';

或者使用docker-compose rm命令删除现有的容器。

我在这个存储库中创建了一个可工作的示例。以下是成功的输出:

Flyway Community Edition 5.1.4 by Boxfuse

Database: jdbc:mysql://docker-mysql:3306/test1 (MySQL 8.0)
WARNING: You are connected to a MySQL database using the MariaDB driver. This is known to cause issues. An upgrade to Oracle's MySQL JDBC driver is highly recommended.
Successfully validated 1 migration (execution time 00:00.010s)
Creating Schema History table: `test1`.`flyway_schema_history`
Current version of schema `test1`: << Empty Schema >>
Migrating schema `test1` to version 1.0 - init
Successfully applied 1 migration to schema `test1` (execution time 00:00.290s)

您可以看到,虽然它有效,但有关使用MariaDB驱动程序与MySQL的问题的警告。

另一个选择是下载官方MySQL JDBC驱动程序,将其添加到./drivers目录中,并将其挂载到Flyway容器中:

  flyway-service-i:
    image: boxfuse/flyway
    command: ...
    volumes:
     - "./sql:/flyway/sql"
     - "./drivers:/flyway/drivers"

这也可以起作用:

Flyway Community Edition 5.1.4 by Boxfuse

Database: jdbc:mysql://docker-mysql:3306/test1 (MySQL 8.0)
Successfully validated 1 migration (execution time 00:00.011s)
Creating Schema History table: `test1`.`flyway_schema_history`
Current version of schema `test1`: << Empty Schema >>
Migrating schema `test1` to version 1.0 - init
Successfully applied 1 migration to schema `test1` (execution time 00:00.229s)

但要消除以下警告:

WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

我确实需要在jdbc url中添加verifyServerCertificate=falseuseSSL=true

jdbc:mysql://docker-mysql:3306/test1?verifyServerCertificate=false&useSSL=true

嗨,我已经做了更改,但仍然遇到相同的错误。我从bash运行此mysql查询:select Host,User,plugin from mysql.user; 并获得输出: %| deepti | caching_sha2_password,这意味着它仍然为用户使用caching_sha2_password。 - Deepti-l
我怀疑这是因为 docker-mysql 容器已经存在,并且在添加命令之前已经使用 caching_sha2_password 创建了用户。您可以使用 docker-compose rm 删除现有容器,然后再试一次。 - codemonkey
@Deepti-l,我已经更新了我的答案,并解释了如何更新现有用户,提供了一个可工作的示例存储库链接,以及使用官方MySQL JDBC驱动程序的另一种解决方案。请告诉我这是否适用于您。 - codemonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接