2011-07-03 38 views
35

Tôi có quy trình được lưu trữ này. Làm thế nào tôi có thể chạy điều này ví dụ với khoảng thời gian 5 giây? Giống như một thói quen để loại bỏ dữ liệu với một dấu thời gian cũ hơn một ngày?Cách lập lịch thủ tục lưu sẵn trong MySQL

DROP PROCEDURE IF EXISTS `delete_rows_links` 
GO 

CREATE PROCEDURE delete_rows_links 
BEGIN 

    DELETE activation_link 
    FROM activation_link_password_reset 
    WHERE TIMESTAMPDIFF(DAY, `time`, NOW()) < 1 ; 

END 

GO 
+2

Bạn có thực sự cần phải chạy nó ** mỗi 5 giây **? – zerkms

+7

nop, với khoảng thời gian 6 giờ là tốt. Nhưng để kiểm tra là dễ dàng hơn với giây :) – user455318

+1

Chạy bất cứ điều gì tự động mỗi 5 giây có lẽ là một ý tưởng thực sự xấu. Hãy thử chạy nó một lần một ngày, hoặc một lần một giờ, vì vậy bạn không hoàn toàn giết hiệu suất của bạn. – Flimzy

Trả lời

54

Bạn có thể sử dụng trình lập lịch biểu mysql để chạy mỗi 5 giây. Bạn có thể tìm mẫu tại http://dev.mysql.com/doc/refman/5.1/en/create-event.html

Không bao giờ sử dụng nó nhưng tôi hy vọng điều này sẽ làm việc:

CREATE EVENT myevent 
    ON SCHEDULE EVERY 5 SECOND 
    DO 
     CALL delete_rows_links(); 
+0

tôi chỉ thay thế delete_rows_links bằng cách này, nhưng dường như không hoạt động. XÓA TỪ 'database_charts'.'activation_link_password_reset' WHERE TIMESTAMPDIFF (DAY,' time', NOW()) <1; – user455318

+1

@ user455318: "không hoạt động" --- không phải là giải thích.Bạn sử dụng phiên bản mysql nào? Bạn đã gặp lỗi gì? – zerkms

+0

tôi không thể bật SET GLOBAL event_scheduler = ON; cho tôi lỗi kết nối – user773961

3

Nếu bạn mở cửa cho out-of-the-DB giải pháp: Bạn có thể thiết lập một công việc định kỳ mà chạy một tập lệnh mà chính nó sẽ gọi thủ tục.

+1

Cron không thể chạy lệnh mỗi 5 giây. Ông là tốt với khoảng thời gian 6 giờ mặc dù. – zerkms

+0

Vâng tôi đã trả lời với ý kiến ​​của OP trong đầu, tôi nên xác định nó! – Vache

+0

Thật không may, trước khi MySQL 5.1 này có vẻ là lựa chọn duy nhất, khi các sự kiện được giới thiệu với phiên bản đó. – Gruber

10

tôi đã sử dụng truy vấn này và nó làm việc cho tôi:

CREATE EVENT `exec` 
    ON SCHEDULE EVERY 5 SECOND 
    STARTS '2013-02-10 00:00:00' 
    ENDS '2015-02-28 00:00:00' 
    ON COMPLETION NOT PRESERVE ENABLE 
DO 
    call delete_rows_links(); 
6

Để tạo một cronjob, hãy làm theo các bước sau:

  1. chạy lệnh này: SET event_scheduler GLOBAL = ON;

  2. Nếu ERROR 1229 (HY000): Biến 'event_scheduler' là một biến GLOBAL và cần được thiết lập với SET GLOBAL: mportant

Có thể thiết lập các tổ chức sự kiện Scheduler để TÀN TẬT chỉ khởi động máy chủ. Nếu event_scheduler ON hoặc OFF, bạn không thể đặt nó thành DISABLED khi chạy. Ngoài ra, nếu Event Scheduler được đặt thành DISABLED khi khởi động, bạn không thể thay đổi giá trị của event_scheduler khi chạy.

Để vô hiệu hóa chức năng lịch sự kiện, sử dụng một trong hai phương pháp sau đây:

  1. Là một tùy chọn dòng lệnh khi khởi động máy chủ:

    --event-scheduler=DISABLED 
    
  2. Trong tập tin cấu hình máy chủ (my.cnf hoặc my.ini trên hệ thống Windows): bao gồm dòng nơi máy chủ sẽ đọc (ví dụ: trong phần [mysqld]):

    event_scheduler=DISABLED 
    

    Đọc MySQL documentation để biết thêm thông tin.

    DROP EVENT IF EXISTS EVENT_NAME; 
        CREATE EVENT EVENT_NAME 
    ON SCHEDULE EVERY 10 SECOND/minute/hour 
    DO 
    CALL PROCEDURE_NAME(); 
    
Các vấn đề liên quan