68

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

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

我认为在还原之前编辑转储作为更改值和表或列名称的一种快速方法会很有用- 至少在我了解更多并有信心使用 ALTER 和 UPDATE 进行此操作之前。

编辑大文本文件并不困扰我,但我惊讶地发现在我的数据库的250 兆字节转储中,只有大约 300 行。每行大约有 800k 个字符长。

是否有另一种生成转储的方法可以更好地控制行长?

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

4

7 回答 7

79

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

所以,这并不是mysqldump创造了任意长的线,你可以强加一些其他的截止长度。线路很长是有原因的。

如果将INSERTs 分解为多行真的很重要,您可以通过以下方式表示:

mysqldump --extended-insert=FALSE --complete-insert=TRUE ...

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

于 2009-08-18T12:42:14.550 回答
35

我正在浏览 MySQL 源代码以寻找解决此问题的方法。最大行长度由变量 opt_net_buffer_length 强制执行,该变量应该与 MySQL 服务器的缓冲区大小匹配。它大得可笑。

但无论如何,这是一种选择,所以只需这样做:

mysqldump --net_buffer_length=5000 ...

最小值为 4096。

于 2010-12-15T23:04:08.043 回答
21

我在 MySQL 论坛上遇到了一个答案,它最终表明在每个 INSERT 组之后添加 '\n' 是不可能单独使用 mysqldump 的,而不修改源:

扩展格式不能根据逗号或括号 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

谢谢朗B!

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

于 2013-11-18T11:19:50.740 回答
6

这个标志也有效:

mysqldump --skip-extended-insert 

和 一样--extended-insert=FALSE

于 2017-06-13T10:40:20.000 回答
5

使用正则表达式分割行是不够的,您需要一个能够正确理解引号和转义字符的解析器。

我刚刚写了一个解析器,因为我找不到:http ://blog.lavoie.sl/2014/06/split-mysqldump-extended-inserts.html

于 2014-06-20T19:31:35.717 回答
1

如果您已经有一个带有很长行的 SQL 转储并且想要轻松阅读它,您可以使用

cat dump.sql  | sed 's$VALUES ($VALUES\n($g' | sed 's$),($),\n($g' | less

cat dump.sql  | sed 's$VALUES ($VALUES\n($g' | sed 's$),($),\n($g' | grep something
于 2020-07-17T09:16:12.193 回答
-4

使用python对转储文件进行后处理。你可能比 perl 或 sed 更快乐。

如果您在 Linux 上运行,则您已经安装了它。如果您在 Windows 上运行,安装程序是无痛的。

但是,在此之前,请学习使用 SQL UPDATE 和 SQL ALTER。你会很高兴以正确的方式做事。

于 2009-08-18T12:36:18.963 回答