我在一个cron作业中使用mysqldump来备份一个超过200万行的数据库。
它创建一个文本文件,可用于从命令行恢复数据记录。
我认为在恢复之前编辑转储文件是一种非常有用的方法,可以快速更改值和表或列名-至少在我了解更多信息并对使用ALTER和UPDATE进行操作充满信心之前。
编辑大型文本文件并不困扰我,但我惊讶地发现,在一个250兆的数据库转储中,只有大约300行。每行大约800 k个字符长。
是否有其他方法可以更好地控制行长度来生成转储?
还是应该使用sed或Perl等工具对转储进行后处理?
8条答案
按热度按时间vmpqdwk31#
默认情况下,
mysqldump
只为每个表生成一个INSERT
命令,导致每个被转储的表都有一行(很长)插入数据。这主要是因为“批处理”插入比为每个表中的每个记录生成单独的INSERT
查询快得多。所以,这并不是说
mysqldump
创建了任意长的线,你可以强加一些其他的截止长度。如果将
INSERT
分解为多行非常重要,可以使用以下命令表示:但是,请注意,在这种格式下恢复表将花费更长的时间。
f1tvaqid2#
我今天浏览了MySQL的源代码来寻找解决这个问题的方法。最大行长度是由变量opt_net_buffer_length强制执行的,它应该与MySQL服务器的缓冲区大小相匹配。它非常大。
但无论如何,这是一个选择,所以只要这样做:
最小值为4096。
aurhwmvo3#
我在MySQL论坛上找到了一个答案,它最终表明在每个INSERT组之后添加'\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! */
重新编译并完成。
@see http://forums.mysql.com/read.php?28,420002,426110#msg-426110
感谢Lon B!
iq3niunx4#
此标志也适用于:
就像
--extended-insert=FALSE
一样。polhcujo5#
使用正则表达式来分割行是不够的,您需要一个能够正确理解引号和转义字符的解析器。
我只是写了一个解析器,因为我找不到一个:http://blog.lavoie.sl/2014/06/split-mysqldump-extended-inserts.html
cwtwac6a6#
如果您已经有一个行很长的SQL转储,并且希望轻松读取它,可以使用
lx0bsm1f7#
我是这样解决这个问题的:
1.我要求
mysqldump --skip-extended-insert
每行生成一个INSERT INTO
:1.使用
awk
,我用逗号连接连续的行和INSERT INTO
:下面是脚本
join-insert-into
:它可以这样使用:
wooyq4lh8#
使用python对转储文件进行后处理。您可能比perl或sed更高兴。
如果你运行的是Linux,你已经安装好了,如果你运行的是Windows,安装程序是很容易的。
在此之前,你要学习使用SQL UPDATE和SQL ALTER,你会很高兴用正确的方法来做事情。