Ich versuche, einen einfachen Struktur-Nur-Dump meiner Datenbank zu erstellen. Die Verwendung mysqldump
gibt 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)
Antworten:
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.
quelle
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):
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):
quelle
mysqldump ... | grep -v '^-- Dump completed on .*$'
DROP DATABASE IF EXISTS
OP verlierenIGNORING 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.--skip-dump-date
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
--compact
ohne--skip-comments
--skip-comments
entfernt die Kommentare in Bezug auf Version und Sachen ..quelle
SET NAMES
Anruf, 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-keys
fü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?character_set_client
kann aufgrund eines Fehlers oder Ähnlichem nicht in 5.6 festgelegt werden. Wenn Sie also beispielsweiseutf8mb4
Daten mysqldumping , erhalten Sie diese bedingten Kommentare dort, wo Sie sie nicht möchten.Haben Sie die Verknüpfungsoption ausprobiert
--compact
?Informationen hier .
quelle
-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)
.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.
quelle
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.
quelle
Führen Sie wahrscheinlich einen regulären Ausdruck darauf aus, um Zeilen zu entfernen, die 40014 oder 40111 usw. enthalten.
quelle
Wenn Sie unter Windows arbeiten und niemand eine bessere Lösung findet, können Sie stattdessen ein Python-Skript verwenden:
Verwendung über die Befehlszeile:
Es entfernt alle Zeilen wie folgt:
/*!....... */;
quelle
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
quelle
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
quelle
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 ...
quelle
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
quelle
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.
quelle
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;)
quelle