THỦ TỤC DROP NẾU EXISTS không được bao gồm trong mysqldump


8

Tôi đang hủy bỏ các thủ tục được lưu trữ của mình chỉ bằng cách sử dụng lệnh sau:

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

nhưng tệp kết quả kết quả không bao gồm THỦ TỤC DROP NẾU EXISTS trước mỗi khai báo thủ tục.

Làm thế nào để thêm truy vấn thả vào bãi chứa của tôi?

Cảm ơn bạn.

Câu trả lời:


7

Tôi đã bỏ các thủ tục lưu trữ của tôi với những điều sau đây

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

Đây là một trong những quy trình với THỦ TỤC DROP bao gồm:

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

Khi bạn đã sử dụng --skip-opt, đó là nguyên nhân gây ra bởi vì --opt bao gồm - tùy chọn điều trị và THỦ TỤC DROP được coi là dành riêng cho 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 sẽ hoàn tác - tạo các tùy chọn và do đó loại bỏ THỦ TỤC DROP.

Giải đáp bí ẩn !!!

Trả lời câu hỏi tiền thưởng

Đó không phải là ý kiến; Đó là những chỉ thị của MySQL. Bất cứ khi nào MySQL chạy một Lệnh, nó sẽ tìm các lệnh này được đặt trong Nhận xét

Số 50003 chỉ ra rằng lệnh này sẽ thực thi khi và chỉ khi phiên bản của MySQL là 5.0.3 trở lên.

Đây là một ví dụ khác từ một 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 */;

Số 40101 chỉ ra rằng lệnh này sẽ thực thi khi và chỉ khi phiên bản của MySQL là 4.1.1 trở lên.

Các chỉ thị SQL này có sẵn để bảo vệ bạn nếu bạn tải các mysqldumps này vào các phiên bản trước. Những chỉ thị này cho phép chấp nhận hoàn toàn các lệnh nhất định. Xin đừng loại bỏ chúng.

Tuy nhiên, nếu bạn chỉ làm việc với MySQL 5.0+ và có kế hoạch loại bỏ các thủ tục được lưu trữ riêng biệt, bạn có thể loại bỏ chúng bằng cách sử dụng Perl hoặc awk. Cá nhân tôi sẽ để họ được.


Câu hỏi thưởng: làm thế nào để thoát khỏi những bình luận kiểu c khó chịu? / *! 50003, v.v.
nakhli

2
Nhưng tại sao? Chúng được sử dụng để cấu hình phiên mysql.
Derek Downey

Đó là lý do tại sao tôi nói tôi sẽ bỏ mọi thứ. Người ta có thể nắm lấy cơ hội và loại bỏ những chỉ thị đó chỉ để lại các lệnh. Sau đó, người ta có thể bị mắc kẹt trong bất kỳ phiên bản nào của MySQL mà người ta đang sử dụng tại thời điểm đó. Tôi đã từng có một ông chủ khoảng 5 năm trước muốn Thủ tục lưu trữ trong PVCS với các chỉ thị bị tước bỏ. Nó là không cần thiết với tôi, nhưng đó là những gì ông chủ của tôi muốn. Các tập lệnh đã làm việc trên tải lại nhưng không còn được đảm bảo để có thể di chuyển sang các phiên bản khác của MySQL. Một lần nữa, tôi sẽ chỉ để nó được.
RolandoMySQLDBA

@DTest Các ý kiến ​​xung quanh chỉ thị SET là ok và chúng hữu ích cho tính di động. Điều làm tôi khó chịu là những bình luận xung quanh việc tạo ra thủ tục được lưu trữ: / *! 50003 TẠO * / và / *! 50003 THỦ TỤC LoadMyData() ... END * / ;;
nakhli

@Chaker Thật không may, Thủ tục lưu trữ đã xuất hiện trong MySQL 5.0. Do đó, các chỉ thị phải được duy trì.
RolandoMySQLDBA

2

Trên thực tế, có vẻ như tùy chọn cần thiết để thêm THỦ TỤC DROP trong đầu ra mysqldump (ít nhất là trong mysqldump Ver 10.13 Distrib 5.6.21-70.1, cho debian-linux-gnu (x86_64)) là --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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.