it-swarm.com.de

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

Ich versuche, einen einfachen Dump der Datenbank zu erstellen. Die Verwendung von mysqldump gibt mir ein Ergebnis wie:

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

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

Ich verwende 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 wie -- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32) beibehalten.

72
etheros

WHOA! Dies sind keine wirklichen Kommentare, auch wenn sie so aussehen. Sie sind bedingte Ausführungsmarker.

Nehmen Sie diese Zeile:

/*!40014 SET @[email protected]@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 Comment-Syntax des Handbuchs dokumentiert.

Sie möchten dieses Zeug wahrscheinlich nicht loswerden.

139
O. Jones

Ich weiß, das ist eine alte Frage, aber hier ist zumindest eine Antwort. Ich konnte auch keine Markierung in mysqldump finden, um die bedingten Kommentare zu entfernen, oder tatsächlich eine bessere Option, um eine Mindestversion von mysql für diese Kommentare festzulegen. Wenn Sie nur alle nuke machen wollen, 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'

Um meinen eigenen Wunsch zu erfüllen, von der mysql-Version abhängige Kommentare bedingt zu entfernen, verwenden Sie eine der folgenden Optionen (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'
35
Tom Hennigan

--skip-comments ausprobieren?

Vielen Dank

Bearbeiten:

Ich verstehe .. Versuch 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. Dies ist im Grunde dasselbe wie --compact ohne --skip-comments.

--skip-comments entfernt die Kommentare zu Version und Sachen ..

30
Mahesh Velaga

Haben Sie die Verknüpfungsoption --compact ausprobiert?

Informationen hier .

13
Corey Ballou

Technisch gesehen sind die Zeilen, die Sie loswerden möchten, keine Kommentare. Sie modifizieren einige Variablen am Anfang vorübergehend 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 dachte, es lohnt sich zu erwähnen, dass die Zeilen einem Zweck dienen und nicht nur Kommentare sind.

11
Ike Walker

Dies sind keine Kommentare. Die Ausführung dieses Teils der Skripts hängt von der Version Ihres mysql ab.

Sie können "den Kommentarteil" löschen

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

zu

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

das Skript für das Lesen "komfortabler" machen.

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

3
Gustavo

Verwenden Sie --dump-date = FALSE

Funktioniert genau was OP verlangt. (nicht genau, ich sehe)

Quelle: Übersicht über die mysqldump-Option

Edit: Kurz nach einer Minute wurde mir klar, dass dies das ist, wonach I nicht nach dem OP gesucht wurde, aber ich gehe hier ... in der Hoffnung, dass jemand es benutzen kann: Diese Datumszeile zerstört die Quellcodeverwaltung , weil es immer eine Veränderung ist ...

1
g.pickardou

Ich habe dieses Skript erstellt, um den Speicherauszug zu normalisieren und bedingte Kommentare zu entfernen: 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
0
luissquall

Wahrscheinlich wird ein regulärer Ausdruck darauf ausgeführt, um Zeilen zu entfernen, die 40014 oder 40111 usw. enthalten.

0
MindStalker

Wenn Sie unter Windows sind 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 von der Kommandozeile:

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

Es entfernt alle Zeilen wie folgt:

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

Wenn Sie über diese Antwort gestolpert sind und versucht haben, die Datei structure.sql in git/github einzuschließen, können Sie Auto-Inkrement mit dem folgenden Code direkt nach dem Rendern 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
0
jwg2s

Eine weitere Option, wenn Sie vi/vim verwenden und eine schnelle und schmutzige Methode benötigen, um die Anweisung Inhalt beizubehalten, aber den Kommentar in Klammern abbrechen:

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

(Nur sicher bei mysqldumps, da es die Endung */comment markiert, aber für Menschen lesbare Kommentare, zumindest ab 5.5, verwenden Sie die Zeilenkommentar-Syntax --).

0
msanford