我在一个cron作业中使用mysqldump来备份一个超过200万行的数据库。
它创建一个文本文件,该文件可用于从命令行恢复数据记录。
我认为在恢复之前编辑转储文件作为更改值和表名或列名的一种快速方法会很有用-至少在我了解更多信息并对使用ALTER和UPDATE完成这项操作有信心之前是这样。
编辑大型文本文件对我来说并不麻烦,但我惊讶地发现,在我的数据库的250MB转储文件中,只有大约300行。每行大约有80万个字符。
有没有其他方法可以更好地控制行长度来生成转储文件?
或者,我是否应该使用sed或Perl等工具对转储进行后处理?
发布于 2009-08-18 12:42:15
默认情况下,mysqldump
只为每个表生成一个INSERT
命令,从而为每个被转储的表生成一行(非常长)的插入数据。这本质上是因为“批处理”插入比为每个表中的每条记录生成单独的INSERT
查询要快得多。
所以,这并不是说mysqldump
创建了任意长的行,您可以设置一些其他的截止长度。排队很长是有原因的。
如果将INSERT
分解到多行中真的很重要,您可以使用以下命令来指明:
mysqldump --extended-insert=FALSE --complete-insert=TRUE ...
但是,请注意,在这种格式下,恢复表会花费更长的时间。
发布于 2010-12-16 07:04:08
今天我浏览了MySQL源代码,寻找这个问题的解决方案。最大行长度由变量opt_net_buffer_length强制执行,该变量应与MySQL服务器的缓冲区大小相匹配。它大得滑稽可笑。
但不管怎样,这是一种选择,所以只需这样做:
mysqldump --net_buffer_length=5000 ...
最小值为4096。
发布于 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论坛的内容,以防论坛消失。)
https://stackoverflow.com/questions/1293529
复制相似问题