Wie kann ich diese Kommentare in einem MySQL-Dump entfernen?

80

Ich versuche, einen einfachen Struktur-Nur-Dump meiner Datenbank zu erstellen. Die Verwendung mysqldumpgibt mir ein Ergebnis wie:

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

Egal was ich versuche, ich kann diese Kommentare einfach nicht loswerden.

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

Bearbeiten: Ich möchte jedoch andere Kommentare behalten, wie z-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)

Ätheros
quelle
Keine direkte Antwort - aber ich habe gerade mysqldump vollständig für mk-parallel-dump verworfen - es ist schneller (erzeugt mehrere Prozesse) und je nachdem, was Sie mit der Dump-Ausgabe tun werden, flexibler, da es mysqldump und 'select effektiv kapselt in outfile 'Syntax zusammen.
zznate
1
Ich frage mich, warum Oracle mysqdump nicht so wichtige Optionen hinzugefügt hat.
PHPst

Antworten:

159

WHOA! Dies sind keine wirklichen Kommentare, obwohl sie so aussehen. Sie sind Token für die bedingte Ausführung.

Nehmen Sie diese Linie:

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

Wenn die Version von mySQL 4.00.14 oder höher ist , führt der MySQL-Server diese Anweisung aus.

Diese magische Kommentarsyntax ist im Abschnitt Kommentarsyntax des Handbuchs dokumentiert.

Sie wollen dieses Zeug wahrscheinlich nicht loswerden.

O. Jones
quelle
2
Eine weitere Frage, die speziell nach Kommentaren in MySQL fragt, die als ausführbares SQL behandelt werden (gerade von mir gepostet): stackoverflow.com/questions/25614919/…
Dan Nissenbaum
1
In einigen Fällen kann das Entfernen von Kommentaren hilfreich sein. dh bugs.mysql.com/bug.php?id=48972 wenn --insert-ignore aufgrund dieser nicht wie erwartet funktioniert
varela
+1 Das habe ich nie gewusst. Ich dachte, es wären nur Befehle, die der MySQL-Dump beim Exportieren ausführte. Sehr aufschlussreiche Antwort.
Kapitän Hypertext
Angenommen, dies sollte bedeuten, dass Kompatibilitätsoptionen erwartet werden, die angeben, ob Sie die SQL auf älteren MySQL-Versionen ausführen möchten, und wenn nicht, müssen Sie sie in einen bedingten Kommentar einschließen.
CMCDragonkai
39

Ich weiß, dass dies eine alte Frage ist, aber hier ist zumindest eine Antwort. Ich konnte auch kein Flag in mysqldump finden, um die bedingten Kommentare zu entfernen, oder eine bessere Option, um eine minimale mysql-Version festzulegen, damit diese Kommentare angezeigt werden. Wenn Sie nur alle nuklearisieren möchten, können Sie dies mit grep oder sed tun (sed hinterlässt leere Zeilen, grep nicht):

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

Verwenden Sie eine dieser Optionen, um meinen eigenen Wunsch zu erfüllen, Kommentare abhängig von der MySQL-Version bedingt zu entfernen (entfernt alle Kommentare für alles <MySQL5):

mysqldump ... | grep -v '^\/\*![0-4][0-9]\{4\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-4][0-9]\{4\}.*\/;$//g'
Tom Hennigan
quelle
1
Für rsnapshot-Backups ist es nützlich, die letzte Zeile zu mysqldump ... | grep -v '^-- Dump completed on .*$'
entfernen
Ja, aber das Problem ist, dass Sie möglicherweise den DROP DATABASE IF EXISTS OP verlieren IGNORING YOUR CURRENT SESSION VARIABLES . Es sei denn, Sie wissen, was Sie tun: Entfernen Sie sie nicht INSBESONDERE, WENN SIE ZWISCHEN UMGEBUNGEN / GASTGEBER MIGRIEREN. da die resultierende Ausgabe aus einer Reihe von Gründen möglicherweise nicht wie erwartet ist. Sie wurden zu Ihrem Schutz dorthin gebracht. Aber wenn Sie nicht angeschnallt sein möchten, haben Sie die Wahl.
JayRizzo
1
@ rubo77 Sie könnten diesen MySQL-Dump-Parameter auch verwenden:--skip-dump-date
Dehart
33

