DROP-VERFAHREN, WENN EXISTS nicht in mysqldump enthalten sind

8

Ich speichere meine gespeicherten Prozeduren nur mit dem folgenden Befehl:

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

Die resultierende Dump-Datei enthält jedoch kein DROP-VERFAHREN, falls es vor jeder Prozedurdeklaration existiert.

Wie füge ich die Drop-Abfrage meinem Dump hinzu?

Vielen Dank.

Nakhli
quelle

Antworten:

7

Ich habe meine gespeicherten Prozeduren wie folgt ausgegeben

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

Hier ist eines der Verfahren mit dem DROP-VERFAHREN:

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

Wenn Sie --skip-opt verwendet haben, hat dies dazu geführt, dass --opt --create-options enthält und DROP PROCEDURE als MySQL-spezifisch gilt.

  -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 würde --create-options rückgängig machen und damit DROP PROCEDURE entfernen.

Geheimnis gelüftet !!!

Antwort auf die Bonusfrage

Das sind keine Kommentare; Das sind MySQL-Anweisungen. Immer wenn MySQL einen Befehl ausführt, sucht es nach diesen Anweisungen, die in Kommentaren eingeschlossen sind

Die Nummer 50003 gibt an, dass dieser Befehl genau dann ausgeführt wird, wenn die Version von MySQL 5.0.3 oder höher ist.

Hier ist ein weiteres Beispiel aus einem 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 */;

Die Nummer 40101 gibt an, dass dieser Befehl genau dann ausgeführt wird, wenn die Version von MySQL 4.1.1 oder höher ist.

Diese SQL-Anweisungen dienen Ihrem Schutz, wenn Sie diese mysqldumps in frühere Versionen laden. Diese Anweisungen ermöglichen die vollständige Annahme bestimmter Befehle. Bitte entfernen Sie sie nicht.

Wenn Sie jedoch nur mit MySQL 5.0+ arbeiten und planen, Ihre gespeicherten Prozeduren separat zu sichern, können Sie sie mit Perl oder awk entfernen. Persönlich würde ich sie verlassen.

RolandoMySQLDBA
quelle
Bonusfrage: Wie kann man die nervigen Kommentare im C-Stil loswerden? / *! 50003 etc
Nakhli
2
Aber warum? Sie werden verwendet, um die MySQL-Sitzung zu konfigurieren.
Derek Downey
Deshalb habe ich gesagt, ich würde alles so lassen. Man könnte ein Risiko eingehen und diese Anweisungen entfernen, wobei nur die Befehle übrig bleiben. Dann könnte man einfach in der Version von MySQL stecken bleiben, die man gerade verwendet. Ich hatte vor ungefähr 5 Jahren einmal einen Chef, der gespeicherte Prozeduren in PVCS wollte, wobei die Richtlinien entfernt wurden. Es war für mich unnötig, aber genau das wollte mein Chef. Die Skripte arbeiteten beim Neuladen, es war jedoch nicht mehr garantiert, dass sie auf andere Versionen von MySQL portierbar waren. Wieder würde ich es einfach so lassen.
RolandoMySQLDBA
@DTest Die Kommentare rund um die SET-Direktive sind in Ordnung und für die Portabilität nützlich. Was mich nervt, sind die Kommentare zur Erstellung der gespeicherten Prozedur selbst: / *! 50003 CREATE * / und / *! 50003 PROCEDURE LoadMyData() ... END * / ;;
Nakhli
@Chaker Leider wurden in MySQL 5.0 gespeicherte Prozeduren eingerichtet. Daher müssen die Richtlinien bestehen bleiben.
RolandoMySQLDBA
2

Tatsächlich scheint die notwendige Option zum Hinzufügen von DROP PROCEDURE in der mysqldump-Ausgabe (zumindest in mysqldump Ver 10.13 Distrib 5.6.21-70.1 für debian-linux-gnu (x86_64)) folgende zu sein --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
quelle