我在cron作业中使用mysqldump来备份超过200万行的数据库.
它创建一个文本文件,可用于从命令行恢复数据记录.
我认为在恢复之前编辑转储作为一种更改值和表或列名称的快速方法会很有用- 至少在我了解更多信息并对使用ALTER和UPDATE执行此操作充满信心之前.
编辑大型文本文件并不会让我感到烦恼,但我惊讶地发现,在250兆字节的数据库转储中,只有大约300行.每行都有800k字符长.
是否有另一种生成转储的方法,可以更好地控制线路长度?
或者我应该使用sed或Perl等工具对转储进行后处理?
Vot*_*ple 73
默认情况下,每个表mysqldump只生成一个INSERT命令,从而为每个被转储的表生成一行(非常长)的插入数据.这主要是因为"批处理"插入比INSERT为每个表中的每个记录生成单独的查询要快得多.
所以,它不是mysqldump创造了任意长线,而你可以强加一些其他的截止长度.线条很长是有原因的.
如果将INSERTs分解为多行是非常重要的,您可以通过以下方式指出:
mysqldump --extended-insert=FALSE --complete-insert=TRUE ...
Run Code Online (Sandbox Code Playgroud)
但请注意,以此格式恢复表将花费更长时间.
小智 31
我正在浏览MySQL源代码,寻找今天这个问题的解决方案.最大行长度由变量opt_net_buffer_length强制执行,该变量应该与MySQL服务器的缓冲区大小相匹配.它很滑稽.
但无论如何,它是一个选项,所以只需这样做:
mysqldump --net_buffer_length=5000 ...
Run Code Online (Sandbox Code Playgroud)
最小值为4096.
Sta*_*ode 18
我在MySQL论坛上遇到了一个答案,最终确定在单独使用mysqldump后无法在每个INSERT组之后添加'\n',而不修改源:
根据逗号或括号,不能100%正确解析扩展格式,您可以计算字段.最好的解决方案,将mysqldump修复为输出上的换行符.
非常小的更改:在第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论坛中的内容,以防论坛消失.)
使用正则表达式分割行是不够的,您需要一个能够正确理解引号和转义字符的解析器。
我刚刚写了一个解析器,因为我找不到一个:http : //blog.lavoie.sl/2014/06/split-mysqldump-extended-inserts.html
该标志也起作用:
mysqldump --skip-extended-insert
Run Code Online (Sandbox Code Playgroud)
与相同--extended-insert=FALSE。