我同时在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环境中运行
发布于 2018-10-24 21:55:24
有多个方面需要确定。
谁都在访问您的数据库?是只有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二进制协议,即预准备语句。
所以总而言之,这些事情中的一件可能正在发生。在dev中,接触您mysql服务器的其他服务连接的数量较少,导致该数量小于max。或者,如果没有运行中的服务,则出现在生产案例中的数据量可能很高。DMS任务将尝试批量加载表,并将需要创建准备好的语句,如果找不到将失败。
https://stackoverflow.com/questions/51588928
复制相似问题