【问题标题】:MySQL Error 1032 "Can't find record in table"MySQL 错误 1032 “在表中找不到记录”
【发布时间】:2019-08-19 13:47:27
【问题描述】:

我昨天在dba.stackexchange.com 上问了这个问题,但没有得到任何回复,所以我在这里尝试。

我的数据库中的某些查询出现 MySQL 1032“无法在 'person' 中找到记录”错误,我无法解决这些问题。

这是桌子:

CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `last_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `first_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `dob` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `person_full_idx` (`last_name`,`first_name`,`title`)
) ENGINE=InnoDB AUTO_INCREMENT=4448 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

失败的查询是

SELECT * FROM person p0_
WHERE MATCH (p0_.last_name , p0_.first_name , p0_.title) AGAINST ('anne' IN BOOLEAN MODE) > 0.5
ORDER BY p0_.last_name ASC, p0_.first_name ASC, p0_.dob ASC;

如果我取出任何一个 order by 子句,查询运行得很好。如果我将 anne 更改为 anna,则查询在所有三个 order by 子句中都可以正常运行。桌子上有一些 Annes,大约和 Annas 一样多。

每次查询失败时,MySQL 错误日志都有一堆这样的错误消息:

2019-03-27T17:31:27.891405Z 9 [Warning] [MY-012853] [InnoDB] Using a
partial-field key prefix in search, index `FTS_DOC_ID_INDEX` of table 
`database`.`person`. Last data field length 8 bytes, key ptr now 
exceeds key end by 4 bytes. Key value in the MySQL format:
len 4; hex 05110000; asc     ;

我没有使用复制,对于anne记录的插入、更新和删除都是成功的。我删除并重新创建了全文索引,但没有任何改进。我删除并重新加载了数据库并得到了同样的错误。

使用相同数据的查询在生产环境(mysql Ver 15.1 Distrib 10.1.37-MariaDB)中没有失败。据我所知,它只是在我的开发机器上失败(mysql Ver 8.0.15 for osx10.14 on x86_64 (Homebrew))。

接下来我应该尝试什么?

【问题讨论】:

  • 此错误与此错误报告中的错误相似:bugs.mysql.com/bug.php?id=93241 也许一种解决方法是省略 ORDER BY?或者增加sort_buffer_size的大小?错误报告声称这已在 8.0.16 中修复。
  • 谢谢@BillKarwin。删除ORDER BY 不是我的选择,但增加sort_buffer_size 解决了我的问题。
  • 我有这个错误只是因为表已损坏(来自以前的完整文件系统)。修理台修好了。

标签: mysql full-text-search


【解决方案1】:

如上面评论中所述,这是 MySQL 8.0 中的一个已知错误:https://bugs.mysql.com/bug.php?id=93241

临时解决方法是增加sort_buffer_size 的大小。默认sort_buffer size in MySQL 8.0为256KB,可配置的最大值为2^32-1或2^64-1。

如果您运行与大量行匹配的查询,该错误可能会再次发生,对于您增加的sort_buffer_size 而言,它太大了。

我会警告不要将sort_buffer_size 增加到非常大,因为运行此查询的每个线程都会分配自己的排序缓冲区。

假设您将 sort_buffer_size 增加到 1GB,然后 100 个并发客户端同时运行全文搜索!您可能会意外地使 MySQL 超出您的系统总内存,并且当它发生时您不会收到任何警告。

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2015-05-23
    相关资源
    最近更新 更多