2009-12-16 20 views
63

Sto provando a creare una struttura semplice solo dump del mio database. Utilizzando mysqldump mi dà un risultato simile:Come posso eliminare questi commenti in un dump MySQL?

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

Non importa quello che cerco, io proprio non riesco a sbarazzarsi di tali osservazioni.

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

Edit: Io però voglio trattenere altri commenti, come ad esempio -- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)

+1

Mi chiedo perché Oracle non abbia aggiunto opzioni così importanti a mysqdump? – PHPst

risposta

9

Hai provato l'opzione di scelta rapida --compact?

Information here.

+1

Ho fatto, tuttavia disabilita altri commenti I * do * want, come '- MySQL dump 10.13 Distrib 5.1.41, per Win32 (ia32)'. – etheros

27

Provare --skip-comments?

Grazie

Edit:

vedo .. Prova questo

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

giocare per rimuovere alcune delle opzioni fino ad ottenere il risultato desiderato, in fondo questo è lo stesso --compact senza --skip-comments

--skip-comments rimuove i commenti relativi alla versione e roba ..

+3

Purtroppo questo rimuove tutti i commenti che voglio, lasciando tutti quelli che non sono intatti. – etheros

+0

@etheros Io concordo, ma dovremmo elaborare. Il mio caso d'uso riguarda dati strutturali controllati dalla fonte. Non voglio nessuna chiacchierata non essenziale per ogni tavolo. Mi piace la chiamata 'SET NAMES' che' --skip-set-charset', come suggerito in questa risposta, rimuova; si verifica solo una volta all'inizio del file di dump e può influire sul ripristino dei dati in modo sostanziale. Mi piace '--skip-add-locks --skip-disable-keys' per il mio caso d'uso. Ma alcuni dei commenti condizionali, come '/ *! 40101 SET character_set_client = @saved_cs_client * /;' e '/ *! 40101 SET character_set_client = utf8 * /' ... utile o no? –

-1

Probabilmente l'esecuzione di un regex su di esso per rimuovere le righe che contengono 40014 o 40111, ecc

-1

Non è una risposta diretta - ma ho trincerati mysqldump dritto interamente per mk-parallel-dump - è più veloce (genera più processi) e in base a ciò che si intende eseguire con l'output di dump, più flessibile in quanto incapsula in modo efficace la sintassi mysqldump e 'select into outfile' insieme.

0

Dal momento che siete su Windows, se nessuno trova una soluzione migliore allora si potrebbe utilizzare uno script Python, invece:

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

Utilizzo da linea di comando:

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

Rimuove tutte le linee così:

/*!....... */; 
11

Tecnicamente le righe che stai cercando di eliminare non sono commenti. Modificano temporaneamente alcune variabili all'inizio e quindi ripristinano il valore precedente alla fine.

Non sono molto utili (ma sono anche innocui) nel tuo caso, dal momento che stai usando --no-data, ma ho pensato che valga la pena ricordare che le linee hanno uno scopo, e non lo sono solo commenti.

127

WHOA! Questi non sono realmente commenti anche se sembrano così. Sono token di esecuzione condizionale.

Prendete questa linea:

/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 

Se la versione di MySQL è 4.00.14 o superiore, il server MySQL verrà eseguito questa informativa.

Questa sintassi dei commenti magici è documentata nella sezione Comment Syntax del manuale.

Probabilmente non vuoi liberarti di questa roba.

+2

Un'altra domanda che chiede specificamente ai commenti in MySQL di essere trattati come SQL eseguibile (appena pubblicato da me): http://stackoverflow.com/questions/25614919/where-is-it-documented-that-some-comments-in- a-sql-script-execution-by-mysql-usi –

+1

Ci sono alcuni casi in cui la rimozione di commenti può aiutare. ad esempio http://bugs.mysql.com/bug.php?id=48972 quando --insert-ignore non funziona come previsto a causa di loro – varela

+0

