mysqldump可以每行做一个查询吗?

时间:2011-04-13 03:43:46

标签: mysql mysqldump

mysqldump是否可以每行转储一个查询?

例如,它当前转储CREATE TABLE表达式,如下所示:

--
-- Table structure for table `post`
--

CREATE TABLE IF NOT EXISTS `post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(160) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `url` varchar(600) NOT NULL,
  `domain` varchar(90) NOT NULL,
  `author` int(11) NOT NULL,
  `description` text,
  `category` int(11) DEFAULT NULL,
  `score` int(11) NOT NULL,
  `ip` varchar(255) DEFAULT NULL,
  `created` datetime NOT NULL,
  `comment_count` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uc_slug` (`slug`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

-- --------------------------------------------------------

--
-- Table structure for table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `login` varchar(12) NOT NULL,
  `password` varchar(45) NOT NULL,
  `email` varchar(150) NOT NULL,
  `about` varchar(300) DEFAULT NULL,
  `last_visit` datetime DEFAULT NULL,
  `ip` varchar(255) DEFAULT NULL,
  `created` datetime NOT NULL,
  `perm_mod` int(11) DEFAULT NULL,
  `perm_admin` int(11) DEFAULT NULL,
  `post_count` int(11) NOT NULL DEFAULT '0',
  `comment_count` int(11) NOT NULL DEFAULT '0',
  `vote_count` int(11) NOT NULL DEFAULT '0',
  `voted_count` int(11) NOT NULL DEFAULT '0',
  `forgot_key` varchar(150) DEFAULT NULL,
  `cookie_key` varchar(40) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3;

相反,我希望它像这样转储:

--
-- Table structure for table `post`
--

CREATE TABLE IF NOT EXISTS `post` (`id` int(11) NOT NULL AUTO_INCREMENT,`title` varchar(160) NOT NULL,`slug` varchar(255) NOT NULL,`url` varchar(600) NOT NULL,`domain` varchar(90) NOT NULL,`author` int(11) NOT NULL,`description` text,`category` int(11) DEFAULT NULL,`score` int(11) NOT NULL,`ip` varchar(255) DEFAULT NULL,`created` datetime NOT NULL,`comment_count` int(11) NOT NULL DEFAULT '0',PRIMARY KEY (`id`),UNIQUE KEY `uc_slug` (`slug`) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

-- --------------------------------------------------------

--
-- Table structure for table `users`
--

CREATE TABLE IF NOT EXISTS `users` (`id` int(11) NOT NULL AUTO_INCREMENT,`login` varchar(12) NOT NULL,`password` varchar(45) NOT NULL,`email` varchar(150) NOT NULL,`about` varchar(300) DEFAULT NULL,`last_visit` datetime DEFAULT NULL,`ip` varchar(255) DEFAULT NULL,`created` datetime NOT NULL,`perm_mod` int(11) DEFAULT NULL,`perm_admin` int(11) DEFAULT NULL,`post_count` int(11) NOT NULL DEFAULT '0',`comment_count` int(11) NOT NULL DEFAULT '0',`vote_count` int(11) NOT NULL DEFAULT '0',`voted_count` int(11) NOT NULL DEFAULT '0',`forgot_key` varchar(150) DEFAULT NULL,`cookie_key` varchar(40) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3;

我一直在浏览mysqldump的args,找不到任何可以做到的事情

3 个答案:

答案 0 :(得分:2)

实际上,没有命令行开关来实现这一目标。相反,我建议您正常进行转储,然后使用像Notepad++这样的好文本编辑器打开转储文件。

首先选择要转换为单行的块,然后选择下一个图像的菜单选项。

Unwrap Text

这是结果(重复每个块转换为单行):

enter image description here

答案 1 :(得分:1)

我有类似的任务 - 格式化mysqldump输出文件,使mysql与init_file选项兼容。这是解决方案:

sed ':a;N;$!ba;s/\n/THISISUNIQUESTRING/g' | sed -e 's/;THISISUNIQUESTRING/;\n/g' | sed -e 's/THISISUNIQUESTRING//g'

这将使用文件中不存在的奇怪字符串替换所有换行符。接下来sed用分号和换行符char替换此字符串和分号的组合。这是必需的,因为表数据可以包含包含“;”的字符串值,因此直接删除所有换行符并在分号后添加它们不是通用的。 之后,剩下的奇怪字符串就会从文本中删除。

顺便说一下,我正在使用--comments=false参数运行mysqldump,因为“init_file”也不允许注释。

答案 2 :(得分:1)

如果你真的想要个人查询,我书中最实用的解决方案是使用mysqldump的内置功能。 --skip-extended-insert标志是您想要的,它在文档中不清楚,但它为您提供了所需的转储格式。