我遇到一个问题,为了易于使用,我希望能够格式化命令行 MySQL 转储,以便在使用该--extended-insert
选项时给定表的每一行都在新行上。
通常在使用时--extended-insert
,给定表的每一行都会输出在一行上,据我所知,除了使用 perl 或类似工具对转储进行后处理外,没有办法改变这一点。
我正在寻找的格式是:
--
-- Dumping data for table `ww_tbCountry`
--
INSERT INTO `ww_tbCountry` (`iCountryId_PK`, `vCountryName`, `vShortName`, `iSortFlag`, `fTax`, `vCountryCode`, `vSageTaxCode`) VALUES (22, 'Albania', 'AL', 1, 0.00, '8', 'T9'),
(33, 'Austria', 'AT', 1, 15.00, '40', 'T9'),
(40, 'Belarus', 'BY', 1, 0.00, '112', 'T9'),
(41, 'Belgium', 'BE', 1, 15.00, '56', 'T9'),
(51, 'Bulgaria', 'BG', 1, 15.00, '100', 'T9'
但是,当我使用 Phpmyadmin 转储数据库时,使用--extended-insert
,每行都会转储到新行上(如上例所示)。我查看了 Phpmyadmin,找不到任何可以解释这一点的文档。
有人可以解释一下这个问题吗?
答案1
从我谷歌搜索的结果来看,这似乎不可能通过mysqldump
自身实现。您必须将输出通过管道传输到其他内容,例如sed
:
$ mysqldump --extended-insert ... database | sed 's$),($),\n($g'
该特定的 sed 命令将查找字符串“),(”并在逗号后放置一个换行符。
答案2
使用正则表达式来分割行是不够的,您需要一个能够正确理解引号和转义字符的解析器。
由于找不到解析器,所以我只写了一个解析器:http://blog.lavoie.sl/2014/06/split-mysqldump-extended-inserts.html
答案3
我在Stackoverflow 如何处理 mysqldump 创建的超长行。谈论mysql论坛中关于在mysqldump命令源代码中“添加换行符”的讨论。
除非他们真的做出改变,否则没有更好的方法可以做到这一点。但在答案中他们写道:
你可以用更接近一点的
--net-buffer-length=4096
方法来启动新的 INSERT,比默认的更频繁。可惜的是,net-buffer-length 似乎被四舍五入到 4K 的下一个倍数,所以你不能让 INSERT 非常小。
这不是最终的解决方案,但我认为至少应该比没有这个选项多一些换行符。