通过


MySQL 故障排除

有关数据 API 生成器中常见 MySQL 连接、身份验证和数据类型问题的解决方案。

常见问题

DAB 中的 MySQL 支持是什么?

数据 API 生成器支持 MySQL 作为关系数据库后端。 DAB 使用 MySqlConnector 驱动程序进行连接,并将 REST 和 GraphQL 请求转换为 SQL 查询。 支持自承载 MySQL 实例和托管服务,例如 Azure Database for MySQL。

MySQL 使用哪种连接字符串格式?

DAB 使用标准 MySQL ADO.NET 连接字符串。 典型的字符串如下所示 Server=localhost;Port=3306;Database=mydb;Uid=myuser;Pwd=mypassword;。 在data-source.connection-string字段中设置连接字符串,或在dab init中通过--connection-string传入dab-config.json

支持哪些 MySQL 版本?

DAB 支持 MySQL 8.0 及更高版本。 MySQL 5.7 可能正常工作,但不受正式支持。 在 MySQL shell 中确认 SELECT VERSION(); 服务器版本。 如果使用的是 Azure Database for MySQL 等托管服务,请使用支持 MySQL 8.0 的灵活服务器层。

常见问题

无法连接到 MySQL 容器

症状: DAB 无法启动 Unable to connect to any of the specified MySQL hosts

原因: 未映射 MySQL 容器端口、主机名错误或容器尚未完成初始化。

分辨率: 确认容器正在运行 docker ps ,并将该端口 3306 映射到主机。 在 Server=localhost;Port=3306 连接字符串中使用。 允许在容器启动后几秒钟,MySQL 在启动 DAB 之前完成初始化。

用户访问被拒绝

症状: DAB 日志显示 Access denied for user 'myuser'@'172.x.x.x' 或类似情况。

原因: MySQL 用户帐户仅限于特定主机。 当 DAB 在 Docker 中运行时,连接源自容器网络 IP,而不是 localhost

分辨率: 通过运行 GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword'; FLUSH PRIVILEGES;授予用户从任何主机的访问权限。 在生产环境中,将 % 替换为特定的主机或子网。 通过从同一网络运行 mysql -u myuser -p 来验证密码是否匹配。

未知数据库错误

症状: DAB 在 Unknown database 'mydb' 启动期间返回。

原因: 在 MySQL 服务器上未创建连接字符串中指定的数据库。

分辨率: 通过在 MySQL shell 中运行 CREATE DATABASE mydb; ,在启动 DAB 之前创建数据库。 如果使用容器,请设置 MYSQL_DATABASE 环境变量,以便 MySQL 在首次启动时创建数据库。

不支持的列类型警告

症状: DAB 记录有关不受支持的列类型的警告,并且生成的架构中缺少该字段。

原因: 某些特定于 MySQL 的类型(例如 SETENUM或空间类型)在 DAB 的类型系统中可能没有直接映射。

解决方案:查看 DAB 日志以识别列和类型。 请考虑将列更改为受支持的类型(例如 ENUM 字段的 VARCHAR),或者使用 mappings 配置将该列从公开的架构中排除,从而不包括在实体定义中。

视图上的更新失败

症状: MySQL 视图支持的实体上的 PUT 或 PATCH 请求失败并出现错误或不起作用。

原因: 数据 API 生成器目前不支持 MySQL 视图上的更新操作。 这是 GitHub 问题 #938 中跟踪的已知限制。

分辨率: 使用基表实体执行写入操作。 如果视图是设计为只读的,请在实体的权限中将“update”设置为false,以明确此限制。

对具有计算列的表进行更新失败

症状: 包含计算列的 MySQL 表上的 PUT 或 PATCH 请求失败或返回错误。

原因: 数据 API 生成器在 MySQL 中的更新操作期间无法正确处理计算列。 这是 GitHub 问题 #1001 中跟踪的已知限制。

分辨率: 目前没有解决方法。 如果可能,请从实体的映射中排除计算列,或避免对受影响的实体执行更新操作,直到问题得到解决。

不支持嵌套筛选

症状: 基于相关实体字段筛选的 REST\ 或 GraphQL ilter 查询在 MySQL 支持的实体上返回错误或意外结果。

原因: 数据 API 生成器目前不支持 MySQL 的嵌套筛选。 这是 GitHub 问题 #1019 中跟踪的已知限制。

分辨率: 仅对顶级实体字段应用筛选。 对于嵌套数据,可以检索父级并在客户端进行筛选,或者重构查询以避免使用嵌套谓词。

不支持存储过程

症状: 将 MySQL 存储过程配置为实体源失败,或者实体的行为不符合预期。

原因: 数据 API 生成器目前不支持 MySQL 的存储过程。 这是 GitHub 问题 #1024 中跟踪的已知限制。

分辨率: 请改用表或视图作为实体源。 请关注 GitHub 问题以获取有关添加 MySQL 存储过程支持的更新。

不会对创建操作强制实施数据库策略

症状: 即使数据库策略应限制操作,创建突变或 POST 请求也会成功。

原因: 尚未实现对 MySQL 中创建操作的数据库策略支持。 这是 GitHub 问题 #1329 中跟踪的已知限制。

分辨率: 使用基于角色的权限限制创建访问权限,直到 MySQL 创建的数据库策略支持可用。

不会对 PUT 和 PATCH 操作强制实施数据库策略

症状: 即使数据库策略应限制它,MySQL 实体上的 PUT 或 PATCH 请求也会成功。

原因: 尚未实现对 MySQL 中的 PUT 和 PATCH 操作的数据库策略支持。 这是 GitHub 问题 #1371 中跟踪的已知限制。

分辨率: 使用基于角色的权限限制更新访问,直到提供对 MySQL 更新操作的数据库策略支持。

不支持Behalf-Of(OBO)身份验证

症状: 为 MySQL 支持的 DAB 实例配置 On-Behalf-Of (OBO) 身份验证失败,或者令牌未按预期转发到数据库。

原因: 目前仅 SQL Server 和 Azure SQL 支持 OBO 身份验证。 尚未实现对 MySQL 的支持。 这是 GitHub 问题 #3159 中跟踪的已知限制。

分辨率: 使用受支持的身份验证方法,例如 MySQL 的连接字符串凭据。 在 OBO 支持扩展到非 SQL Server 数据库时,请关注 GitHub 上的问题以获取更新。