两个索引条目之间的行?

时间:2010-01-17 02:07:21

标签: mysql mysqldump corruption

我在重新导入mysqldump生成的数据库转储时遇到问题。我使用order-by-primary选项运行mysqldump,然后让它在具有唯一键的表上运行(并且没有显式主键,因此它按该唯一键排序)。在这种情况下,我的目标是重新创建表,将唯一键作为主键。

这个转储需要很长时间(大约10天),再次运行它会是一个很大的麻烦。我尝试重新导入转储(使用适当的架构更改),但mysql在中途窒息。我查看了转储文件,在它被阻塞的地方 - 看起来有人将垃圾邮件直接插入到转储文件的文本中。

幸运的是,看起来损坏是孤立的,我能够在垃圾之前看到钥匙,并且紧接着。

tl; dr :如果我只拼出了垃圾,我不知道前一个和后一个之间会丢失多少个密钥 - 转储按唯一键排序,所以它在这方面使生活更轻松。 mysql是否有办法检索索引中两个条目之间的所有行?

键是一个32个字符的十六进制字符串,存储在CHAR(32)类型列中。我很确定我不能使用<或者>字符串上的运算符...所以有什么建议吗?

2 个答案:

答案 0 :(得分:2)

对主键(或唯一键)上的mysqldump进行排序是需要这么长时间的。不过,十天是难以置信的。

只有当您想要备份MyISAM表并将其还原到InnoDB表时,执行此类操作才有用。这是你在做什么?

MySQL肯定有办法转储表的子集。查看mysqldump的--where选项。这应该允许您备份已损坏的行。

是的,您可以对SQL中的字符串使用<>。您还可以使用BETWEEN谓词。

答案 1 :(得分:1)

我的第一个问题是,垃圾邮件怎么能进入你的数据库转储并销毁它?

我猜它来自你的一个数据列,对吧?你能说明这封电子邮件是如何设法干扰你的转储结构的吗?

也许是某种头注入导致转储插入换行符不应该有,我不知道。无论如何,在我看来,清理它将是第一优先。