PDA

View Full Version : آموزش: معرفی زمانبند کار Event Scheduler در MYSQL



mbf5923
پنج شنبه 09 آذر 1391, 17:16 عصر
با سلام
چند وقت پيش يه کاري ديدم با mysql انجام شده بود که به نظرم هم جالب اومد و هم کاربردي که گفتم اينجا بذارم دوستاني که نميدونن استفاده کنن.
event_scheduler يا زمانبندي رويداد در MYSQL
با استفاده از اين خاصيت در MYSQL شما ميتونيد يک کار خاص رو به MYSQL بسپاريد تا در مقاطع زماني مشخص شده به صورت اتوماتيک انجام بده.
مثلا فرض کنيد ما ميخواهيم هر روز اطلاعاتي رو که بيش از 10 روز پيش ايجاد شده اند رو پاک کنيم و نميخوايم اين کار رو به PHP يا ASP و... بسپاريم.با استفاده از زمانبند رويداد ما ميتونيم به MYSQL بگيم خودش اين عمل رو هر روز انجام بده.
مثال زير فکر ميکنم گوياي مسئله باشه:

ابتداي کار لازمه که ما زمانبند رو در MYSQL فعال کنيم براي اين کار در PHPMYADMIN در قسمت SQL کد زير را وارد کنيد تا زمانبند فعال بشه:

SET GLOBAL event_scheduler = ON;
يا
SET GLOBAL event_scheduler = 1;
که در صورت درست انجام شدن با پيغام
Your SQL query has been executed successfully
روبرو خواهيد شد
خوب بعد از اين کار نوبت به ساخت جدول مثال ما ميرسه
براي اين مثال ما جدولي به نام cart رو با مشخصات زير ايجاد ميکنيم

CREATE TABLE cart
(
cart_id INT AUTO_INCREMENT,
user_id INT,
product_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (cart_id)
) ;

بعد از ايجاد جدول فوق وارد اون ميشيم و در قسمت کد SQL کد زير رو وارد ميکنيم
CREATE EVENT newEvent
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM cart WHERE created_at <= DATE_SUB(NOW(), INTERVAL 10 DAY) ;
و اما توضيح کد بالا
خط اول که دستور ايجاد يک رويداد جديد به نام newEvent رو صادر ميکنه ما به جاي newEvent ميتونيم نام دلخواه خودمون رو بذاريم
خط دوم مشخص ميکنه که اين رويداد بايد هر روز کاري که گفته ميشه رو انجام بده که میتونید به جای EVERY 1 DAY از هر مقدار دیگه استفاده کنید مثلا EVERY 1 SECOND که هر ثانیه عملیات گفته شده رو انجام بده
در خط سوم کلمه کلیدی DO اومده که معرف عملیاتی هست که باید انجام بشه و در خط چهارم دستوری که باید انجام بشه رو ذکر میکنیم که در اینجا رکوردهایی که بیش از 10 روز از ایجادشون میگذره رو حذف میکنیم.
اما یه سری نکات لازم هست که دوستان بدونن.
اگه ما یک زمانبند رو میخوایم از مثلا فردا شروع به کار کنه و یک سال هم کار کنه لازم هست از دستور زیر استفاده کنیم
این دستورات قبل از کلمه کلیدی Do نوشته میشن:

STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 1 YEAR
این دستور در خط اول زمان شرع شدن زمانبند رو مشخص میکنه که از 24 ساعت دیگه شروع بشه و در خط دوم مشخص میکنه که یک سال دیگه( از امروز نه از شروع) پایان پیدا کنه
البته ما میتونیم به استارت و پایان تاریخ هم بدیم مثل مثال زیر

STARTS '2012-10-30 13:00:00'
البته هنوز تاریخ فارسی ساپورت نمیکنه :قهقهه:

برای نمایش تمامی زمانبند های استفاده شده در یک دیتابیس میتونیم از دستور

SHOW EVENTS;
استفاده کنیم که تمام زمانبندهای دیتابیس مورد نظر رو نمایش میده
برای ویرایش یک زمانبند میتونیم از کد زیر استفاده کنیم:

Alter newEvent
ON SCHEDULE EVERY 1 Month
DO
DELETE FROM cart WHERE created_at <= DATE_SUB(NOW(), INTERVAL 10 DAY) ;

همونطور که میدونید کلمه کلیدی Alter مشخص کننده این هست که زمانبند وجود داره و میخواهیم جایگزینی انجام بشه مثل Alter Table
lمثلا دستور زیر نام زمانبندی که وجود داره رو تغییر میده:

ALTER EVENT newEvent
RENAME TO myEvent;
خوب و اما از بین بردن زمانبند که خیلی مهم هستش چرا که خیلی از دوستان برای تستش یه زمانبند 1 ثانیه ای درست میکنن که هر ثانیه عمل اینسرت انجام بده و اگه زود به دادش نرسن.....
دستور زیر زمانبند موجود رو از بین میبره

DROP EVENT newEvent;

که به جای newEvent نام زمانبندی که میخوایم از بین بره رو وارد میکنیم

امیدوارم مورد استفاده دوستان قرار بگیره.
با آرزوی موفقیت برای همه دوستان
سوالی بود بلد باشم در خدمتم