DROP PROCEDURE IF EXISTS non inclus dans mysqldump

8

Je vide mes procédures stockées uniquement à l'aide de la commande suivante:

mysqldump --routines --no-create-info --no-data --no-create-db --skip-opt databasename -u username -p > outputfile.sql

mais le fichier de vidage résultant n'inclut pas de DROP PROCEDURE IF EXISTS avant chaque déclaration de procédure.

Comment ajouter la requête de dépôt à mon vidage?

Je vous remercie.

nakhli
la source

Réponses:

7

J'ai vidé mes procédures stockées avec les éléments suivants

C:\>mysqldump -u... -p... -n -d --routines --triggers --all-databases > Z:\stuff.sql

Voici une des procédures avec la DROP PROCEDURE incluse:

--
-- Dumping routines for database 'lovesh'
--
/*!50003 DROP PROCEDURE IF EXISTS `LoadMyData` */;
/*!50003 SET @saved_cs_client      = @@character_set_client */ ;
/*!50003 SET @saved_cs_results     = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client  = cp850 */ ;
/*!50003 SET character_set_results = cp850 */ ;
/*!50003 SET collation_connection  = cp850_general_ci */ ;
/*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
/*!50003 SET sql_mode              = '' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50020 DEFINER=`lwdba`@`127.0.0.1`*/ /*!50003 PROCEDURE `LoadMyData`()
    DETERMINISTIC
BEGIN
    DECLARE NDX INT;
    SET NDX = 0;
    WHILE NDX < 100 DO
        INSERT INTO mydata (ti_time) VALUES (NOW() - INTERVAL CEILING(14400*RAND()) SECOND);
    SET NDX = NDX + 1;
    END WHILE;
END */;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;

Lorsque vous avez utilisé --skip-opt, c'est ce qui l'a causé car --opt inclut --create-options et DROP PROCEDURE est considéré comme spécifique à MySQL.

  -a, --create-options 
                      Include all MySQL specific create options.
                      (Defaults to on; use --skip-create-options to disable.)
  --skip-opt          Disable --opt. Disables --add-drop-table, --add-locks,
                      --create-options, --quick, --extended-insert,
                      --lock-tables, --set-charset, and --disable-keys.

--skip-opt annulerait --create-options et supprimerait ainsi DROP PROCEDURE.

Mystère résolu !!!

Réponse à la question bonus

Ce ne sont pas des commentaires; ce sont des directives MySQL. Chaque fois que MySQL exécute une commande, il recherche ces directives dans les commentaires

Le nombre 50003 indique que cette commande s'exécutera si et seulement si la version de MySQL est 5.0.3 ou supérieure.

Voici un autre exemple d'un mysqldump:

/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `datas` (
  `ID` int(2) DEFAULT NULL,
  `CATEGORY` int(2) DEFAULT NULL,
  `ORD` int(1) DEFAULT NULL
);
/*!40101 SET character_set_client = @saved_cs_client */;

Le nombre 40101 indique que cette commande s'exécutera si et seulement si la version de MySQL est 4.1.1 ou supérieure.

Ces directives SQL sont là pour votre protection si vous chargez ces mysqldumps dans des versions antérieures. Ces directives permettent l'acceptation complète de certaines commandes. Veuillez ne pas les supprimer.

Cependant, si vous ne travaillez qu'avec MySQL 5.0+ et prévoyez de vider vos procédures stockées séparément, vous pouvez les supprimer en utilisant Perl ou awk. Personnellement, je les laisserais.

RolandoMySQLDBA
la source
Question bonus: comment se débarrasser des commentaires de style c ennuyeux? / *! 50003 etc
nakhli
2
Mais pourquoi? Ils sont utilisés pour configurer la session mysql.
Derek Downey
C'est pourquoi j'ai dit que je laisserais tout être. On pourrait tenter sa chance et supprimer ces directives en ne laissant que les commandes. Ensuite, on pourrait simplement rester coincé dans la version de MySQL que l'on utilise à l'époque. Il y a environ 5 ans, j'avais un patron qui voulait des procédures stockées dans PVCS avec les directives supprimées. C'était inutile pour moi, mais c'est ce que voulait mon patron. Les scripts fonctionnaient lors du rechargement mais n'étaient plus garantis portables sur d'autres versions de MySQL. Encore une fois, je laisserais ça.
RolandoMySQLDBA
@DTest Les commentaires concernant la directive SET sont corrects et ils sont utiles pour la portabilité. Ce qui m'agace, ce sont les commentaires autour de la création de la procédure stockée elle-même: / *! 50003 CREATE * / et / *! 50003 PROCEDURE LoadMyData() ... END * / ;;
nakhli
@Chaker Malheureusement, les procédures stockées ont vu le jour dans MySQL 5.0. Par conséquent, les directives doivent rester.
RolandoMySQLDBA
2

En fait, il semble que l'option nécessaire pour ajouter DROP PROCEDURE dans la sortie mysqldump (au moins dans mysqldump Ver 10.13 Distrib 5.6.21-70.1, pour debian-linux-gnu (x86_64)) est --add-drop-table:

mysqldump --quick --no-create-db --no-create-info --no-data --triggers --routines --no-data --all-databases --skip-opt --add-drop-trigger --create-options | grep -c 'DROP PROCEDURE'
0

mysqldump --quick --no-create-db --no-create-info --no-data --triggers --routines --no-data --all-databases --skip-opt --add-drop-trigger --create-options --add-drop-table | grep -c 'DROP PROCEDURE'
2
redguy
la source