2009-12-16 4 views
63

Я пытаюсь создать простую структуру только для дампа моей базы данных. Использование mysqldump дает мне результат, как:Как я могу избавиться от этих комментариев в дампе MySQL?

/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 

DROP TABLE IF EXISTS `foo`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 

Независимо от того, что я стараюсь, я просто не могу показаться, чтобы избавиться от этих замечаний.

настоящее время я использую: mysqldump -p -d --add-drop-table --skip-tz-utc --skip-set-charset -h 127.0.0.1 -u foo bar --result-file=dumpfile.sql

Edit: Однако я хочу, чтобы сохранить другие комментарии, такие как -- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)

+1

Интересно, почему Oracle не добавлял такие важные опции в mysqdump? – PHPst

ответ

9

Вы пробовали опцию быстрого --compact?

Information here.

+1

Я сделал, однако он отключил другие комментарии, которые я * делаю *, например, '- MySQL dump 10.13. Распределите 5.1.41, для Win32 (ia32)'. – etheros

27

Пробег: --skip-comments?

Благодаря

Edit:

Я вижу .. Попробуйте

--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset 

Поиграйте, чтобы удалить некоторые из вариантов, пока вы получите желаемый результат, в основном это так же, как --compact без --skip-comments

--skip-comments удаляет комментарии, относящиеся к версии и прочее ..

+3

К сожалению, это удаляет все комментарии, которые я хочу, оставив все те, которые я не испорчен. – etheros

+0

@etheros Я согласен, но мы должны уточнить. Мой прецедент относится к исходным данным структурных данных. Я не хочу никакой несущественной болтовни для каждой таблицы. Мне нравится вызов 'SET NAMES', что' --skip-set-charset', как было предложено в этом ответе, удаляет; это происходит только один раз в начале файла дампа и может повлиять на восстановление данных материальным способом. Мне нравится '--skip-add-locks -skip-disable-keys' для моего прецедента. Но некоторые условные комментарии, такие как '/ *! 40101 SET character_set_client = @saved_cs_client * /;' и '/ *! 40101 SET character_set_client = utf8 * /' ... полезны или нет? –

-1

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

-1

не прямой ответ, - но я угробил прямой туздЫшпр исключительно для mk-parallel-dump - это быстрее (порождает несколько процессов) и в зависимости от того, что вы собираетесь делать с выводом дампа, более гибким, так как он эффективно объединяет синтаксис mysqldump и 'select in outfile'.

0

Поскольку вы на Windows, если никто не найдет лучшее решение, то вы можете использовать скрипт Python вместо:

import re, sys 
sql = sys.stdin.read() 
regex = re.compile(r'/\*![^\n]* \*/;\n', re.M) 
print regex.sub('', sql) 

Использование из командной строки:

python program.py <your.sql> output.sql 

Она удаляет все строки например:

/*!....... */; 
11

Технически линии, которые вы пытаетесь избавиться, не являются комментариями. Они временно изменяют некоторые переменные в начале, а затем возвращают их в предыдущее значение в конце.

Они не очень полезны (но они также безвредны) в вашем случае, так как вы используете -no-data, но я думал, что стоит упомянуть, что линии служат цели, а не просто комментарии.

127

WHOA! Это не комментарии, даже если они выглядят так. Это токены условного исполнения.

Возьмите эту линию:

/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 

Если версия MYSQL является 4.00.14 или выше, то сервер MySQL будет работать это заявление.

Этот синтаксис синтаксического комментария задокументирован в разделе руководства по эксплуатации Comment Syntax.

Возможно, вы не хотите избавляться от этого материала.

+2

Еще один вопрос, который специально задает вопрос о комментариях в MySQL, рассматриваемых как исполняемый SQL (только что отправленный мной): http://stackoverflow.com/questions/25614919/where-is-it-documented-that-some-comments-in- a-sql-script-execute-by-mysql-usi –

+1

В некоторых случаях удаление комментариев может помочь. т. е. http://bugs.mysql.com/bug.php?id=48972, когда - insert-ignore не работает должным образом из-за них – varela

+0

+1 Я никогда не знал этого. Я думал, что они просто команды, которые запускал mysql-dump при экспорте. Очень поучительный ответ. –

3

Это не комментарии, выполнение этой части скриптов зависит от версии вашего mysql.

Вы можете удалить "комментарий часть", как

/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */ 

в

SET @[email protected]@SQL_NOTES, SQL_NOTES=0 

