हां, आप यह कर सकते हैं।
ध्यान दें कि शेड्यूलर डिफ़ॉल्ट रूप से सक्रिय नहीं है (Event Scheduler Configuration देखें), इसलिए यह शून्य-जोखिम विकल्प नहीं है। उदाहरण के लिए, यदि आपकी ऑपरेशंस टीम आपके ऐप को नए सर्वर पर माइग्रेट करती है, लेकिन शेड्यूलर को सक्षम करना भूल जाती है, तो आपका ऐप हो जाएगा। विशेष विशेषाधिकारों की भी आवश्यकता है, जिसे फिर से एक नए सर्वर पर स्थापित करने की आवश्यकता हो सकती है।
मेरी सलाह: सबसे पहले, एक संग्रहित प्रक्रिया बनाएं (नीचे कोड नमूना देखें) जो आवधिक विभाजन रखरखाव को संभालती है: यदि तालिका बहुत बड़ी हो जाती है, और पर्याप्त नए विभाजन (जैसे 1 सप्ताह) जोड़ना पुराना विभाजन छोड़ना ताकि यहां तक कि यदि रखरखाव proc थोड़ी देर के लिए नहीं चल रहा है, आपका ऐप मर नहीं जाएगा।
फिर उस संग्रहित प्रो को अनावश्यक रूप से कॉल शेड्यूल करें। MySQL शेड्यूलर का उपयोग करें, क्रॉन जॉब का उपयोग करें, और अपनी पसंद के किसी अन्य तरीके का उपयोग करें। फिर यदि एक शेड्यूलर काम नहीं कर रहा है, तो दूसरा ढीला उठा सकता है। यदि आप सही ढंग से स्पोक को डिज़ाइन करते हैं, तो इसे नो-ऑप निष्पादित करने के लिए सस्ता होना चाहिए यदि उसे कुछ भी करने की आवश्यकता नहीं है। आप इसे अपने ऐप से भी कॉल करना चाहते हैं, उदा। लंबी अवधि की रिपोर्ट उत्पन्न करते समय, या अपनी दैनिक ईटीएल प्रक्रिया (यदि आपके पास कोई है) के हिस्से के रूप में पहला बयान के रूप में। मेरा मुद्दा यह है कि अनुसूचित कार्यों की एचिलिस एड़ी यह सुनिश्चित कर रही है कि शेड्यूलर वास्तव में काम कर रहा है - इसलिए यहां अनावश्यकता के बारे में सोचें।
बस सुनिश्चित करें कि सभी कॉल एक ही समय में शेड्यूल न करें ताकि वे एक-दूसरे पर कदम न उठाएं! :-)
यहां आपकी रखरखाव प्रसंस्करण की तरह दिखने के लिए एक कोड नमूना है - पहले यह पुराने विभाजन को prunes करता है, फिर नए जोड़ता है। मैंने पाठक के लिए एक निष्कर्ष के रूप में एकाधिक एक साथ निष्पादन की जांच और रोकथाम छोड़ दिया।
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`UpdatePartitions` $$
CREATE PROCEDURE `test`.`UpdatePartitions`()
BEGIN
DECLARE maxpart_date date;
DECLARE partition_count int;
DECLARE minpart date;
DECLARE droppart_sql date;
DECLARE newpart_date date;
DECLARE newpart_sql varchar(500);
SELECT COUNT(*)
INTO partition_count
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='Calls' AND TABLE_SCHEMA='test';
-- first, deal with pruning old partitions
-- TODO: set your desired # of partitions below, or make it parameterizable
WHILE (partition_count > 1000)
DO
-- optionally, do something here to deal with the parition you're dropping, e.g.
-- copy the data into an archive table
SELECT MIN(PARTITION_DESCRIPTION)
INTO minpart
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='Calls' AND TABLE_SCHEMA='test';
SET @sql := CONCAT('ALTER TABLE Calls DROP PARTITION p'
, CAST((minpart+0) as char(8))
, ';');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT COUNT(*)
INTO partition_count
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='Calls' AND TABLE_SCHEMA='test';
END WHILE;
SELECT MAX(PARTITION_DESCRIPTION)
INTO maxpart_date
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='Calls' AND TABLE_SCHEMA='test';
-- create enough partitions for at least the next week
WHILE (maxpart_date < CURDATE() + INTERVAL 7 DAY)
DO
SET newpart_date := maxpart_date + INTERVAL 1 DAY;
SET @sql := CONCAT('ALTER TABLE Calls ADD PARTITION (PARTITION p'
, CAST((newpart_date+0) as char(8))
, ' values less than('
, CAST((newpart_date+0) as char(8))
, '));');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT MAX(PARTITION_DESCRIPTION)
INTO maxpart_date
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME='Calls' AND TABLE_SCHEMA='test';
END WHILE;
END $$
DELIMITER ;
Btw, विभाजन रखरखाव (नया विभाजन सुनिश्चित पहले से बनाई गई हैं, पुराने विभाजन प्रूनिंग, आदि) है, IMHO, गंभीर रूप से महत्वपूर्ण स्वचालित करने के लिए। मैंने व्यक्तिगत रूप से एक बड़े उद्यम डेटा वेयरहाउस को एक दिन के लिए नीचे देखा है क्योंकि एक साल के लायक विभाजनों को शुरुआत में cretaed किया गया था, लेकिन अगले वर्ष आने के बाद कोई भी अधिक विभाजन बनाने के लिए याद नहीं आया। तो यह बहुत अच्छा है कि आप स्वचालन के बारे में सोच रहे हैं - यह उस परियोजना के लिए अच्छा है जो आप काम कर रहे हैं। :-)
एक साथ निष्पादन की रोकथाम में 1024 विभाजन तालिका के अनुसार अनुमति की एक अधिकतम कर रहे हैं, तो यह समाधान 3 वर्ष से कम में विभाजन से बाहर चला जाएगा। और जिन मामलों में दैनिक विभाजन प्रदर्शन में सुधार करेंगे, वे बहुत दुर्लभ होने जा रहे हैं ... यदि आप वास्तव में ऐसा करने का आग्रह करते हैं, तो आपको हर दिन एक नया विभाजन बनाने की आवश्यकता नहीं है, [यहां] देखें (http://stackoverflow.com/ए/6163679/238419) –