如果mysqldump中不存在,则执行DROP PROCEDURE


8

使用以下命令来转储存储过程:

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

但是生成的转储文件在每个过程声明之前都不包含DROP PROCEDURE IF EXISTS。

如何将放置查询添加到我的转储?

谢谢。

Answers:


7

我用以下命令转储了存储过程

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

这是包含DROP PROCEDURE的过程之一:

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

当您使用--skip-opt时,这是造成该问题的原因,因为--opt包含--create-options并且DROP PROCEDURE被认为是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将撤消--create-options,从而删除DROP PROCEDURE。

谜团已揭开 !!!

奖励问题的答案

这些不是评论;这些是MySQL指令。每当MySQL运行Command时,它都会查找注释中包含的这些指令

数字50003表示仅当MySQL版本为5.0.3或更高版本时,此命令才会执行。

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

数字40101表示仅当MySQL版本为4.1.1或更高版本时,此命令才会执行。

如果将这些mysqldumps加载到早期版本中,则这些SQL指令可为您提供保护。这些指令允许完全接受某些命令。请不要删除它们。

但是,如果仅使用MySQL 5.0+并计划单独转储存储过程,则可以使用Perl或awk剥离它们。就我个人而言,我会离开他们。


额外的问题:如何摆脱烦人的c风格注释?/ *!50003等
nakhli 2011年

2
但为什么?它们用于配置mysql会话。
德里克·唐尼

这就是为什么我说我会保留一切。一个人可能会抓住机会,剥离那些指令,只留下命令。然后,人们可能会停留在当时正在使用的任何版本的MySQL中。大约5年前,我曾经有个老板,他想要在PVCS中删除指令的存储过程。对我来说这是不必要的,但这就是我老板想要的。这些脚本可以重新加载,但不再保证可移植到其他版本的MySQL。再说一次,我就是这样。
RolandoMySQLDBA 2011年

@DTest SET指令周围的注释是可以的,它们对于可移植性很有用。令我烦恼的是有关存储过程本身创建的注释:/ *!50003 CREATE * /和/ *!50003 PROCEDURE LoadMyData()... END * / ;;
nakhli 2011年

@Chaker不幸的是,存储过程出现在MySQL 5.0中。因此,必须保留这些指令。
RolandoMySQLDBA 2011年

2

实际上,似乎在mysqldump输出中添加DROP PROCEDURE的必要选项(至少在mysqldump Ver 10.13 Distrib 5.6.21-70.1中,对于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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.