mysqldump – where with =操作符不会获得所有行

我有一个特定的表,现在认为它包含4 PB的数据的情况。 我知道这听起来很酷,但我向你保证,它只是在一个60GB的分区。

这个表格有9个字段。 其中之一是一个domain_id字段。 这是确定行的最好的领域,因为只有大约6300个。 唯一的匹配领域选项有超过200万条logging,这就更困难了。

我不能做一个直接的mysqldump,因为它会尝试输出所有4PB的数据,并在驱动器接近它之前就填满驱动器,所以我需要通过手术去除好东西,销毁数据库并重新创build它。

我相信,如果我可以为每个domain_idlogging做一个转储,那么我将获得大部分可用的数据。 这是我正在尝试使用:

 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行,但是当我看着数据库,有很多行。 就好像操作员find一个,然后放弃。

我曾尝试过各种运营商。 使用<>我能够获得更多的数据,但导出在数据已被泄露的某些行处停止。 经过6000多次,我无法轻易地缩小出口中哪些行受到影响。

所以,我需要的是一个运营商,基本上会做我想做的事情,只要给我一个与特定领域匹配的所有logging的导出。

另外请注意,我得到这个数据库甚至可以访问的唯一方法是通过一个innodb强制恢复3。所以我需要得到这个权利,因为完成后,我必须删除数据库,以使MySQLfunction再次。

期待任何有用的答案。

从你写的东西看来,数据库已经被破坏(认为4PB而不是60GB是一种免费赠品)。

我怀疑你可以得到检索的信息可靠性的任何保证,除非你先修复数据库。 你尝试过吗?

否则,如果您执行“-f”键,会发生什么情况 – 即使遇到错误,也会继续。

你觉得桌子应该有多大?

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

 alter table ggg engine=myisam; 

但是,这听起来像你有一个损坏的数据库。

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

http://www.innodb.com/

我不是数据库pipe理员,所以也许这个想法是完全错误的,但是转储中的数据应该在所有logging中与文本string保持一致吗? 我想知道是否可以做一个“4PB”数据库的转储,并通过grep /stringfilterredirect它,这样如果被破坏的数据不是有效的string,就不会写入磁盘。 这将取决于是否损坏的数据只是无法理解的垃圾,但…

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

尝试添加--skip-extended-insert 。 写入文件时,事情可能会变得很糟糕。