存在する場合、DROPプロシージャがmysqldumpに含まれていない


8

次のコマンドを使用してのみ、ストアドプロシージャをダンプしています。

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

ただし、結果のダンプファイルには、各プロシージャ宣言の前にDROP PROCEDURE IF EXISTSは含まれていません。

ダンプクエリをダンプに追加するにはどうすればよいですか?

ありがとうございました。

回答:


7

ストアドプロシージャを次のようにダンプしました

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

DROP PROCEDUREを含む手順の1つを次に示します。

--
-- 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を使用してそれらを削除できます。個人的に私はそれらを残しておきます。


おまけの質問:迷惑なCスタイルのコメントを取り除く方法は?/ *!50003など
nakhli '25

2
しかし、なぜ?これらは、mysqlセッションの構成に使用されます。
デレク・ダウニー、

だから、私はすべてをそのままにしておくと言いました。チャンスをとって、コマンドだけを残してそれらのディレクティブを取り除くことができます。そうすれば、そのときに使用しているMySQLのどのバージョンにも行き詰まる可能性があります。5年ほど前に、ディレクティブを取り除いたPVCSのストアドプロシージャを求めていた上司がいました。それは私には不必要でしたが、それは私の上司が望んでいたことです。スクリプトはリロードで機能しましたが、MySQLの他のバージョンへの移植性が保証されなくなりました。繰り返しますが、そのままにしておきます。
RolandoMySQLDBA '25

@DTest SETディレクティブに関するコメントは問題なく、移植性に役立ちます。ストアドプロシージャ自体の作成に関するコメントが気になるのは、/ *!50003 CREATE * /および/ *!50003 PROCEDURE LoadMyData()... END * / ;;です。
nakhli

@Chaker残念ながら、ストアドプロシージャはMySQL 5.0で登場しました。したがって、指令はそのままにしておく必要があります。
RolandoMySQLDBA

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.