PROSEDUR DROP JIKA ADA yang tidak termasuk dalam mysqldump

8

Saya membuang prosedur tersimpan saya hanya menggunakan perintah berikut:

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

tetapi file dump yang dihasilkan tidak termasuk PROSEDUR DROP JIKA ADA sebelum setiap prosedur deklarasi.

Bagaimana cara menambahkan query drop ke dump saya?

Terima kasih.

nakhli
sumber

Jawaban:

7

Saya membuang prosedur tersimpan saya dengan yang berikut ini

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

Berikut adalah salah satu prosedur dengan PROSEDUR DROP termasuk:

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

Ketika Anda menggunakan --skip-opt, itulah yang menyebabkannya karena --opt menyertakan --create-options dan DROP PROCEDURE dianggap khusus untuk 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 akan membatalkan --create-options dan karenanya menghapus PROSEDUR DROP.

Misteri terpecahkan !!!

Jawab untuk Pertanyaan Bonus

Itu bukan komentar; itu adalah arahan MySQL. Setiap kali MySQL menjalankan Perintah, ia akan mencari arahan ini yang terbungkus dalam Komentar

Angka 50003 menunjukkan bahwa perintah ini akan mengeksekusi jika dan hanya jika versi MySQL 5.0.3 atau lebih tinggi.

Berikut ini contoh lain dari 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 */;

Angka 40101 menunjukkan bahwa perintah ini akan mengeksekusi jika dan hanya jika versi MySQL 4.1.1 atau lebih tinggi.

Arahan SQL ini ada untuk perlindungan Anda jika Anda memuat mysqldumps ini ke versi sebelumnya. Arahan ini memungkinkan penerimaan penuh perintah tertentu. Tolong jangan hapus mereka.

Namun, jika Anda hanya bekerja dengan MySQL 5.0+ dan berencana untuk membuang prosedur tersimpan Anda secara terpisah, Anda dapat menghapusnya menggunakan Perl atau awk. Secara pribadi saya akan membiarkan mereka.

RolandoMySQLDBA
sumber
Pertanyaan bonus: bagaimana cara menghilangkan komentar gaya c yang mengganggu? / *! 50003 dll
nakhli
2
Tapi kenapa? Mereka digunakan untuk mengkonfigurasi sesi mysql.
Derek Downey
Itu sebabnya saya katakan saya akan membiarkan semuanya terjadi. Orang bisa mengambil risiko dan melepaskan arahan-arahan itu hanya dengan meninggalkan perintah. Kemudian, orang bisa tetap terjebak dalam versi MySQL apa pun yang digunakan pada saat itu. Saya pernah punya bos sekitar 5 tahun yang lalu yang menginginkan Prosedur Tersimpan dalam PVCS dengan arahan dilucuti. Bagi saya itu tidak perlu, tetapi itulah yang diinginkan bos saya. Skrip bekerja dengan memuat ulang tetapi tidak lagi dijamin portabel untuk versi MySQL lainnya. Sekali lagi, saya akan membiarkannya begitu saja.
RolandoMySQLDBA
@Dest. Komentar di sekitar arahan SET ok dan mereka berguna untuk portabilitas. Yang mengganggu saya adalah komentar seputar pembuatan prosedur tersimpan itu sendiri: / *! 50003 BUAT * / dan / *! 50003 PROSEDUR LoadMyData() ... AKHIR * / ;;
nakhli
@Chaker Sayangnya, Prosedur Tersimpan muncul di MySQL 5.0. Karena itu, arahan harus tetap ada.
RolandoMySQLDBA
2

Sebenarnya, tampaknya opsi yang diperlukan untuk menambahkan PROSEDUR DROP dalam output mysqldump (setidaknya di mysqldump Ver 10.13 Distrib 5.6.21-70.1, untuk debian-linux-gnu (x86_64)) adalah --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
sumber