PROCEDURA DROP SE ESISTE non incluso in mysqldump


8

Sto scaricando le mie stored procedure utilizzando solo il comando seguente:

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

ma il file di dump risultante non include una PROCEDURA DROP SE ESISTE prima di ogni dichiarazione di procedura.

Come aggiungere la query di rilascio al mio dump?

Grazie.

Risposte:


7

Ho scaricato le mie stored procedure con il seguente

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

Ecco una delle procedure con DROP PROCEDURE inclusa:

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

Quando hai usato --skip-opt, questo è ciò che l'ha causato perché --opt include --create-options e DROP PROCEDURE è considerato specifico di 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 annulla --create-options e quindi rimuove la PROCEDURA DROP.

Mistero risolto !!!

Rispondi alla domanda bonus

Quelli non sono commenti; quelle sono le direttive MySQL. Ogni volta che MySQL esegue un comando, cerca queste direttive racchiuse nei commenti

Il numero 50003 indica che questo comando verrà eseguito se e solo se la versione di MySQL è 5.0.3 o successiva.

Ecco un altro esempio da 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 */;

Il numero 40101 indica che questo comando verrà eseguito se e solo se la versione di MySQL è 4.1.1 o successiva.

Queste direttive SQL sono lì per la tua protezione se carichi questi mysqldumps in versioni precedenti. Queste direttive consentono la piena accettazione di determinati comandi. Si prega di non rimuoverli.

Tuttavia, se lavori solo con MySQL 5.0+ e prevedi di eseguire il dump delle procedure memorizzate separatamente, puoi rimuoverle utilizzando Perl o awk. Personalmente li lascerei essere.


Domanda bonus: come sbarazzarsi dei fastidiosi commenti in stile c? / *! 50003 ecc.
Nakhli,

2
Ma perché? Sono usati per configurare la sessione mysql.
Derek Downey,

Ecco perché ho detto che avrei lasciato tutto. Si potrebbe rischiare e rimuovere quelle direttive lasciando solo i comandi. Quindi, si potrebbe semplicemente rimanere bloccati in qualsiasi versione di MySQL si stia utilizzando in quel momento. Una volta ho avuto un capo circa 5 anni fa che voleva Stored Procedures in PVCS con le direttive eliminate. Inutile per me, ma è quello che voleva il mio capo. Gli script funzionavano al ricaricamento ma non era più garantito che fossero portabili su altre versioni di MySQL. Ancora una volta, vorrei solo lasciarlo.
RolandoMySQLDBA il

@DTest I commenti sulla direttiva SET sono ok e sono utili per la portabilità. Ciò che mi dà fastidio sono i commenti sulla creazione della procedura memorizzata stessa: / *! 50003 CREATE * / e / *! 50003 PROCEDURE LoadMyData() ... END * / ;;
Nakhli,

@Chaker Sfortunatamente, Stored Procedures è nato in MySQL 5.0. Pertanto, le direttive devono rimanere.
RolandoMySQLDBA,

2

In realtà, sembra che l'opzione necessaria per aggiungere DROP PROCEDURE nell'output di mysqldump (almeno in mysqldump Ver 10.13 Distrib 5.6.21-70.1, per debian-linux-gnu (x86_64)) è --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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.