如何处理由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。 你会以最正确的方式做事。