首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何处理mysqldump产生的巨大行长度

如何处理mysqldump产生的巨大行长度
EN

Stack Overflow用户
提问于 2009-08-18 12:30:27
回答 7查看 31.4K关注 0票数 68

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

它创建一个文本文件,该文件可用于从命令行恢复数据记录。

我认为在恢复之前编辑转储文件作为更改值和表名或列名的一种快速方法会很有用-至少在我了解更多信息并对使用ALTER和UPDATE完成这项操作有信心之前是这样。

编辑大型文本文件对我来说并不麻烦,但我惊讶地发现,在我的数据库的250MB转储文件中,只有大约300行。每行大约有80万个字符。

有没有其他方法可以更好地控制行长度来生成转储文件?

或者,我是否应该使用sed或Perl等工具对转储进行后处理?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-08-18 12:42:15

默认情况下,mysqldump只为每个表生成一个INSERT命令,从而为每个被转储的表生成一行(非常长)的插入数据。这本质上是因为“批处理”插入比为每个表中的每条记录生成单独的INSERT查询要快得多。

所以,这并不是说mysqldump创建了任意长的行,您可以设置一些其他的截止长度。排队很长是有原因的。

如果将INSERT分解到多行中真的很重要,您可以使用以下命令来指明:

代码语言:javascript
复制
mysqldump --extended-insert=FALSE --complete-insert=TRUE ...

但是,请注意,在这种格式下,恢复表会花费更长的时间。

票数 79
EN

Stack Overflow用户

发布于 2010-12-16 07:04:08

今天我浏览了MySQL源代码,寻找这个问题的解决方案。最大行长度由变量opt_net_buffer_length强制执行,该变量应与MySQL服务器的缓冲区大小相匹配。它大得滑稽可笑。

但不管怎样,这是一种选择,所以只需这样做:

代码语言:javascript
复制
mysqldump --net_buffer_length=5000 ...

最小值为4096。

票数 35
EN

Stack Overflow用户

发布于 2013-11-18 19:19:51

我在MySQL论坛上看到了一个答案,它最终显示在每个插入组后添加'\n‘不可能单独使用mysqldump,而不修改源代码:

无法根据逗号或括号100%正确解析扩展格式,您需要对字段进行计数。最好的解决方案是,在输出时将mysqldump修复为linebreak。

非常小的变化:在第3506行,您可以看到行结束逗号的输出位置:

fputc(',',md_result_file); /* Always row break */

只需在紧跟第3506行之后插入此行:

fputc('\n',md_result_file); /* Lon Binder says wrap that line! */

重新编译并完成。

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

谢谢Lon B!

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

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1293529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档