PROCEDIMIENTO DE GOTA SI EXISTE no incluido en mysqldump

8

Estoy volcando mis procedimientos almacenados solo con el siguiente comando:

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

pero el archivo de volcado resultante no incluye un PROCEDIMIENTO DE CAÍDO SI EXISTE antes de cada declaración de procedimiento.

¿Cómo agregar la consulta de caída a mi volcado?

Gracias.

nakhli
fuente

Respuestas:

7

Dejé mis procedimientos almacenados con lo siguiente

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

Aquí hay uno de los procedimientos con el PROCEDIMIENTO DE GOTA incluido:

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

Cuando usó --skip-opt, eso es lo que lo causó porque --opt incluye --create-options y DROP PROCEDURE se considera específico de 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 deshacería --create-options y así eliminaría el PROCEDIMIENTO DE GOTA.

Misterio resuelto !!!

Respuesta a la pregunta adicional

Esos no son comentarios; Esas son las directivas de MySQL. Cada vez que MySQL ejecuta un comando, busca estas directivas incluidas en Comentarios

El número 50003 indica que este comando se ejecutará si y solo si la versión de MySQL es 5.0.3 o superior.

Aquí hay otro ejemplo de 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 */;

El número 40101 indica que este comando se ejecutará si y solo si la versión de MySQL es 4.1.1 o superior.

Estas directivas SQL están ahí para su protección si carga estos mysqldumps en versiones anteriores. Estas directivas permiten la plena aceptación de ciertos comandos. Por favor no los elimines.

Sin embargo, si solo trabaja con MySQL 5.0+ y planea volcar sus procedimientos almacenados por separado, puede eliminarlos usando Perl o awk. Personalmente los dejaría ser.

RolandoMySQLDBA
fuente
Pregunta extra: ¿cómo deshacerse de los molestos comentarios de estilo c? / *! 50003 etc
nakhli
2
¿Pero por qué? Se utilizan para configurar la sesión mysql.
Derek Downey
Es por eso que dije que dejaría todo en paz. Uno podría arriesgarse y despojar esas directivas dejando solo los comandos. Entonces, uno podría quedarse atascado en cualquier versión de MySQL que esté usando en ese momento. Una vez tuve un jefe hace unos 5 años que quería procedimientos almacenados en PVCS con las directivas eliminadas. No fue necesario para mí, pero eso era lo que mi jefe quería. Los scripts funcionaron en la recarga pero ya no se garantizaba que fueran portátiles a otras versiones de MySQL. De nuevo, simplemente lo dejaría así.
RolandoMySQLDBA
@DTest Los comentarios sobre la directiva SET están bien y son útiles para la portabilidad. Lo que me molesta son los comentarios sobre la creación del procedimiento almacenado: / *! 50003 CREATE * / y / *! 50003 PROCEDURE LoadMyData() ... END * / ;;
nakhli
@Chaker Desafortunadamente, los procedimientos almacenados se crearon en MySQL 5.0. Por lo tanto, las directivas tienen que permanecer.
RolandoMySQLDBA
2

En realidad, parece que la opción necesaria para agregar PROCEDIMIENTO DE GOTA en la salida de mysqldump (al menos en mysqldump Ver 10.13 Distrib 5.6.21-70.1, para debian-linux-gnu (x86_64)) es --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
fuente