делает сценарий более "удобным" для чтения.

Если вы попытаетесь запустить «удобный» скрипт в версии, более поздней, чем указано в «комментарии», вы получите сообщение об ошибке.

+0

Как мы можем «удалить часть комментария»? Есть ли опция дампа для этого? Я не хочу проходить через файл с двумя гигабайтами вручную. – mpen

29

Я знаю, что это древний вопрос, но вот как минимум ответ. Я также не мог найти флаг в mysqldump для удаления условных комментариев или, действительно, лучший вариант для установки минимальной версии mysql для этих комментариев. Если вы просто хотите, чтобы ядерное оружие их всех, вы можете сделать это, используя Grep или СЭД (СЭД оставляет пустые строки, Grep не делает):

mysqldump ... | grep -v '^\/\*![0-9]\{5\}.*\/;$' 
mysqldump ... | sed -e 's/^\/\*![0-9]\{5\}.*\/;$//g' 

Чтобы ответить на мое собственное желание условно удаление комментариев в зависимости от версии MySQL, использование один из них (удаляет любые комментарии для ничего < MySQL5):

mysqldump ... | grep -v '^\/\*![0-4][0-9]\{4\}.*\/;$' 
mysqldump ... | sed -e 's/^\/\*![0-4][0-9]\{4\}.*\/;$//g' 
+1

Для резервных копий rsnapshot полезно избавиться от последней строки, поэтому база данных, которая не изменила результаты в том же файле: 'mysqldump ... | grep -v '^ - Dump завершен. * $' ' – rubo77

+0

да, но проблема в том, что вы можете потерять' DROP DATABASE IF EXISTS' или 'IGNORING YOUR CURRENT SESSION VARIABLES'. Если вы не знаете, что делаете: не удаляйте их ОСОБЕННО, КОГДА МИГРАЦИЯ МЕЖДУ ОКРУЖАЮЩЕЙ СРЕДОЙ/ХОЗЯЙКАМИ. поскольку приведенный результат может быть не таким, как ожидалось, по ряду причин. Они были помещены туда для вашей защиты. но если вы не хотите надеть свой ремень безопасности, это ваш выбор. – JayRizzo

0

Если вы наткнулись на этот ответ, пытаясь включить ваш файл structure.sql в мерзавца/GitHub, вы можете вырезать автоинкрементируемого с следующий код сразу после рейка db: структура: сброс

# Remove beginning auto increments to prevent merge conflicts 
filename = 'db/structure.sql' 
File.atomic_write(filename) do |output| 
    File.open(filename, 'rb').each do |input| 
    output.write(input.gsub(/\s+AUTO_INCREMENT=\d+\s+/, ' ')) 
    end 
end 
+1

Что со всеми downvotes на «strip the lines with regexp» отвечает? Они полностью действительны. Это, в частности, полностью применимо к моей ситуации. + 1 для всех вас. – plainjimbo

-2

Я не знаю, если это то, что вы ищете, я просто хотел избавиться от всех материалов комментариев mysql, чтобы использовать синтаксический ярлык, я использовал простое регулярное выражение и заменил все на следующие «/ \ *! [0-9] {5} | \ */"и вуаля! приятные цвета в коде;)

0

Другой вариант, если вы используете VI/Vim и нужен быстрый и грязный способ сохранить в Заявлении содержимое но нюк вводное комментарий:

: %s/\/\*!\d\+\s//g 
: %s/\*\///g 

(Только безопасно на mysqldump s, так как оно уничтожает окончание знака комментария */, но комментарии для человека, по крайней мере, от 5.5, используют синтаксис комментария строки --).

-1

Я сделал этот скрипт для нормализации дампа, включая удаление условных комментариев: https://github.com/luissquall/dbdump.

Вы просто должны:

npm install -g @luissquall/dbdump 

# Redirect output to a file 
dbdump -u user -p -d database > struct.sql 
-1

Как @Ollie и некоторые другие указали, это являются условно-исполнения жетоны, написанные в стиле комментария, но служили цели. Без них вы можете столкнуться с проблемами воссоздания таблиц с жестким принуждением внешнего ключа. Например, таблица A имеет FK для таблицы B, и, таким образом, таблица A не может быть создана до тех пор, пока таблица B не сделает и так далее. Не отключая проверки ключей, вы никогда не сможете их воссоздать в зависимости от того, как будет оштрафован ваш порядок в таблице.

Смежные вопросы