Trong MySQL 5.1+, tồn tại khả năng tạo lịch trình sự kiện .
Dưới đây là một ví dụ về cách lên lịch xóa các hàng khỏi bảng đã hơn 2 giờ:
drop database rolando;
create database rolando;
use rolando
create table mydata (id int not null auto_increment primary key,ti_time timestamp DEFAULT current_timestamp) ENGINE=MyISAM;
DELIMITER $$
DROP PROCEDURE IF EXISTS `rolando`.`LoadMyData` $$
CREATE PROCEDURE `rolando`.`LoadMyData` ()
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 ;
show create table mydata\G
SHOW CREATE PROCEDURE LoadMyData\G
CALL rolando.LoadMyData();
CREATE TABLE ta_table LIKE mydata;
ALTER TABLE ta_table DISABLE KEYS;
INSERT INTO ta_table SELECT SQL_NO_CACHE * FROM mydata;
ALTER TABLE ta_table ENABLE KEYS;
CREATE EVENT ev
ON SCHEDULE
EVERY 1 MINUTE
STARTS (NOW() + INTERVAL 1 MINUTE)
DO
DELETE FROM ta_table WHERE ti_time > NOW() - INTERVAL 2 HOUR;
SELECT COUNT(1) FROM ta_table;
SELECT SLEEP(62);
SELECT COUNT(1) FROM ta_table;
Để kích hoạt lịch trình sự kiện, bạn phải làm hai việc:
Đầu tiên, kích hoạt bằng tay:
SET GLOBAL event_scheduler = 1;
Sau đó, thêm phần này vào my.ini để giữ lịch trình sự kiện trong trường hợp bạn khởi động lại mysql
[mysqld]
event_scheduler = 1;
Từ đây, bạn có thể thiết kế thủ tục sao lưu khách hàng của riêng bạn bằng cách sử dụng các thủ tục được lưu trữ và sau đó lên lịch cho thủ tục được lưu trữ đó. Tuy nhiên, một nhược điểm mà tôi đã nghe nói là cập nhật các bảng InnoDB trong quy trình được lưu trữ được gọi từ một sự kiện mà tôi đã từng cố gắng giúp khắc phục sự cố này .
Một cách tiếp cận ổn định hơn mà không cần sử dụng Sự kiện MySQL cũng là cách tiếp cận đơn giản hơn.
Viết một tệp bó DOS sẽ thực thi một mysqldump và lưu kết quả đầu ra vào tệp đích bạn chọn. Sau đó, chỉ cần sử dụng bộ lập lịch Windows để gọi tệp bó DOS đó.
Hãy thử một lần !!!