0

任何人都知道如何在 MariaDB CONNECT 存储引擎错误下进行故障排除?

错误 1296 (HY000):从 CONNECT 收到错误 122“无法检索错误消息”

如果我在使用 CONNECT 引擎 JDBC 表检索一天或 2 天的数据后从 JDBC 外部表中进行选择,则会发生上述错误。

我怎样才能调试更多?

我试过 connect_xtrace=1023。输出到 mysqld.log 但仍然没有太多信息可用于进一步检查。还尝试更改 JDBC 驱动程序,它仍然是一样的。

我安装了 MariaDB-server-10.3.21-1.el7.centos.x86_64.rpm。& 我正在使用 MariaDB 10.3.21。

谢谢和最好的问候, KH

4

1 回答 1

0

自行解决。

总之,意识到我尝试使用connect_xtrace = 1023,但将其设置为全局变量并没有将其设置为会话变量,因此它的效果不是立竿见影的。将其设置为会话变量后,能够将其跟踪到内存分配失败。

使用 CONNECT 引擎 JDBC 表检索一两天的数据后,从 CONNECT 存储引擎 JDBC 外部表中选择时的错误是:“ERROR 1296 (HY000): Got error 122 'Cannot retrieve error message' from CONNECT”.. . 尝试创建 CONNECT 存储引擎 JDBC 外部表时出现错误:“ERROR 1030 (HY000): Got error 122 “Internal (unspecified) error in handler” from storage engine CONNECT”

我最近刚刚注意到 mysqld.log 中也出现了以下多行: Work area: Memory allocation failed: malloc returned Null

于是再次尝试排除故障...

也许我以前使用过 set global connect_xtrace=1023; 它只会更改全局但不会更改当前会话的设置。因此,这次尝试 set session connect_xtrace=1023 代替,下面的相关日志条目开始出现。

所以关键是为会话设置 connect_xtrace=1023。我的错。

无论如何,mysqld.log 条目现在有更多信息:...新 CONNECT 0x7fc46403de80,表:mssql_CURRENCY_RATE 打开:name=./_TMP_D/mssql_CURRENCY_RATE mode=2 test=18 PlugInit:Language='Null' SareaAlloc:内存分配失败:malloc返回 Null Delete CONNECT 0x7fc46403de80,表:mssql_CURRENCY_RATE,xp=(nil) count=0 ... PlugInit:Language='Null' SareaAlloc:内存分配失败:malloc 返回 Null New CONNECT 0x7fc46403de80,表:mssql_CURRENCY_RATE 打开:name=./ _TMP_D/mssql_CURRENCY_RATE 模式=2 测试=18 ...

所以尝试设置一个低得多的 connect_work_size 值:64MB(默认),然后一切又恢复了!没有更多的错误。

所以结论似乎是,CONNECT 引擎在一段时间后停止能够基于 connect_work_size 进行分配,因为 mysqld 和 OS 随着时间的推移使用了越来越多的内存。

然后尝试将 connect_work_size 设置为 1GB 并再次尝试选择,仍然有效。再增加 1GB 并再次选择,重复几次。从 mysqld.log 开始注意到,为 connect_work_size 设置的内存在一段时间后停止被跟踪,并且使用了最后一个成功的值。(这似乎是根据文档)。

由于我没有遇到关于将 connect_work_size 设置为多少的更详细指南,所以在使用 CONNECT 引擎之前创建了一个我将调用设置 connect_work_size 的存储过程,尝试我想要的大小,然后尝试 CONNECT 引擎,如果失败,请尝试较小的尺寸并尝试 CONNECT 引擎,如果失败,请重复直到一切正常。

如果:a) connect_work_size 的实现方式类似于:innodb_buffer_pool_instances、innodb_buffer_pool_chunk_size、innodb_buffer_pool_size b) 有类似 connect_work_size_guaranteed 之类的东西可能会很好,它可能是分配但从未释放的内存量,具有最低保证插件的内存。c) 有更详细的文件;即:如果大约表行大小是 xxx 并且在任何一个时间点在内存中查询的行是 yyy,那么 connect_work_size 必须是 (xxx * yyy) * 1.1。

于 2020-04-17T14:53:48.823 回答