使用dms复制数据库时出错

vsdwdz23  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(394)

我正在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\u prepared\u stmt\u计数,但无法理解它为什么在dev环境中运行

5t7ly7z5

5t7ly7z51#

有许多方面需要确定。
谁都在访问你的数据库?是只有dms连接到您的数据库还是有其他服务也连接到它?关系的本质是什么?它是暂时的还是使用线程池?
从概念上讲,当您连接到mysql时,有两种类型的prepared语句起作用。服务器端和客户端。阅读更多关于堆栈溢出的文章。准备好的语句是为每个连接创建的,并且只要连接处于活动状态,语句就一直有效。服务器的max\u prepared\u stmt\u count系统级属性,是跨连接语句计数的总和。
如果有服务连接到有问题的数据库,并且如果您使用的是jdbc mysql驱动程序,那么每个连接的最大缓存准备语句数是50(根据驱动程序的不同而不同,my mariadb是250)。这意味着,如果您使用的是固定大小的池20,那么您可以有20*50=1000个准备好的语句。请注意,准备好的语句唯一性将只针对每个连接。同一查询可以跨多个连接出现。如果您不使用pool,那么一旦任何连接关闭,它就会清除关联的prepared语句。
您应该看到像这样的jdbc url,以便服务器端准备好的语句上升jdbc:mysql://host:port/db?useserverprepstmts=true. 有趣的一点是,一旦准备好的语句达到最大值,如果准备失败,它就会返回到客户机准备好的语句。因此,对于这种jdbc访问代码,通常不会看到您列出的错误。这只会妨碍表现,而不是受益,因为现在涉及到往返旅行。
对于dms,我认为它的odbc驱动程序主要使用mysql二进制协议,即prepared语句。
总之,其中一件事可能正在发生。在dev中,接触mysql服务器的其他服务连接的数量较少,导致计数小于最大值。或者,如果没有服务在运行,则生产案例中进入图片的数据量可能很高。dms任务将尝试批量加载表,并要求创建准备好的语句,如果找不到,则将失败。

相关问题