2010-01-17 60 views
3

我在重新导入由mysqldump创建的数据库转储时遇到了问题。我使用order by-primary选项运行mysqldump,并使用唯一键(没有显式主键,因此按唯一键排序)在表上运行它。在这种情况下,我的目标是重新创建表格,将唯一密钥嵌入主键中。两个索引条目之间的行吗?

这个转储花了很长时间(大约10天),这将是一个重大的痛苦,屁股再次运行它。我尝试重新导入转储(使用适当的模式更改),但mysql中途窒息。我查看了转储文件,在它窒息的地方 - 它看起来像是有人将垃圾邮件插入转储文件的文本中。

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

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

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

+0

欢迎来到SO!很复杂的第一个问题。我希望它能找到一个好的答案。 – 2010-01-17 02:22:01

回答

2

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

只有当您想要备份MyISAM表并将其恢复到InnoDB表时,才会这样做。这是你在做什么?

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

是的,您可以在SQL中的字符串上使用<>。您也可以使用谓词BETWEEN

+0

我实际上是从innodb倾倒插入innodb表。我曾在其他地方读过,当插入到innodb中时,按顺序排列主要是要做的事情。这是一张43GB的桌子,所以我预计会有长时间的延迟,我只是没想到必须这么做! – frank 2010-01-17 02:55:01

1

我的第一个问题是,垃圾邮件如何将它转化为数据库转储并将其销毁?

我猜测它来自你的一个数据列,对不对?你能说明这个电子邮件是如何设计来打扰你的垃圾场结构的吗?

也许这是某种标题注入,导致转储插入换行符不应该有,我不知道。无论如何,清理这个问题将是我的首要任务。

+0

这是最奇怪的事情。我按照Bill的建议做了BETWEEN查询,并且没有任何行显示有损坏我的转储的数据。 – frank 2010-01-17 03:23:21

+0

转储文件可能损坏,但不是数据库。 – 2010-01-17 05:03:01