Versuchen Sie es --skip-comments?

Vielen Dank

Bearbeiten:

Ich verstehe .. Versuchen Sie das

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

Spielen Sie herum, um einige der Optionen zu entfernen, bis Sie das gewünschte Ergebnis erhalten. Im Grunde ist dies dasselbe wie --compactohne--skip-comments

--skip-comments entfernt die Kommentare in Bezug auf Version und Sachen ..

Mahesh Velaga
quelle
5
Leider werden dadurch alle Kommentare entfernt, die ich möchte, und alle, die ich nicht intakt habe, bleiben erhalten.
Etheros
@etheros Ich stimme zu, aber wir sollten näher darauf eingehen. Mein Anwendungsfall bezieht sich auf quellengesteuerte Strukturdaten. Ich möchte nicht für jeden Tisch ein nicht wesentliches Geschwätz. Ich mag den SET NAMESAnruf, der --skip-set-charset, wie in dieser Antwort vorgeschlagen, entfernt wird; Dies kommt nur einmal am Anfang der Speicherauszugsdatei vor und kann die Datenwiederherstellung erheblich beeinträchtigen. Ich mag --skip-add-locks --skip-disable-keysfür meinen Anwendungsfall. Aber einige der bedingten Kommentare, wie /*!40101 SET character_set_client = @saved_cs_client */;und /*!40101 SET character_set_client = utf8 */... nützlich oder nicht?
Ben Johnson
1
@ BenJohnson Nein, sind sie nicht. character_set_clientkann aufgrund eines Fehlers oder Ähnlichem nicht in 5.6 festgelegt werden. Wenn Sie also beispielsweise utf8mb4Daten mysqldumping , erhalten Sie diese bedingten Kommentare dort, wo Sie sie nicht möchten.
Slava
18

Haben Sie die Verknüpfungsoption ausprobiert --compact?

Informationen hier .

Corey Ballou
quelle
2
Ich habe jedoch deaktiviert es andere Kommentare , die ich tun möchte, wie -- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32).
Etheros
12

Technisch gesehen sind die Zeilen, die Sie entfernen möchten, keine Kommentare. Sie ändern vorübergehend einige Variablen am Anfang und setzen sie am Ende auf den vorherigen Wert zurück.

Sie sind in Ihrem Fall nicht sehr nützlich (aber auch harmlos), da Sie --no-data verwenden, aber ich fand es erwähnenswert, dass die Zeilen einen Zweck erfüllen und nicht nur Kommentare sind.

Ike Walker
quelle
4

Dies sind keine Kommentare. Die Ausführung dieses Teils der Skripte hängt von der Version Ihrer MySQL ab.

Sie können "den Kommentarteil" wie löschen

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

zu

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

das Skript "bequemer" zum Lesen machen.

Wenn Sie versuchen, ein "komfortables" Skript in einer neueren Version als der im "Kommentar" angegebenen auszuführen, wird eine Fehlermeldung angezeigt.

Gustavo
quelle
2
Wie können wir "den Kommentarteil löschen"? Gibt es dafür eine Dump-Option? Ich möchte nicht ein paar Gig-Dateien von Hand durchgehen.
Mpen
Eigentlich sollte es so sein: Wenn Sie versuchen, ein "komfortables" Skript in einer Version auszuführen, die älter als die im "Kommentar" angegebene ist, wird eine Fehlermeldung angezeigt.
Daniel
0

Führen Sie wahrscheinlich einen regulären Ausdruck darauf aus, um Zeilen zu entfernen, die 40014 oder 40111 usw. enthalten.

