当前位置: 首页 > 知识库问答 >
问题:

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

乌骏
2023-03-14

我正在docker容器中运行我的应用程序,其中flyway迁移工具在连接到MySQL DB(8.0.11)时出错:下面是完整的错误:

Unable to obtain connection from database (jdbc:mysql://docker-mysql:3306) for user 'deepti': 
Client does not support authentication protocol requested by server. 
Consider upgrading MariaDB client. plugin was = 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
   

有谁能帮我一下。谢谢

共有1个答案

东和怡
2023-03-14

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:
...

对于db中已经使用caching_sha2_password身份验证方法创建的任何现有用户,您可以将用户更改为使用mysql_native_password:

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)

正如您所看到的,虽然它可以工作,但是有一个关于在MySQL中使用MariaDB驱动程序的问题的警告。

另一个选择是下载正式的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.

我确实需要将verifyservercertificate=falseusessl=true添加到jdbc URL:

jdbc:mysql://docker-mysql:3306/test1?verifyServerCertificate=false&useSSL=true
 类似资料:
  • 问题内容: 执行JDBC程序时,连接到数据库时出现以下错误: 在研究此问题时,我知道以下错误是因为我需要向用户授予特权,所以请按照以下步骤操作 然后输入密码 然后我跑了 我也用过 但是我正在错误以下 错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的’IDENTIFIED BY’mypassword’附近使用 问题答案: 发生

  • 问题内容: 由于某种原因,我无法与服务器建立简单连接。我使用默认设置安装了最新的MySQL Community 8.0数据库以及Node.JS。 这是我的node.js代码 以下是在命令提示符中发现的错误: 我已经阅读了一些内容,例如: https //dev.mysql.com/doc/refman/5.5/en/old-client.html https://github.com/mysqlj

  • 在执行JDBC程序时,我在连接数据库时遇到以下错误: 当我研究这个问题时,我知道下面的错误是因为我需要授予用户特权,所以请遵循 > 然后输入密码 然后我跑了 我还用了 但我得到了低于误差 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL服务器版本相对应的手册,以了解第1行“Identified BY'myPassword''”附近使用的正确语法

  • 我阅读了一些内容,例如:https://dev.mysql.com/doc/refman/5.5/en/old-client.htmlhttps://github.com/mysqljs/mysql/issues/1507 但我仍然不确定如何解决我的问题。如有任何帮助,将不胜感激:

  • 任务:将Kerberos active directory身份验证添加到不安全的报告和数据操作桌面应用程序。此应用程序是。。。 用Stackless Python 2.7编写 使用Twisted进行客户端-服务器交互 客户端编译为exe并在Windows上运行 服务器在Linux(红帽)上运行 目前,我们从用户帐户中提取Windows网络ID(登录名)并传递到服务器,服务器会查找用户配置为具有的权

  • 授权服务器为进行客户端身份验证的目的,为Web应用客户端创建客户端凭据。授权服务器被鼓励考虑比客户端密码更强的客户端身份验证手段。Web应用程序客户端必须确保客户端密码和其他客户端凭据的机密性。 授权不得向本地应用程序或基于用户代理的应用客户端颁发客户端密码或其他客户端凭据用于客户端验证目的。授权服务器可以颁发客户端密码或其他凭据给专门的设备上特定安装的本地应用程序客户端。 当客户端身份验证不可用