所有元数据库操作返回 "Field 'id' doesn't have a default value"

All Metabase operations returning "Field 'id' doesn't have a default value"

我们正在将 Metabase v0.24.1 部署从 AWS RDS MySQL 5.7 迁移到 AWS Aurora MySQL 无服务器(兼容 5.6)。当我们启动元数据库时,应用程序尝试 运行 return 的每个查询都会出现某种形式的错误:

Field 'id' doesn't have a default value

完整错误:

03-17 16:07:57 [1mERROR metabase.middleware[0m :: [31mPOST /api/database 500 (68 ms) (0 DB calls)[0m
{:message "Field 'id' doesn't have a default value",
 :stacktrace
 ["api.database$fn__29894$fn__29897.invoke(database.clj:233)"
  "api.common.internal$do_with_caught_api_exceptions.invokeStatic(internal.clj:229)"
  "api.common.internal$do_with_caught_api_exceptions.invoke(internal.clj:224)"
  "api.database$fn__29894.invokeStatic(database.clj:215)"
  "api.database$fn__29894.invoke(database.clj:215)"
  "middleware$enforce_authentication$fn__38784.invoke(middleware.clj:120)"
  "api.routes$fn__38908.invokeStatic(routes.clj:58)"
  "api.routes$fn__38908.invoke(routes.clj:58)"
  "routes$fn__39540$fn__39541.doInvoke(routes.clj:64)"
  "routes$fn__39540.invokeStatic(routes.clj:60)"
  "routes$fn__39540.invoke(routes.clj:60)"
  "middleware$log_api_call$fn__38883$fn__38885.invoke(middleware.clj:329)"
  "middleware$log_api_call$fn__38883.invoke(middleware.clj:328)"
  "middleware$add_security_headers$fn__38833.invoke(middleware.clj:243)"
  "middleware$bind_current_user$fn__38788.invoke(middleware.clj:140)"
  "middleware$maybe_set_site_url$fn__38837.invoke(middleware.clj:266)"],
 :sql-exception-chain ["SQLException:" "Message: Field 'id' doesn't have a default value" "SQLState: HY000" "Error Code: 1364"]}

尝试添加新数据库也return通过元数据库出现同样的错误UI。

我们已验证 RDS 数据库参数在我们要迁移的数据库之间是相同的,不包括可能在 Aurora Serverless 和 MySQL 5.7 默认值之间发生变化的引擎默认配置。

另一个没有table 的变化是我们正在从我们拥有的 EC2 实例上的 运行ning 正常 ECS 任务转移到 Fargate 任务,但两者之间的任务定义是相同的。

编辑:我在 sql_mode 参数中发现了 Aurora Serverless 和 MySQL 5.7 之间的另一个配置不一致。在 5.7 中,默认设置为 NO_ENGINE_SUBSTITUTION,在无服务器中,它设置为 0.

将无服务器部署的 sql_mode 更新为 NO_ENGINE_SUBSTITUTION 后,我发现数据库本身的实际配置仍然不一致。 SELECT @@sql_mode; returns NO_ENGINE_SUBSTITUTION 在 5.7 部署上 returns STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION 在无服务器部署上,即使参数组未设置为此值。

编辑 2:我没有提到我们用来将数据传输到新数据库的方法,即 AWS DMS 版本 3.3.1。似乎 DMS 没有复制 auto_increment table 属性,该属性需要出现在 Metabase 数据库的 id 列上。这可能是根本问题。

此问题的根本原因是配置数据库中的 id 列没有 auto_increment 属性,即使它们有值,也被视为没有值。

这是因为我们用来传输数据的 AWS DMS 没有复制模式的所有细节:

https://dba.stackexchange.com/questions/138946/aws-dms-creates-tables-with-no-auto-increment

此问题的解决方法是先使用标准 mysqldump --no-data 执行架构迁移,然后我们使用 DMS 填充数据。