MindStalker
quelle
0

Wenn Sie unter Windows arbeiten und niemand eine bessere Lösung findet, können Sie stattdessen ein Python-Skript verwenden:

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

Verwendung über die Befehlszeile:

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

Es entfernt alle Zeilen wie folgt:

/*!....... */;
Mark Byers
quelle
0

Wenn Sie auf diese Antwort gestoßen sind und versucht haben, Ihre Datei struct.sql in git / github aufzunehmen, können Sie die automatische Inkrementierung mit dem folgenden Code direkt nach dem Rake von db: structure: dump entfernen

# 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
quelle
1
Was ist mit all den Abstimmungen auf den Antworten "Streifen Sie die Zeilen mit einem regulären Ausdruck"? Diese sind absolut gültig. Dies gilt insbesondere für meine Situation. + 1 für euch alle.
Plainjimbo
0

Ich habe dieses Skript erstellt, um den Speicherauszug zu normalisieren, einschließlich des Entfernens bedingter Kommentare: https://github.com/luissquall/dbdump .

Du musst nur:

npm install -g @luissquall/dbdump

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

Verwenden --dump-date=FALSE

Tut genau das, was OP verlangt. (nicht genau, ich verstehe)

Quelle: Zusammenfassung der mysqldump-Optionen

Edit: Kurz nach einer Minute wurde mir klar, das ist was ich nicht nach dem OP gesucht habe, sondern hier ... in der Hoffnung, dass jemand es verwenden kann: Diese Datumszeile, die die Quellcodeverwaltung ruiniert, weil es immer eine Änderung ist ...

p.pickardou
quelle
1
Genau das, wonach ich gesucht habe, warum stimmen die Leute das überhaupt ab? Große Gegenstimme von mir.
lama12345
0

Es ist wirklich wichtig, die Kommentare zur bedingten Ausführung beizubehalten. Wenn Sie jedoch unbedingt wissen, dass die MySQL-Version, mit der der Speicherauszug geladen wird, größer oder gleich der Version ist, mit der der Speicherauszug erstellt wird, können Sie den Teil "Kommentar" folgendermaßen entfernen:

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

Es werden Zeilen wie konvertiert

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

zu

SET SQL_MODE=@OLD_SQL_MODE ;

Weil diese Zeile auf jedem MySQL> = 4.1.1 laufen muss

Beachten Sie, dass dadurch keine mehrzeiligen Kommentare zur bedingten Ausführung entfernt werden, z. B. wenn ein Trigger ausgegeben wird.

Da es unmöglich ist, die Zukunft vorherzusagen, ist es besser, den Speicherauszug mit den Kommentaren zu speichern und sie nur zu entfernen, wenn Sie ihn visualisieren möchten.

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

Wie @Ollie und einige andere betonten, handelt es sich um Token für die bedingte Ausführung, die im Kommentarstil geschrieben wurden, aber einen Zweck erfüllten. Ohne sie können Probleme beim Neuerstellen von Tabellen mit stark erzwungenen Fremdschlüsseleinschränkungen auftreten. Zum Beispiel hat Tabelle A FK für Tabelle B und daher kann Tabelle A erst erstellt werden, wenn Tabelle B dies tut und so weiter. Ohne Deaktivierung der Schlüsselprüfungen können Sie diese möglicherweise nie neu erstellen, je nachdem, wie Ihre Tabellenreihenfolge mit einer Geldstrafe belegt wird.

Devy
quelle
-2

Ich weiß nicht, ob es das ist, wonach Sie suchen. Ich wollte einfach alle MySQL-Kommentare loswerden, um einen Syntax-Textmarker verwenden zu können. Ich habe einen einfachen regulären Ausdruck verwendet und alle durch das folgende "/ \ *! [ 0-9] {5} | \ * / "und voila! schöne Farben im Code;)

ITomas
quelle