86 votes

Comment puis-je me débarrasser de ces commentaires dans une sauvegarde MySQL?

Je suis en train de créer une simple structure de sauvegarde de ma base de données. En utilisant mysqldump, j'obtiens un résultat comme suit :

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

Peu importe ce que j'essaie, je n'arrive simplement pas à me débarrasser de ces commentaires.

Je suis actuellement en train d'utiliser : mysqldump -p -d --add-drop-table --skip-tz-utc --skip-set-charset -h 127.0.0.1 -u foo bar --result-file=dumpfile.sql

Édition : Cependant, je souhaite conserver les autres commentaires, tels que -- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)

0 votes

Pas une réponse directe - mais j'ai complètement abandonné mysqldump classique pour mk-parallel-dump - c'est plus rapide (crée plusieurs processus) et, selon ce que vous allez faire avec la sortie du dump, plus flexible car il encapsule efficacement mysqldump et la syntaxe 'select into outfile' ensemble.

2 votes

Je me demande pourquoi Oracle n'a pas ajouté de telles options importantes à mysqdump?

173voto

Ollie Jones Points 20488

OUAH ! Ces éléments ne sont pas vraiment des commentaires, même s'ils semblent l'être. Ce sont des jetons d'exécution conditionnelle.

Prenez cette ligne :

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

Si la version de MySQL est 4.00.14 ou plus récente, alors le serveur MySQL exécutera cette déclaration.

Cette syntaxe de commentaire magique est documentée dans la section Syntaxe des commentaires du manuel.

Vous ne voulez probablement pas vous débarrasser de ces éléments.

2 votes

Une autre question qui pose spécifiquement la question des commentaires dans MySQL étant traités comme du SQL exécutable (venant juste d'être publié par moi) : stackoverflow.com/questions/25614919/…

1 votes

Il y a des cas où la suppression de commentaires peut aider. c'est-à-dire bugs.mysql.com/bug.php?id=48972 lorsque --insert-ignore ne fonctionne pas comme prévu à cause d'eux.

0 votes

+1 Je ne savais pas ça. Je pensais juste que c'étaient des commandes que mysql dump exécutait pendant l'exportation. Réponse très instructive.

41voto

Tom Hennigan Points 344

Je sais que c'est une question ancienne, mais voici au moins une réponse. Je n'ai pas trouvé de drapeau dans mysqldump pour supprimer les commentaires conditionnels, ni vraiment une meilleure option pour définir une version minimale de mysql pour que ces commentaires apparaissent. Si vous voulez simplement les supprimer tous, vous pouvez le faire en utilisant grep ou sed (sed laisse des lignes vides, grep ne le fait pas) :

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

Pour répondre à mon propre souhait de supprimer conditionnellement les commentaires dépendant de la version de mysql, utilisez l'un de ces moyens (supprime tous les commentaires pour tout ce qui est < mysql5) :

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

1 votes

Pour les sauvegardes rsnapshot, il est utile de se débarrasser de la dernière ligne, de sorte qu'une base de données qui n'a pas changé donne le même fichier : mysqldump ... | grep -v '^-- Dump completed on .*$'

0 votes

Oui mais le problème est que vous pouvez perdre le DROP DATABASE IF EXISTS OU IGNORING YOUR CURRENT SESSION VARIABLES . À moins que vous ne sachiez ce que vous faites : Ne les supprimez PAS, SURTOUT LORS DE LA MIGRATION ENTRE LES ENVIRONNEMENTS/HÔTES. car la sortie résultante peut ne pas être celle attendue, pour un certain nombre de raisons. Ils ont été mis là pour votre protection. mais si vous ne voulez pas mettre votre ceinture de sécurité, c'est votre choix.

2 votes

@rubo77 Tu pourrais également utiliser ce paramètre mysql dump : --skip-dump-date

33voto

Mahesh Velaga Points 9420

Essayer --skip-comments ?

Merci

Éditer :

Je vois .. Essayez ceci

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

Expérimentez pour supprimer certaines des options jusqu'à ce que vous obteniez le résultat souhaité, fondamentalement c'est la même chose que --compact sans --skip-comments

--skip-comments supprime les commentaires relatifs à la version et autres ..

6 votes

Malheureusement, cela supprime tous les commentaires que je veux, laissant intacts tous ceux que je ne veux pas.

0 votes

@etheros Je suis d'accord, mais nous devrions élaborer. Mon cas d'utilisation concerne les données structurales contrôlées par source. Je ne veux pas de bavardages non essentiels pour chaque table. J'aime l'appel SET NAMES que --skip-set-charset, tel que suggéré dans cette réponse, supprime ; cela se produit une seule fois au début du fichier de vidage, et pourrait affecter de manière significative la restauration des données. J'aime bien --skip-add-locks --skip-disable-keys pour mon cas d'utilisation. Mais certains des commentaires conditionnels, tels que /*!40101 SET character_set_client = @saved_cs_client */; et /*!40101 SET character_set_client = utf8 */ ... utiles, ou non ?

1 votes

@BenJohnson Non, ce n'est pas le cas. character_set_client ne peut pas être défini en 5.6 en raison d'un bug ou quelque chose comme ça, donc lorsque vous effectuez un mysqldump par exemple des données utf8mb4, vous obtenez ces commentaires conditionnels là où vous ne les voulez pas.

20voto

cballou Points 13804

Avez-vous essayé l'option de raccourci --compact ?

Informations ici.

2 votes

J'ai fait, cependant cela désactive d'autres commentaires que je veux, tels que -- MySQL dump 10.13 Distrib 5.1.41, pour Win32 (ia32).

13voto

Ike Walker Points 21162

Techniquement, les lignes que vous essayez de supprimer ne sont pas des commentaires. Ils modifient temporairement certaines variables au début, puis les réinitialisent à leur valeur précédente à la fin.

Ils ne sont pas très utiles (mais ils sont également inoffensifs) dans votre cas, puisque vous utilisez --no-data, mais je pensais qu'il valait la peine de mentionner que les lignes servent bel et bien un but et ne sont pas que des commentaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X