Jak pozbyć się tych komentarzy ze zrzutu MySQL?

82

Próbuję stworzyć prostą strukturę, tylko zrzut mojej bazy danych. Użycie mysqldumpdaje mi wynik taki jak:

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

Bez względu na to, co próbuję, po prostu nie mogę pozbyć się tych komentarzy.

Obecnie używam: mysqldump -p -d --add-drop-table --skip-tz-utc --skip-set-charset -h 127.0.0.1 -u foo bar --result-file=dumpfile.sql

Edycja: chcę jednak zachować inne komentarze, takie jak-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)

etheros
źródło
Nie jest to bezpośrednia odpowiedź - ale całkowicie porzuciłem mysqldump dla mk-parallel-dump - jest szybszy (generuje wiele procesów) iw zależności od tego, co zamierzasz zrobić z wyjściem zrzutu, bardziej elastyczny, ponieważ skutecznie hermetyzuje mysqldump i 'select do składni pliku wyjściowego.
zznate
2
Zastanawiam się, dlaczego Oracle nie dodał tak ważnych opcji do mysqdump?
PHPst

Odpowiedzi:

162

WHOA! To nie są tak naprawdę komentarze, mimo że tak wyglądają. Są to tokeny wykonania warunkowego.

Wybierz tę linię:

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

Jeśli wersja MySQL to 4.00.14 lub nowsza , serwer MySQL uruchomi tę instrukcję.

Ta magiczna składnia komentarzy jest udokumentowana w sekcji Składnia komentarzy podręcznika.

Prawdopodobnie nie chcesz się tego pozbyć.

O. Jones
źródło
2
Kolejne pytanie, które konkretnie dotyczy traktowania komentarzy w MySQL jako wykonywalnego SQL (właśnie wysłane przeze mnie): stackoverflow.com/questions/25614919/ ...
Dan Nissenbaum
1
W niektórych przypadkach usunięcie komentarzy może pomóc. tj. bugs.mysql.com/bug.php?id=48972 kiedy --insert-ignore nie działa zgodnie z oczekiwaniami z ich powodu
varela
+1 Nigdy tego nie wiedziałem. Myślałem, że to tylko polecenia uruchamiane przez mysql dump podczas eksportowania. Bardzo pouczająca odpowiedź.
Captain Hypertext
1
Załóżmy, że powinno to oznaczać, że powinny istnieć oczekiwane opcje kompatybilności, które określają, czy spodziewasz się uruchamiać sql na starszych wersjach mysql, a jeśli nie, to musisz owinąć go komentarzem warunkowym.
CMCDragonkai
40

Wiem, że to starożytne pytanie, ale oto przynajmniej odpowiedź. Nie mogłem również znaleźć flagi w mysqldump, aby usunąć komentarze warunkowe, ani nawet lepszej opcji ustawienia minimalnej wersji mysql, aby te komentarze się pojawiały. Jeśli chcesz po prostu zniszczyć je wszystkie, możesz to zrobić za pomocą grep lub sed (sed pozostawia puste linie, grep nie):

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

Aby odpowiedzieć na moje życzenie warunkowego usuwania komentarzy zależnych od wersji mysql, użyj jednego z nich (usuwa wszelkie komentarze do czegokolwiek <mysql5):

mysqldump ... | grep -v '^\/\*![0-4][0-9]\{4\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-4][0-9]\{4\}.*\/;$//g'
Tom Hennigan
źródło
1
W przypadku kopii zapasowych rsnapshot warto pozbyć się ostatniej linii, czyli bazy danych, która nie zmieniła wyników w tym samym pliku:mysqldump ... | grep -v '^-- Dump completed on .*$'
rubo77
tak, ale problem polega na tym, że możesz stracić DROP DATABASE IF EXISTS OR IGNORING YOUR CURRENT SESSION VARIABLES . Chyba że wiesz, co robisz: nie usuwaj ich, SZCZEGÓLNIE PODCZAS MIGRACJI MIĘDZY ŚRODOWISKAMI / HOSTAMI. ponieważ wynikowy wynik może nie być zgodny z oczekiwaniami z wielu powodów. Zostały tam umieszczone dla twojej ochrony. ale jeśli nie chcesz zapinać pasów, to twój wybór.
JayRizzo
1
@ rubo77 Możesz również użyć tego parametru dump mysql:--skip-dump-date
dehart
33

Spróbuj --skip-comments?

Dzięki

Edytować:

Rozumiem… Spróbuj tego

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

Pobaw się, aby usunąć niektóre opcje, aż uzyskasz pożądany rezultat, w zasadzie jest to to samo, co --compactbez--skip-comments

--skip-comments usuwa komentarze dotyczące wersji i innych elementów.

Mahesh Velaga
źródło
5
Niestety, powoduje to usunięcie wszystkich komentarzy, które chcę, pozostawiając wszystkie te, których nie chcę.
etheros
@etheros Zgadzam się, ale powinniśmy to rozwinąć. Mój przypadek użycia dotyczy danych strukturalnych kontrolowanych przez źródło. Nie chcę żadnych zbędnych rozmów przy każdym stole. Podoba mi się SET NAMESwezwanie, które --skip-set-charset, jak sugeruje ta odpowiedź, usuwa; dzieje się to tylko raz na początku pliku zrzutu i może mieć istotny wpływ na przywrócenie danych. Lubię --skip-add-locks --skip-disable-keysdla mojego przypadku użycia. Ale niektóre warunkowe komentarze, takie jak /*!40101 SET character_set_client = @saved_cs_client */;i /*!40101 SET character_set_client = utf8 */... przydatne, czy nie?
Ben Johnson,
1
@BenJohnson Nie, nie są. character_set_clientnie można ustawić w 5.6 z powodu błędu lub czegoś podobnego, więc kiedy mysqldumping na przykład utf8mb4dane, otrzymujesz te warunkowe komentarze tam, gdzie ich nie chcesz.
Slava
18

