如何处理由mysqldump创build的巨大的行长度

我在cron作业中使用mysqldump来备份超过200万行的数据库。

它创build一个文本文件,可用于从命令行恢复数据logging。

我认为在还原之前编辑转储是一个很有用的方法,可以快速改变值和表或列名 – 至less直到我学到更多东西,并且对使用ALTER和UPDATE做更有信心。

编辑大型文本文件并不困扰我,但是我惊奇地发现,在250兆字节的数据库转储中, 只有大约300行 。 每一行都是800k字符长。

是否有另一种方式来产生更多的控制行长的转储?

还是应该用sed或Perl等工具后处理转储?

默认情况下, mysqldump 每个表只会生成一个INSERT命令,导致每个被转储的表的一行(很长)的插入数据。 这基本上是因为“批处理”插入比在每个表中为每个logging生成单独的INSERT查询要快得多。

所以,并不是说mysqldump创build了任意长的行,而是可以强加一些其他的cutoff长度。 线路长是有原因的。

如果把INSERT分解成多行是非常重要的,那么可以用下面的语句来表示:

 mysqldump --extended-insert=FALSE --complete-insert=TRUE ... 

但是请注意,恢复表格将需要更长时间的格式。

我正在浏览MySQL源代码,寻找今天这个问题的解决scheme。 最大行长度由variablesopt_net_buffer_length强制,该variables应该与MySQL服务器的缓冲区大小相匹配。 这是很大的。

但无论如何,这是一个select,所以只要这样做:

 mysqldump --net_buffer_length=5000 ... 

最小值是4096。

我偶然在MySQL论坛上find了一个答案,在不修改源代码的情况下,在每个INSERT组不可能使用mysqldump的情况下添加'\ n':

扩展的格式不能100%根据逗号或括号正确parsing,你会计数字段。 最好的解决scheme,修复mysqldump输出中的linebreak。

非常小的变化:在行3506上,你可以看到输出行尾的逗号:
fputc(',',md_result_file); /* Always row break */

只需在3506行之后立即插入这一行:
fputc('\n',md_result_file); /* Lon Binder says wrap that line! */

重新编译完成。

@see http://forums.mysql.com/read.php?28,420002,426110#msg-426110

感谢Lon B!

(我已经包含了来自MySQL论坛的内容,以防论坛消失。)

使用正则expression式分割线是不够的,你需要一个parsing器,将正确理解引号和转义字符。

我只是写了一个parsing器,因为我找不到一个: http : //blog.lavoie.sl/2014/06/split-mysqldump-extended-inserts.html

这个标志也起作用了:

 mysqldump --skip-extended-insert 

--extended-insert=FALSE

用python后处理转储文件。 你可能比perl或sed更快乐。

如果你在Linux上运行,你已经安装了它。 如果你在Windows上运行,安装程序是无痛的。

然而在此之前,学习使用SQL UPDATE和SQL ALTER。 你会以最正确的方式做事。