如果存在不包含在 mysqldump 中,则删除程序

nak*_*hli 8 mysql mysqldump backup stored-procedures dump

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

mysqldump --routines --no-create-info --no-data --no-create-db --skip-opt databasename -u username -p > outputfile.sql
Run Code Online (Sandbox Code Playgroud)

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

如何将 drop 查询添加到我的转储中?

谢谢你。

Rol*_*DBA 7

我用以下内容转储了我的存储过程

C:\>mysqldump -u... -p... -n -d --routines --triggers --all-databases > Z:\stuff.sql
Run Code Online (Sandbox Code Playgroud)

以下是包含 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 */ ;
Run Code Online (Sandbox Code Playgroud)

当您使用--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.
Run Code Online (Sandbox Code Playgroud)

--skip-opt 将撤消 --create-options 并因此删除 DROP PROCEDURE。

谜团已揭开 !!!

奖金问题的答案

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

数字 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 */;
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 但为什么?它们用于配置 mysql 会话。 (2认同)