mysqldump --where 带有 = 运算符无法获取所有行

mysqldump --where 带有 = 运算符无法获取所有行

我遇到过这种情况,某个表现在认为它包含 4 PB 的数据。我知道这听起来很酷,但我向你保证,它只在一个 60GB 的分区上。

该表有 9 个字段。其中一个是字段domain_id。它是识别行的最佳字段,因为只有大约 6300 个行。唯一匹配的其他字段选项有超过 200 万条记录,这更加困难。

我无法直接执行 mysqldump,因为它会尝试输出所有 4PB 的数据并在接近该大小之前填满驱动器,所以我需要精确地删除好东西,销毁数据库,然后重新创建它。

我相信如果我可以对每条记录进行转储domain_id,那么我将从中获取大部分可用数据。这就是我试图使用的内容:

mysqldump -u root --skip-opt -q --no-create-info --skip-add-drop-table \
 --max_allowed_packet=1000000000 database table --where="domain_id=10" \
 > domains10.sql

使用这个我希望每一行都被domain_id 10导出。

但是,当我检查导出时,我只得到 1 行,但是当我查看数据库时,却发现有很多行。就好像操作员只找到一个,然后就放弃了。

我尝试了各种运算符。使用<>我能够获得更多数据,但导出在数据已泄露的某些行上停止。由于需要处理超过 6000 条数据,我无法轻松缩小导出中受影响的行的范围。

所以,我需要的是一个基本上可以完成我所想操作的操作符=,只需导出与特定字段匹配的所有记录即可。

还要注意,我使这个数据库可访问的唯一方法是通过 innodb 强制恢复 3。所以我需要正确完成这项工作,因为完成此操作后,我必须删除该数据库才能使 mysql 再次正常运行。

期待任何有用的答案。

答案1

从您所写的内容来看,数据库已被损坏(认为 4PB 而不是 60GB 是一种赠品)。

我怀疑您能否保证所检索信息的可靠性,除非您先修复数据库。您尝试过这个吗?

否则,如果您按“-f”键——即使遇到错误也继续,会发生什么?

答案2

您认为这张桌子实际上应该有多大?

您可以尝试将其转换为 myisam:

alter table ggg engine=myisam;

但是,听起来您的数据库已损坏。

最好的计划可能是联系 innodb 人员寻求支持。

http://www.innodb.com/

答案3

我不是数据库管理员,所以这个想法可能完全是错误的,但是转储中的数据是否应该在所有带有文本字符串的记录中保持一致?我想知道您是否可以转储“4 PB”数据库并通过 grep/strings 过滤器重定向它,这样如果损坏的数据不是有效字符串,它就不会写入磁盘。这取决于损坏的数据是否只是难以理解的垃圾......

否则,这里的其他人将不得不建议使用修复工具来尝试修复数据库。

答案4

尝试添加--skip-extended-insert。写入文件时可能会出现混乱。

相关内容