我同时在产品和开发环境中进行DMS复制,我的dev的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环境中运行
答案 0 :(得分:1)
需要确定多个方面。
谁都在访问您的数据库?是仅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任务将尝试分批加载表,并且需要创建准备好的语句,如果找不到,则会失败。