Czy próbowałeś opcji skrótu --compact?

Informacje tutaj .

Corey Ballou
źródło
2
Zrobiłem, ale wyłącza inne komentarze, które chcę, takie jak -- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32).
etheros
12

Technicznie rzecz biorąc, linie, których próbujesz się pozbyć, nie są komentarzami. Tymczasowo modyfikują niektóre zmienne na początku, a na końcu resetują je do poprzedniej wartości.

Nie są one zbyt przydatne (ale są też nieszkodliwe) w twoim przypadku, ponieważ używasz --no-data, ale pomyślałem, że warto wspomnieć, że linie służą celowi, a nie są tylko komentarzami.

Ike Walker
źródło
4

To nie są komentarze, wykonanie tej części skryptów zależy od wersji twojego mysql.

Możesz usunąć „część komentarza”, na przykład

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

do

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

czyniąc skrypt bardziej „wygodnym” do czytania.

Jeśli spróbujesz uruchomić „wygodny” skrypt w wersji nowszej niż określona w „komentarzu”, pojawi się błąd.

Gustavo
źródło
2
Jak możemy „usunąć część komentarza”? Czy jest do tego opcja zrzutu? Nie chcę ręcznie przeglądać pliku z paroma koncertami.
mpen
Właściwie powinno być: Jeśli spróbujesz uruchomić „wygodny” skrypt w wersji starszej niż określona w „komentarzu”, pojawi się błąd.
Daniel
1

Bardzo ważne jest, aby zachować komentarze dotyczące wykonania warunkowego. Ale jeśli absolutnie wiesz, że wersja MySQL, która załaduje zrzut jest większa lub równa tej, która go tworzy, możesz usunąć część "komentarza" w ten sposób:

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

Konwertuje linie, takie jak

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

do

SET SQL_MODE=@OLD_SQL_MODE ;

Ponieważ ta linia musi działać na każdym MySQL> = 4.1.1

Zauważ, że nie usunie to wielowierszowych komentarzy dotyczących warunkowego wykonywania, na przykład podczas zrzucania wyzwalacza.

Ponieważ nie można przewidzieć przyszłości, lepiej jest przechowywać zrzut z komentarzami i usuwać je tylko wtedy, gdy chcesz go zwizualizować.

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

Prawdopodobnie uruchomienie na nim wyrażenia regularnego w celu usunięcia wierszy zawierających 40014 lub 40111 itd.

MindStalker
źródło
0

Ponieważ używasz systemu Windows, jeśli nikt nie znajdzie lepszego rozwiązania, możesz zamiast tego użyć skryptu Python:

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

Użycie z wiersza poleceń:

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

Usuwa wszystkie takie linie:

/*!....... */;
Mark Byers
źródło
0

Jeśli natknąłeś się na tę odpowiedź, próbując dołączyć swój plik structure.sql do git / github, możesz usunąć auto-inkrementację za pomocą następującego kodu zaraz po rake 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
jwg2s
źródło
1
O co chodzi z tymi wszystkimi głosami przeciw w odpowiedziach „usuń wiersze wyrażeniem regularnym”? Te są całkowicie ważne. Ten w szczególności ma pełne zastosowanie do mojej sytuacji. +1 dla was wszystkich.
plainjimbo
0

Zrobiłem ten skrypt, aby znormalizować zrzut, w tym usunąć komentarze warunkowe: https://github.com/luissquall/dbdump .

Ty po prostu musisz:

npm install -g @luissquall/dbdump

# Redirect output to a file
dbdump -u user -p -d database > struct.sql
luissquall
źródło
0

Posługiwać się --dump-date=FALSE

Robi dokładnie to, o co prosi OP. (nie do końca, widzę)

Źródło: podsumowanie opcji mysqldump

Edycja: Zaraz po minucie zdałem sobie sprawę, że to jest to , czego szukałem, a nie OP, ale wychodząc tutaj ... w nadziei, że ktoś może go użyć: Ta linia daty, która rujnuje kontrolę źródła, ponieważ zawsze to zmiana ...

g.pickardou
źródło
1
Dokładnie to, czego szukałem, dlaczego ludzie w ogóle to odrzucają? Wielkie poparcie ode mnie.
kungfooman
-1

Nie wiem, czy tego właśnie szukasz, po prostu chciałem pozbyć się wszystkich rzeczy związanych z komentarzami mysql, aby móc korzystać z podświetlacza składni. Użyłem prostego wyrażenia regularnego i zastąpiłem wszystko następującym „/ \ *! [ 0-9] {5} | \ * / "i voila! ładne kolory w kodzie;)

ITomas
źródło
-1

Jak zauważyła @Ollie i kilka innych, są to tokeny warunkowego wykonania napisane w stylu komentarza, ale służyły celowi. Bez nich możesz napotkać problemy z odtwarzaniem tabel z silnie wymuszonym ograniczeniem klucza obcego. Na przykład tabela A ma FK dla tabeli B i dlatego tabela A nie może zostać utworzona, dopóki nie zrobi tego tabela B i tak dalej. Bez wyłączenia kluczowych kontroli możesz nigdy nie być w stanie ich odtworzyć, w zależności od tego, jaka jest kara za zamówienie stolika.

Devy
źródło