Mysql

如果存在未包含在 mysqldump 中,則刪除過程

  • August 16, 2019

使用以下命令轉儲我的儲存過程:

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

但生成的轉儲文件在每個過程聲明之前不包含 DROP PROCEDURE IF EXISTS。

如何將刪除查詢添加到我的轉儲中?

謝謝你。

我用以下內容轉儲了我的儲存過程

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 執行命令時,它都會查找包含在註釋中的這些指令

數字 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 或更高版本時才會執行此命令。

如果您將這些 mysqldump 載入到早期版本中,這些 SQL 指令可以為您提供保護。這些指令允許完全接受某些命令。請不要刪除它們。

但是,如果您只使用 MySQL 5.0+ 併計劃單獨轉儲儲存過程,則可以使用 Perl 或 awk 剝離它們。我個人會離開他們。

引用自:https://dba.stackexchange.com/questions/4090