在Linux上编辑非常大的SQL转储/文本文件

18

我需要导入一个大型的mysql dump(高达10G)。但是,SQL dump已经预定义了数据库结构和索引定义。我想通过删除索引和表格定义来加速数据库插入。

这意味着我必须在Linux上删除/编辑一个10G文本文件的前几行。那么,最有效的方法是什么?

需要将整个文件加载到内存中的程序对我来说过于繁琐。

4个回答

38

不要 删除 前几行,尝试将它们编辑为空格。

hexedit 程序可以完成这个操作-- 它会按块读取文件,因此对于它来说,打开一个10GB的文件与打开一个100KB的文件没有区别。

$ hexedit largefile.sql.dump
tab (switch to ASCII side)
space (repeat as needed until your header is gone)
F2 (save)/Ctrl-X (save and exit)/Ctrl-C (exit without saving)

1
谢谢!它完美地运行了!而且你的详细解决方案帮了我很多!谢谢! - geo
对于那些没有访问任何存储库的人,您可以从以下网址获取hexedit的源代码:http://rigaux.org/hexedit.html - Ian C.
hexedit,sed或自定义脚本:http://muras.eu/2017/03/05/editing-big-mysqldump-files - Klerk

7

joe 是一个能够很好地处理大文件的编辑器。我刚刚使用它来编辑了一个约5G的SQL转储文件。打开这个文件大约需要一分钟左右,保存它则需要几分钟,并且在4G内存的系统上几乎没有使用交换空间。


1
我用它处理了一个130GB的文件,Joe在内存占用方面表现得也很好。 - jimkont
我刚刚用它处理了一个30GB的文件...在16GB内存机器上加载花了大约5分钟,使用了8GB的交换空间... - Ross
sudo apt install joe - Chad
编辑了100GB的dump.sql。花了一些时间,但是成功了 :) - Serhii Rohoza

2
sed 's/OLD_TEXT/NEW_TEXT/g' < oldfile > newfile

或者

cat file | sed 's/OLD_TEXT/NEW_TEXT/g' > newfile

-1
Perl 可以逐行读取文件: perl -pi.bak -e 's/^create index/--create index/'

这将需要另外10GB的可用空间,以及从一个文件流式传输整个转储到新文件所需的时间。 - ephemient

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接