gpt4 book ai didi

mysql - 使用 DMS 复制数据库时出错

转载 作者:行者123 更新时间:2023-11-29 10:07:35 33 4
gpt4 key购买 nike

我正在产品和开发环境中进行 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 时,有两种类型的准备语句发挥作用。服务器端和客户端。了解更多 here堆栈溢出时。准备好的语句是针对每个连接创建的,并且只要连接处于事件状态就将存在。 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 二进制协议(protocol),即准备好的语句。

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

关于mysql - 使用 DMS 复制数据库时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51588928/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com