2

我有一个超过 1 TB 的 MySQL 转储文件。我需要从中提取 CREATE TABLE 语句,以便提供表定义。

我购买了 Hex Editor Neo,但我有点失望。我创建了一个正则表达式CREATE\s+TABLE(.|\s)*?(?=ENGINE=InnoDB)来提取 CREATE TABLE 子句,这似乎在 NotePad++ 中运行良好。

但是,提取所有实例的 ETA 超过 3 小时,我什至无法确定它是否正确执行。我什至不知道这些行是否可以在完成后导出。

有没有一种快速的方法可以在我的 Ubuntu 机器上使用 grep 或其他方式执行此操作?

更新

跑了一夜,输出文件为空白。我创建了一个较小的数据子集,但该过程仍然无法正常工作。然而,它在正则表达式测试器中工作,但 grep 不喜欢它并产生空输出。这是我正在运行的命令。我会提供样品,但我不想为我的客户泄露机密。这只是一个标准的 MySQL 转储。

grep -oP "CREATE\s+TABLE(.|\s)+?(?=ENGINE=InnoDB)" test.txt > plates_schema.txt

更新部分 之后的新行似乎不匹配CREATE\s+TABLE

4

4 回答 4

2

您可以使用以下内容:

grep -ioP "^CREATE\s+TABLE[\s\S]*?(?=ENGINE=InnoDB)" file.txt > output.txt
于 2015-06-03T17:33:37.980 回答
2

您可以使用 Perl 来完成这项任务……这应该非常快。

Perl 的..(范围)操作符是有状态的——它记住计算之间的状态。这意味着:如果您对 table 的定义以类似的开头CREATE TABLE和结尾,ENGINE=InnoDB DEFAULT CHARSET=utf8;那么下面将做您想要的。

perl -ne 'print if /CREATE TABLE/../ENGINE=InnoDB/' INPUT_FILE.sql > OUTPUT_FILE.sql

编辑:

由于您正在处理一个非常大的文件并且可能想知道进度,pv因此也可以为您提供:

pv INPUT_FILE.sql | perl -ne 'print if /CREATE TABLE/../ENGINE=InnoDB/' > OUTPUT_FILE.sql

这将向您显示进度条、速度和预计到达时间。

于 2015-06-05T00:24:29.457 回答
1

如果可以再次运行 mysqldump,只需添加--no-data.

于 2015-06-08T20:03:09.487 回答
0

知道了!grep 不支持多行匹配。我发现这个问题很有帮助,最后我改用了 pcregrep。

pcregrep -M "CREATE\s+TABLE(.|\n|\s)+?(?=ENGINE=InnoDB)" test.txt > plates.schema.txt
于 2015-06-05T00:24:18.823 回答