0

我在 prod 和 dev 环境中都进行 DMS 复制,我的 dev 的 DMS 运行良好,但在 DMS prod 复制中低于错误。

[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环境中运行

4

1 回答 1

1

有多个方面需要确定。

谁都在访问您的数据库?是只有 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 任务将尝试批量加载表,并要求创建准备好的语句,如果没有找到将失败。

于 2018-10-24T13:55:24.400 回答