2013-05-27 29 views
33

Tôi đã thêm sự kiện thử nghiệm đơn giản sau đây trên cơ sở dữ liệu mysql của tôi qua phpmyadmin:Mysql Event Không Working

CREATE DEFINER=`root`@`localhost` EVENT `my_event` 
ON SCHEDULE EVERY 1 MINUTE STARTS '2013-05-27 00:00:00' 
ON COMPLETION NOT PRESERVE ENABLE DO 
BEGIN 
    UPDATE `test` SET `name`="z"; 
END 

môi trường của tôi là mac + MAMP Pro. Tôi hy vọng sẽ thay đổi tất cả các hàng trên bảng 'thử nghiệm' của tôi với tên 'z' trong vòng một phút. Nhưng không xảy ra như vậy.

Tôi có cần thêm điều gì đó để các sự kiện của tôi bắt đầu hoạt động không?

Sản lượng "HIỂN THỊ processlist": enter image description here

Cảm ơn.

+0

bạn có thể cung cấp các kết quả của HIỂN THỊ processlist truy vấn ';'? Có lẽ trình lên lịch không được bắt đầu. – Jacopofar

+0

chỉ cần thêm đầu ra vào mô tả câu hỏi của tôi. Tôi đã không làm bất cứ điều gì để bắt đầu lên lịch. Làm thế nào để bắt đầu nó xin vui lòng? – Rana

Trả lời

80

Sự kiện do trình lập lịch biểu chạy, không được khởi động theo mặc định. Sử dụng SHOW PROCESSLIST có thể kiểm tra xem nó có được bắt đầu hay không. Nếu không, hãy chạy lệnh

SET GLOBAL event_scheduler = ON; 

để chạy.

+0

Cảm ơn. Nó đang làm việc bây giờ. – Rana

+1

Tốt! Bạn không phải khởi động lại máy chủ MySQL, phải không? – Jacopofar

+2

vâng, phải, tôi không phải làm vậy. – Rana

-1

Hãy thử

SET GLOBAL event_scheduler = ON; 
DELIMITER $$ 
CREATE DEFINER=`root`@`db01` EVENT `PRICEALERT_STATUS` 
ON SCHEDULE EVERY 1 DAY STARTS TIMESTAMP(CURRENT_DATE) 
DO BEGIN 
// Your Query 
END $$ 
DELIMITER ; 
+0

sẽ không hoạt động vì sự kiện phải chạy đầu tiên cho event_scheduler đó được bật. – earl3s

4

Đối với những người tự hỏi làm thế nào để kích hoạt nó bằng cách mặc định lúc khởi động, thêm dòng sau vào tập tin của bạn cấu hình (my.ini, my.cnf):

#Event scheduler can be set to 1 (On), 0 (Off), or Disabled 
event_scheduler=1 

Restart của dịch vụ là bắt buộc trong trường hợp này, vì vậy nếu bạn muốn gián đoạn tối thiểu, hãy thêm tệp này vào tệp cấu hình và sau đó chạy SQL:

SET GLOBAL event_scheduler = ON; 

Bằng cách đó, nó sẽ chạy cho tiến trình hiện tại, và nếu máy chủ được khởi động lại nó sẽ vẫn hoạt động.

Lưu ý rằng điều này không hoạt động nếu event_scheduler được đặt thành vô hiệu hóa. Trong trường hợp đó, tùy chọn duy nhất là khởi động lại dịch vụ.

0

Tôi chỉ muốn thêm vào chủ đề này. Tôi đã đổ cơ sở dữ liệu của mình sang một máy chủ khác và kết quả là người hủy bỏ sự kiện của tôi không có khoản trợ cấp như vậy được xác định cho người dùng. Tôi đã cập nhật trình xác minh của mình với

ALTER DEFINER='root'@'localhost' EVENT event.name COMMENT ''; 

Đảm bảo rằng trình xử lý của bạn có quyền RIÊNG TƯ chính xác.

3

kiểm tra nếu event_scheduler đang On - thực hiện lệnh sau:

SHOW PROCESSLIST; 

nó sẽ ra một bảng/mục, bạn phải tìm kiếm một mục với tàievent_scheduler, và lệnhDaemon:

Id   User   Host  db Command Time State   Info 
22870 event_scheduler localhost \N Daemon 23 Waiting for next activation \N 

OR, bạn cũng có thể xác minh bằng lệnh sau:

SELECT @@global.event_scheduler; 

Kết quả phải là ON, nếu không được đặt (sẽ nhận được 0 cho lệnh), như đã nêu trong phần tiếp theo.


Nếu bạn không có bất kỳ mục như vậy (như trên), bạn có thể bắt đầu lên lịch sự kiện bằng cách sử dụng lệnh sau:

SET GLOBAL event_scheduler = ON; 

Khi đã xong, bạn có thể kiểm tra xem nó đã được thực hiện sử dụng đúng lệnh SHOW PROCESSLIST, như đã đề cập ở trên.

0

Hãy nhớ thêm trong 'Commit', sau khi 'DO BEGIN' hoặc 'DO'. Làm việc cho tôi sau đó.

0

tôi chỉ ra rằng trên MariaDB, sau khi thêm một sự kiện (trong trường hợp của tôi, nó là người đầu tiên), bạn phải khởi động lại sự kiện lịch

SET GLOBAL event_scheduler = OFF; 

và sau đó

SET GLOBAL event_scheduler = ON; 

để làm cho nó thực sự mang bộ lập lịch vào "chờ kích hoạt" -state.

0

Nếu bạn muốn event_scheduler của bạn để khởi động tự động mỗi khi khởi động lại máy chủ mysql, bất cứ nơi nào bên dưới phần [mysqld] của tập tin my.ini hoặc my.cnf mà bạn tìm thấy trong /etc/mysql bạn nên đặt

[mysqld] 

# turning on event_scheduler 
event_scheduler=ON 

khởi động lại mysql để kiểm tra xem nó đang chạy (trong terminal dòng lệnh!)

sudo service mysql restart 

sau đó kiểm tra processlist bạn

012.
SHOW PROCESSLIST 

bạn có thể kiểm tra xem sự kiện của bạn đang chạy bằng cách kiểm tra lần cuối cùng họ chạy

SELECT * FROM INFORMATION_SCHEMA.events