Может ли mysqldump выполнять по одному запросу в строке?

#mysql #mysqldump

#mysql

Вопрос:

Возможно ли 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 и не могу найти ничего, что могло бы это сделать

Комментарии:

1. Для mysql_query() должна быть одна строка; построчная обработка

Ответ №1:

Действительно, для достижения этого нет переключателя командной строки. Вместо этого я рекомендую вам выполнить дамп обычным способом, а затем использовать хороший текстовый редактор, такой как Notepad , для открытия файла дампа.

Сначала выберите блок для преобразования в одну строку, затем выберите пункт меню следующего изображения.

Развернуть текст

Это результат (повторите для каждого блока, чтобы преобразовать в одну строку):

введите описание изображения здесь

Комментарии:

1. Спасибо, это сработает, немного утомительно, но, к счастью, мой дамп состоит всего из 10 или около того таблиц

Ответ №2:

У меня была похожая задача — отформатировать выходной файл mysqldump так, чтобы он был совместим с опцией mysql init_file. Вот решение:

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

Это заменяет все символы новой строки странной строкой, которой нет в файле. Следующий sed заменяет комбинацию этой строки и точки с запятой символом точки с запятой и новой строки. Это необходимо, потому что данные таблицы могут содержать строковые значения, которые включают «;», поэтому прямое удаление всех символов новой строки и добавление их после точки с запятой не является универсальным.
После этого оставшиеся странные строки просто удаляются из текста.

Кстати, я запускал mysqldump с --comments=false параметром, поскольку комментарии также не разрешены для «init_file».

Ответ №3:

Если вам действительно нужны отдельные запросы, наиболее прагматичным решением в моей книге было бы использовать встроенную функциональность mysqldump. --skip-extended-insert Флаг — это то, что вы хотите, в документации это неясно, но это дает вам нужный формат дампа.