使用 DMS 复制数据库时出错

Error While Replicating Database using DMS

我正在生产环境和开发环境中进行 DMS 复制,我的开发 DMS 运行 很好,但在 DMS 生产复制中出现以下错误。

[SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: HY000 NativeError: 1461 Message: [MySQL][ODBC 5.3(w) Driver][mysqld-5.6.10-log]Can't create more than max_prepared_stmt_count statements (current value: 16382) [1022502] (ar_odbc_stmt.c:3644)

我可以在源端增加max_prepared_stmt_count,但无法理解为什么在DEV环境下是运行

有多个方面需要确定。

谁在访问您的数据库?是只有 DMS 连接到您的数据库还是还有其他服务连接到它?连接的本质是什么?它是暂时的还是您正在使用线程池?

从概念上讲,当您连接到 Mysql 时,有两种类型的预准备语句会起作用。服务器端和客户端。阅读有关堆栈溢出的更多信息 。创建的准备好的语句是按连接创建的,并且只要连接处于活动状态就会一直存在。服务器的 max_prepared_stmt_count 系统级别 属性 是跨连接语句计数的总和。

如果有服务连接到有问题的数据库,并且您使用的是 JDBC MySQL 驱动程序,则最大缓存准备语句为每个连接 50 个(因驱动程序而异,我的mariaDB 是 250)。这意味着如果您使用 20 个固定大小的池,那么您可以有 20 * 50 = 1000 个准备好的语句。请注意,准备好的语句的唯一性将仅针对每个连接。相同的查询可以存在于多个连接中。如果您不使用池,一旦关闭任何连接,它就会清除关联的准备好的语句。

您应该看到 JDBC url 类似这样的服务器端准备语句上升 jdbc:mysql://host:port/db?useServerPrepStmts=true。一件有趣的事情是,一旦准备好的语句用完了,如果准备失败,它就会回退到客户端准备好的语句。所以通常在这种 JDBC 访问代码的情况下不会看到您列出的错误。它只会妨碍性能而不是受益,因为现在涉及往返。

在 DMS 的情况下,我认为它的 ODBC 驱动程序在它主要使用 MySQL 二进制协议的地方使用,即准备好的语句。

总而言之,其中一件事情可能正在发生。在开发中,您接触 mysql 服务器的其他服务连接数量较少,导致该计数小于最大值。或者,如果没有服务在运行,则生产案例中出现的数据量可能会很高。 DMS 任务将尝试批量加载 table,并要求创建准备好的语句,如果找不到将失败。