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.
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.
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'
--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 ..
Haben Sie die Verknüpfungsoption --compact
ausprobiert?
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.
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.
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 ...
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
Wahrscheinlich wird ein regulärer Ausdruck darauf ausgeführt, um Zeilen zu entfernen, die 40014 oder 40111 usw. enthalten.
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:
/*!....... */;
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
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 mysqldump
s, da es die Endung */
comment markiert, aber für Menschen lesbare Kommentare, zumindest ab 5.5, verwenden Sie die Zeilenkommentar-Syntax --
).