Mysql memiliki fungsionalitas EVENT untuk menghindari interaksi cron yang rumit ketika banyak dari apa yang Anda jadwalkan terkait dengan sql, dan lebih sedikit terkait file. Lihat halaman Manual di sini . Semoga yang di bawah ini dapat dibaca sebagai ikhtisar singkat tentang langkah-langkah penting dan hal-hal yang perlu dipertimbangkan, dan juga pengujian yang dapat diverifikasi.
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
ooops, penjadwal acara tidak dihidupkan. Tidak ada yang akan memicu.
SET GLOBAL event_scheduler = ON; -- turn her on and confirm below
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
Skema untuk pengujian
create table theMessages
( id int auto_increment primary key,
userId int not null,
message varchar(255) not null,
updateDt datetime not null,
key(updateDt)
-- FK's not shown
);
-- it is currently 2015-09-10 13:12:00
-- truncate table theMessages;
insert theMessages(userId,message,updateDt) values (1,'I need to go now, no followup questions','2015-08-24 11:10:09');
insert theMessages(userId,message,updateDt) values (7,'You always say that ... just hiding','2015-08-29');
insert theMessages(userId,message,updateDt) values (1,'7 day test1','2015-09-03 12:00:00');
insert theMessages(userId,message,updateDt) values (1,'7 day test2','2015-09-03 14:00:00');
Buat 2 acara, sesi pertama setiap hari, sesi kedua setiap 10 menit
Abaikan apa yang sebenarnya mereka lakukan (bermain melawan satu sama lain). Intinya ada di time difference
pendekatan dan penjadwalan .
DELIMITER $$
CREATE EVENT `delete7DayOldMessages`
ON SCHEDULE EVERY 1 DAY STARTS '2015-09-01 00:00:00'
ON COMPLETION PRESERVE
DO BEGIN
delete from theMessages
where datediff(now(),updateDt)>6; -- not terribly exact, yesterday but <24hrs is still 1 day
-- etc etc all your stuff in here
END;$$
DELIMITER ;
...
DELIMITER $$
CREATE EVENT `Every_10_Minutes_Cleanup`
ON SCHEDULE EVERY 10 MINUTE STARTS '2015-09-01 00:00:00'
ON COMPLETION PRESERVE
DO BEGIN
delete from theMessages
where TIMESTAMPDIFF(HOUR, updateDt, now())>168; -- messages over 1 week old (168 hours)
-- etc etc all your stuff in here
END;$$
DELIMITER ;
Tampilkan status acara (pendekatan berbeda)
show events from so_gibberish; -- list all events by schema name (db name)
show events; -- <--------- from workbench / sqlyog
show events\G;` -- <--------- I like this one from mysql> prompt
*************************** 1. row ***************************
Db: so_gibberish
Name: delete7DayOldMessages
Definer: [email protected]
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: DAY
Starts: 2015-09-01 00:00:00
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
*************************** 2. row ***************************
Db: so_gibberish
Name: Every_10_Minutes_Cleanup
Definer: [email protected]
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 10
Interval field: MINUTE
Starts: 2015-09-01 00:00:00
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
2 rows in set (0.06 sec)
Hal-hal acak untuk dipertimbangkan
drop event someEventName;
-- <----- hal yang baik untuk diketahui tentang
tidak bisa alias dateiff dan menggunakan klausa di mana dalam 1 baris, jadi
select id,DATEDIFF(now(),updateDt) from theMessages where datediff(now(),updateDt)>6;
dapatkan lebih tepat, 168 jam untuk usia 1 minggu
select id,TIMESTAMPDIFF(HOUR, updateDt, now()) as `difference` FROM theMessages;
+----+------------+
| id | difference |
+----+------------+
| 1 | 410 |
| 2 | 301 |
| 3 | 169 |
| 4 | 167 |
+----+------------+
Tautan ke Halaman Manual menunjukkan sedikit fleksibilitas dengan pilihan interval, ditunjukkan di bawah ini:
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
Konkurensi
Sematkan tindakan konkurensi apa pun yang diperlukan agar beberapa peristiwa (atau beberapa pengaktifan peristiwa yang sama) tidak menyebabkan data mengamuk.
Setel dan Lupakan
Ingat, untuk saat ini, karena Anda akan melupakannya, peristiwa-peristiwa ini terus berlanjut. Jadi buatlah kode solid yang akan terus berjalan, bahkan saat Anda lupa. Yang kemungkinan besar akan Anda lakukan.
Persyaratan khusus Anda
Anda perlu menentukan baris mana yang perlu dihapus terlebih dahulu oleh tabel, sehingga memenuhi batasan Kunci Utama. Cukup gabungkan semuanya dalam urutan yang benar di dalam area yang jelas melalui pernyataan CREATE EVENT, yang bisa sangat besar.