PROCEDIMENTO DE GOTA SE EXISTE não incluído no mysqldump

8

Estou descartando meus procedimentos armazenados apenas usando o seguinte comando:

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

mas o arquivo de despejo resultante não inclui um DROP PROCEDURE SE EXISTE antes de cada declaração de procedimento.

Como adicionar a consulta suspensa ao meu despejo?

Obrigado.

nakhli
fonte

Respostas:

7

Despejei meus procedimentos armazenados com os seguintes

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

Aqui está um dos procedimentos com o DROP PROCEDURE incluído:

--
-- 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 você usou --skip-opt, foi o que o causou porque --opt inclui --create-options e o DROP PROCEDURE é considerado específico do 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 desfazia --create-options e remove o DROP PROCEDURE.

Mistério resolvido !!!

Resposta à pergunta bônus

Esses não são comentários; essas são diretivas do MySQL. Sempre que o MySQL executa um comando, ele procura essas diretivas envolvidas em Comentários

O número 50003 indica que este comando será executado se e somente se a versão do MySQL for 5.0.3 ou superior.

Aqui está outro exemplo de um 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 */;

O número 40101 indica que este comando será executado se e somente se a versão do MySQL for 4.1.1 ou superior.

Essas diretivas SQL existem para sua proteção se você carregar esses mysqldumps em versões anteriores. Essas diretivas permitem a aceitação total de certos comandos. Por favor, não os remova.

No entanto, se você trabalha apenas com o MySQL 5.0+ e planeja despejar seus procedimentos armazenados separadamente, poderá removê-los usando Perl ou awk. Pessoalmente, eu os deixaria em paz.

RolandoMySQLDBA
fonte
Pergunta de bônus: como se livrar dos comentários irritantes do estilo c? / *! 50003 etc
nakhli
2
Mas por que? Eles são usados ​​para configurar a sessão mysql.
Derek Downey
Por isso eu disse que deixaria tudo como está. Pode-se arriscar e tirar essas diretivas deixando apenas os comandos. Então, alguém pode ficar preso em qualquer versão do MySQL que esteja usando no momento. Certa vez, tive um chefe há cerca de 5 anos que queria Procedimentos Armazenados no PVCS com as diretivas despojadas. Era desnecessário para mim, mas era isso que meu chefe queria. Os scripts funcionavam no recarregamento, mas não eram mais garantidos para serem portáveis ​​para outras versões do MySQL. Mais uma vez, eu deixaria como está.
RolandoMySQLDBA
@DTest Os comentários em torno da diretiva SET estão ok e são úteis para portabilidade. O que me incomoda são os comentários sobre a criação do próprio procedimento armazenado: / *! 50003 CREATE * / e / *! 50003 PROCEDURE LoadMyData() ... END * / ;;
nakhli
@ Chaker Infelizmente, o Stored Procedures surgiu no MySQL 5.0. Portanto, as diretrizes devem permanecer.
RolandoMySQLDBA
2

Na verdade, parece que a opção necessária para adicionar o DROP PROCEDURE na saída do mysqldump (pelo menos no mysqldump Ver 10.13 Distrib 5.6.21-70.1, para 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
redguy
fonte