#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
Флаг — это то, что вы хотите, в документации это неясно, но это дает вам нужный формат дампа.