ПРОЦЕДУРА УДАЛЕНИЯ, ЕСЛИ СУЩЕСТВУЕТ В MySQL

8

Я сбрасываю свои хранимые процедуры только с помощью следующей команды:

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

но результирующий файл дампа не содержит ПРОЦЕДУРУ КАДРА, ЕСЛИ ЕСТЬ, перед каждым объявлением процедуры.

Как добавить запрос на удаление в мой дамп?

Спасибо.

nakhli
источник

Ответы:

7

Я сбросил свои хранимые процедуры с помощью следующего

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

Вот одна из процедур с включенной процедурой DROP:

--
-- 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 или выше.

Эти директивы SQL существуют для вашей защиты, если вы загружаете эти mysqldumps в более ранние версии. Эти директивы допускают полное принятие определенных команд. Пожалуйста, не удаляйте их.

Однако, если вы работаете только с MySQL 5.0+ и планируете выгружать хранимые процедуры отдельно, вы можете удалить их с помощью Perl или awk. Лично я бы их оставил.

RolandoMySQLDBA
источник
Бонусный вопрос: как избавиться от надоедливых комментариев в стиле c? / *! 50003 и т. Д.
нахли
2
Но почему? Они используются для настройки сеанса mysql.
Дерек Дауни
Вот почему я сказал, что оставлю все как есть. Можно было бы рискнуть и лишить эти директивы, оставив только команды. Тогда можно просто застрять в любой версии MySQL, которую вы используете в то время. Около 5 лет назад у меня был начальник, который хотел, чтобы хранимые процедуры в PVCS были лишены директив. Это было ненужно для меня, но это то, что хотел мой босс. Сценарии работали при перезагрузке, но больше не гарантировали их переносимость на другие версии MySQL. Опять же, я бы просто оставил это.
RolandoMySQLDBA
@DTest Комментарии к директиве SET в порядке, и они полезны для переносимости. Меня раздражают комментарии о создании самой хранимой процедуры: / *! 50003 CREATE * / и / *! 50003 PROCEDURE LoadMyData() ... END * / ;;
Нахли
@Chaker К сожалению, хранимые процедуры появились в MySQL 5.0. Поэтому директивы должны остаться.
RolandoMySQLDBA
2

На самом деле, кажется, что необходимая опция для добавления DROP PROCEDURE в вывод mysqldump (по крайней мере, в 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
redguy
источник