Hoe kan ik deze opmerkingen in een MySQL-dump verwijderen?

Ik probeer een eenvoudige dump van mijn database te maken met alleen een structuur. Het gebruik van mysqldumpgeeft me een resultaat als:

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

Wat ik ook probeer, ik krijg die opmerkingen gewoon niet weg.

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

Bewerken:ik wil echter andere opmerkingen behouden, zoals -- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)


Antwoord 1, autoriteit 100%

HOE! Dit zijn niet echt opmerkingen, ook al zien ze er zo uit. Het zijn tokens voor voorwaardelijke uitvoering.

Neem deze regel:

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

Als de versie van mySQL 4.00.14 of hogeris, zal de MySQL-server deze instructie uitvoeren.

Deze magische commentaarsyntaxis is gedocumenteerd in de Commentaarsyntaxisgedeelte van de handleiding.

Je wilt waarschijnlijk niet van dit spul af.


Antwoord 2, autoriteit 24%

Ik weet dat dit een oude vraag is, maar hier is in ieder geval een antwoord. Ik kon ook geen vlag in mysqldump vinden om de voorwaardelijke opmerkingen te verwijderen, of inderdaad een betere optie om een ​​minimale mysql-versie in te stellen om deze opmerkingen te laten verschijnen. Als je ze allemaal wilt vernietigen, kun je dat doen met grep of sed (sed laat lege regels achter, grep niet):

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

Om mijn eigen wens te beantwoorden om opmerkingen die afhankelijk zijn van de mysql-versie voorwaardelijk te verwijderen, gebruik een van deze (verwijdert alle opmerkingen voor alles < mysql5):

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

Antwoord 3, autoriteit 20%

Probeer --skip-comments?

Bedankt

Bewerken:

Ik begrijp het .. Probeer dit

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

Speel wat rond om enkele van de opties te verwijderen totdat je het gewenste resultaat krijgt, in principe is dit hetzelfde als --compactzonder --skip-comments

--skip-commentsverwijdert de opmerkingen met betrekking tot versie en zo ..


Antwoord 4, autoriteit 12%

Heb je de sneltoetsoptie --compactgeprobeerd?

Hier informatie.


Antwoord 5, autoriteit 8%

Technisch gezien zijn de regels die u probeert te verwijderen geen opmerkingen. Ze wijzigen tijdelijk enkele variabelen aan het begin en zetten ze aan het einde terug op de vorige waarde.

Ze zijn niet erg handig (maar ook ongevaarlijk) in jouw geval, aangezien je –no-data gebruikt, maar ik vond het de moeite waard om te vermelden dat de regels een doel dienen, en niet alleen opmerkingen.


Antwoord 6, autoriteit 2%

Dit zijn geen opmerkingen, de uitvoering van dat deel van de scripts hangt af van de versie van uw mysql.

Je kunt “het commentaargedeelte” verwijderen, zoals

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

naar

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

het script “comfortabeler” maken om te lezen.

Als u een “comfortabel” script probeert uit te voeren in een nieuwere versie dan de opgegeven in de “opmerking”, krijgt u een foutmelding.


Antwoord 7

Het is erg belangrijk om de opmerkingen over voorwaardelijke uitvoering te behouden. Maar als u absoluut weetdat de MySQL-versie die de dump zal laden groter of gelijk is aan de versie die deze aanmaakt, kunt u het gedeelte “commentaar” hiermee verwijderen:

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

Het zal regels zoals

. converteren

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

naar

SET SQL_MODE=@OLD_SQL_MODE ;

Omdat deze regel moetdraaien op een MySQL >= 4.1.1

Houd er rekening mee dat dit geen opmerkingen over voorwaardelijke uitvoering van meerdere regels verwijdert, zoals bij het dumpen van een trigger.

Omdat het onmogelijk is om de toekomst te voorspellen, is het beter om de dump op te slaan met de opmerkingen aan, en ze alleen te verwijderen als je het wilt visualiseren.

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

Antwoord 8

Gebruik --dump-date=FALSE

Doet precies waar OP om vraagt. (niet precies, zie ik)

Bron: overzicht van mysqldump-opties

Bewerken: Even na een minuut realiseerde ik me dat ikdit zocht, niet de OP, maar hier achterlatend… in de hoop dat iemand het kan gebruiken:
Deze datumregel die broncontrole verpest, omdat het altijd een verandering is…


Antwoord 9

Waarschijnlijk draait er een regex op om regels te verwijderen die 40014 of 40111 enz. bevatten.


Antwoord 10

Aangezien u Windows gebruikt, kunt u, als niemand een betere oplossing vindt, in plaats daarvan een Python-script gebruiken:

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

Gebruik vanaf opdrachtregel:

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

Het verwijdert alle regels als volgt:

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

Antwoord 11

Als je op dit antwoord bent gestuit terwijl je probeert je structure.sql-bestand in git/github op te nemen, kun je auto-increment verwijderen met de volgende code direct nadat je db:structure:dump hebt geharkt

# 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

Antwoord 12

Ik heb dit script gemaakt om de dump te normaliseren, inclusief het verwijderen van voorwaardelijke opmerkingen: https://github.com/luissquall/ dbdump.

Je hoeft alleen maar:

npm install -g @luissquall/dbdump
# Redirect output to a file
dbdump -u user -p -d database > struct.sql

Antwoord 13

Ik weet niet of dit is wat je zoekt, ik wilde gewoon alle mysql-opmerkingen verwijderen om een ​​syntaxis-highlighter te kunnen gebruiken, ik gebruikte een eenvoudige regex en vervang alles door het volgende “/\ *![0-9]{5}|\*/” en voila! mooie kleuren in de code 😉


Antwoord 14

Zoals @Ollie en een paar anderen al aangaven, zijn dit tokens voor voorwaardelijke uitvoering die in commentaarstijl zijn geschreven maar een doel dienen. Zonder deze kunt u problemen tegenkomen bij het opnieuw maken van tabellen met zwaar opgelegde beperkingen voor externe sleutels. Tabel A heeft bijvoorbeeld FK voor tabel B en dus kan tabel A niet worden gemaakt totdat tabel B dit doet, enzovoort. Zonder de toetscontroles uit te schakelen, kunt u ze misschien nooit opnieuw maken, afhankelijk van hoe uw tafelbestelling wordt beboet.

Other episodes