Як я можу позбутися цих коментарів у дампі MySQL?


82

Я намагаюся створити просту структуру, лише дамп своєї бази даних. Використання mysqldumpдає мені такий результат, як:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@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)


Не пряма відповідь - але я повністю відмовився від прямого mysqldump для mk-паралельного дампа - це швидше (породжує кілька процесів), і в залежності від того, що ви збираєтесь робити з дамп-результатом, є більш гнучким, оскільки ефективно інкапсулює mysqldump і 'select разом із синтаксисом outfile.
zznate

2
Цікаво, чому Oracle не додав такі важливі параметри до mysqdump?
PHPst

Відповіді:


162

ХТО! Це насправді не коментарі, хоча вони виглядають саме так. Вони є лексемами умовного виконання.

Візьміть цей рядок:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

Якщо версія mySQL має версію 4.00.14 або вище , сервер MySQL буде запускати цю заяву.

Цей чарівний синтаксис коментарів задокументований у розділі Синтаксис коментарів посібника.

Ви, мабуть, не хочете позбуватися цих речей.


2
Ще одне запитання, яке конкретно задає коментарі в MySQL, які розглядаються як виконуваний SQL (щойно опублікований мною): stackoverflow.com/questions/25614919/…
Ден Ніссенбаум,

1
Є деякі випадки, коли видалення коментарів може допомогти. тобто bugs.mysql.com/bug.php?id=48972, коли --insert-ignore через них не працює
належним чином

+1 Я ніколи цього не знав. Я думав, що це просто команди, які виконував дамп mysql під час експорту. Дуже просвітницька відповідь.
Капітан Гіпертекст

1
Припустимо, це повинно означати, що мають бути очікувані параметри сумісності, які вказують, чи передбачається запустити sql на старих версіях mysql, а якщо ні, то потрібно обернути його умовним коментарем.
CMCDragonkai

40

Я знаю, що це давнє запитання, але тут є принаймні відповідь. Я також не міг знайти прапорець у 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'

1
Для резервних копій rsnapshot корисно позбутися останнього рядка, тому база даних, яка не змінила результати в тому самому файлі:mysqldump ... | grep -v '^-- Dump completed on .*$'
rubo77

так, але проблема в тому, що ви можете втратити DROP DATABASE IF EXISTS АБО IGNORING YOUR CURRENT SESSION VARIABLES . Якщо ви не знаєте, що робите: Не видаляйте їх ОСОБЛИВО ПРИ МІГРАЦІЇ МІЖ СЕРЕДОВИЩАМ / ГОСПОДАМИ. оскільки отриманий результат може бути не таким, як очікувалося, з будь-якої кількості причин. Їх там поставили для вашого захисту. але якщо ви не хочете пристебнути ремінь безпеки, це ваш вибір.
JayRizzo

1
@ rubo77 Ви також можете використовувати цей параметр дампа mysql:--skip-dump-date
dehart

33

Спробувати --skip-comments?

Дякую

Редагувати:

Я розумію .. Спробуйте це

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

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

--skip-comments видаляє коментарі, що стосуються версії та іншого.


5
На жаль, це видаляє всі коментарі, які мені потрібні, залишаючи всі ті, кого я не залишаю недоторканими.
etheros

@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
@BenJohnson Ні, вони не є. character_set_clientнеможливо встановити в 5.6 через помилку або щось інше, тому, коли ви виконуєте mysqldumping, наприклад, utf8mb4дані, ви отримуєте ці умовні коментарі там, де їх не хочете.
Слава


12

Технічно рядки, від яких ви намагаєтеся позбутися, не є коментарями. Вони тимчасово змінюють деякі змінні на початку, а потім скидають їх до попереднього значення в кінці.

Вони не дуже корисні (але вони також нешкідливі) у вашому випадку, оскільки ви використовуєте --no-data, але я вважав, що варто згадати, що рядки справді служать певній меті, і це не просто коментарі.


4

Це не коментарі, виконання цієї частини сценаріїв залежить від версії вашого mysql.

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

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */

до

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

роблячи сценарій більш «зручним» для читання.

Якщо ви спробуєте запустити "зручний" скрипт у версії новішої, ніж зазначена в "коментарі", ви отримаєте повідомлення про помилку.


2
Як ми можемо "видалити частину коментаря"? Чи існує для цього варіант скидання? Я не хочу переглядати пару файлів концертів від руки.
mpen

Насправді так і повинно бути: Якщо ви спробуєте запустити "зручний" сценарій у версії, старшій за вказану в "коментарі", ви отримаєте помилку.
Даніель

1

Насправді важливо зберігати коментарі умовного виконання. Але якщо ви точно знаєте, що версія MySQL, яка завантажує дамп, більша або дорівнює тій, яка її створює, ви можете видалити частину "коментар" за допомогою цього:

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

Він перетворить такі рядки, як

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

до

SET SQL_MODE=@OLD_SQL_MODE ;

Оскільки цей рядок повинен працювати на будь-якому MySQL> = 4.1.1

Зверніть увагу, що це не призведе до видалення багаторядкових коментарів умовного виконання, наприклад, при скиданні тригера.

Оскільки неможливо передбачити майбутнє, краще зберігати дамп із коментарями і видаляти їх лише тоді, коли ви хочете його візуалізувати.

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

0

Можливо, на ньому виконується регулярний вираз для видалення рядків, які містять 40014 або 40111 тощо.


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

Він видаляє всі такі рядки:

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

0

Якщо ви натрапили на цю відповідь, намагаючись включити файл 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

1
Що з усіма голосами проти на відповіді "зняти рядки регулярним виразом"? Вони цілком дійсні. Цей, зокрема, цілком застосовний до моєї ситуації. +1 для всіх вас.
plainjimbo

0

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

Вам просто потрібно:

npm install -g @luissquall/dbdump

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

0

Використовуйте --dump-date=FALSE

Робить саме те, про що просить OP. (не зовсім так, я бачу)

Джерело: резюме опції mysqldump

Редагувати: Вже через хвилину я зрозумів, це те, що я шукав не ОП, а залишаючи тут ... сподіваюся, хтось може ним скористатися: Цей рядок дати, який руйнує контроль над джерелом, тому що це завжди зміна ...


1
Саме те, що я шукав, чому люди навіть проти цього? Велике голосування від мене.
kungfooman

-1

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


-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.