我在产品和开发环境中都进行了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:mysql:// host:port / db?useServerPrepStmts = true,您应该看到类似JDBC url的内容。有趣的事情之一是一旦准备好的语句被最大化,如果准备失败,它就会退回到客户准备好的语句。因此,在这种JDBC访问代码的情况下,通常不会看到您列出的错误。因为现在涉及往返,这只会妨碍性能,而不会从中受益。

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

总而言之,这些事情之一可能正在发生。在开发人员中,与您的mysql服务器接触的其他服务连接数量较少,导致该计数小于最大值。或者,如果没有任何服务在起作用,则针对生产情况的数据量可能很大。 DMS任务将尝试批量加载表,并且将需要创建准备好的语句,如果找不到则将失败。

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

10-13 00:58