Как я могу избавиться от этих комментариев в дампе MySQL?

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

/*!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

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

Ответ 1

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

Возьмите эту строку:

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

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

Синтаксис этого синтаксиса документируется в разделе Синтаксис комментария в руководстве.

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

Ответ 2

Я знаю, что это древний вопрос, но вот как минимум ответ. Я также не мог найти флаг в mysqldump для удаления условных комментариев или, действительно, лучший вариант для установки минимальной версии mysql для этих комментариев. Если вы просто хотите их уничтожить, вы можете сделать это с помощью grep или sed (sed оставляет пустые строки, 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'

Ответ 3

Попробуйте --skip-comments?

Спасибо

Edit:

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

к

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

сделать script более комфортным для чтения.

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

Ответ 7

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

Ответ 8

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

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

Он удаляет все строки следующим образом:

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

Ответ 9

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

# 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

Ответ 10

Другой вариант, если вы используете vi/vim и нуждаетесь в быстром и грязном способе сохранения содержимого инструкции, но nuke в скобках:

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

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

Ответ 11

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

Вам просто нужно:

npm install -g @luissquall/dbdump

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

Ответ 12

Очень важно сохранить комментарии условного исполнения. Но если вы абсолютно уверены, что версия MySQL, которая будет загружать дамп, больше или равна той, которая его создает, вы можете удалить часть "comment" следующим образом:

sed -r  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g

Он будет конвертировать строки, такие как

/*!40101 SET [email protected]_SQL_MODE */;
от

до

SET [email protected]_SQL_MODE ;

Потому что эта строка должна работать на любом MySQL> = 4.1.1

Обратите внимание, что это не приведет к удалению многострочных комментариев условного выполнения, например, при сбросе триггера.

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

mysqldump ... > dump.sql
cat dump.sql | sed -E  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g > dump.no-comments.sql

Ответ 13

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

Ответ 14

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

Ответ 15

Используйте --dump-date=FALSE

Делает именно то, что просит OP. (не совсем, я вижу)

Источник: сводка опций mysqldump

Редактировать: Через минуту я понял, что это то, что я искал не ОП, а уходя отсюда... в надежде, что кто-то может использовать его: Эта строка даты, которая разрушает контроль источников, потому что это всегда изменение...

Ответ 16

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