+1 non l'ho mai saputo. Pensavo fossero solo dei comandi che mysql dump stava eseguendo mentre veniva esportato. Risposta molto illuminante. –

3

Questi non sono commenti, l'esecuzione di quella parte degli script dipende dalla versione di mysql.

È possibile eliminare "il commento parte", come

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

a

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

rendere lo script più "comodo" per la lettura.

Se si tenta di eseguire uno script "comodo" in una versione più recente rispetto a quella specificata nel "commento", si verificherà un errore.

+0

Come possiamo "cancellare la parte del commento"? C'è un'opzione di dumping per questo? Non voglio passare manualmente un paio di file. – mpen

29

So che questa è una domanda antica, ma qui c'è una risposta almeno. Inoltre non sono riuscito a trovare un flag in mysqldump per rimuovere i commenti condizionali, o addirittura un'opzione migliore per impostare una versione minima mysql per far apparire questi commenti. Se si desidera solo per bombardare tutti, è possibile farlo usando grep o sed (sed lascia righe vuote, grep non fa):

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

di rispondere alla mia propria volontà di commenti condizionalmente rimozione dipende dalla versione di MySQL, l'uso uno di questi (rimuove eventuali commenti per nulla < mysql5):

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

Per i backup di rsnapshot è utile sbarazzarsi dell'ultima riga, quindi un database, che non ha modificato i risultati nello stesso file: 'mysqldump ... | grep -v '^ - Dump completato su. * $' ' – rubo77

+0

sì ma il problema è che potresti perdere il' DROP DATABASE SE EXISTS 'O' IGNORARE LE VARIABILI DI SESSIONE ATTUALE '. A meno che tu non sappia cosa stai facendo: non rimuoverli SOPRATTUTTO QUANDO SI MIGRAZIONE TRA AMBIENTI/OSPITI. poiché l'output risultante potrebbe non essere come previsto, per un numero qualsiasi di motivi. Sono stati messi lì per la tua protezione. ma se non vuoi mettere la cintura di sicurezza su quella è la tua scelta. – JayRizzo

0

Se hai inciampato su questa risposta cercando di includere il file structure.sql in git/github, è possibile eliminare fuori di incremento automatico con il seguente codice subito dopo il 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 
+1

Cosa sono tutti i downvotes sulle risposte "strip the lines with a regexp"? Questi sono totalmente validi. Questo in particolare è interamente applicabile alla mia situazione. +1 per tutti voi. – plainjimbo

-2

Non so se è ciò che stai cercando, volevo semplicemente eliminare tutti i commenti di mysql per poter usare un evidenziatore di sintassi, ho usato una semplice regex e ho sostituito tutti con il seguente "/ \ *! [0-9] {5} | \ */"e voilà! bei colori nel codice;)

0

Un'altra opzione, se si sta utilizzando vi/vim e hanno bisogno di un modo rapido-and-dirty per preservare la dichiarazione contenuti ma bombardare il commento parentesi:

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

(sicuro solo su mysqldump s, poiché nuoce il commento di fine */, ma i commenti leggibili dall'uomo, almeno a partire da 5.5, utilizzano la sintassi di commento di riga --).

-1

Ho creato questo script per normalizzare il dump, inclusa la rimozione dei commenti condizionali: https://github.com/luissquall/dbdump.

Non vi resta che:

npm install -g @luissquall/dbdump 

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

Come @Ollie e pochi altri hanno sottolineato, questi sono sono gettoni condizionale-esecuzione scritti in commento stile, ma servito uno scopo. Senza di essi, potresti incorrere in problemi di ricreare tabelle con vincoli di chiave esterna pesantemente applicati. Ad esempio, la tabella A ha FK per la tabella B e quindi la tabella A non può essere creata fino alla tabella B e così via. Senza disabilitare i controlli chiave, potresti non essere mai in grado di ricrearli a seconda di come l'ordine del tuo tavolo viene multato.