Tak, możesz to zrobić.
Należy zauważyć, że harmonogram nie jest domyślnie aktywny (patrz Event Scheduler Configuration), więc nie jest to opcja zerowego ryzyka. Na przykład, jeśli twój zespół operacyjny przeniesie twoją aplikację na nowy serwer, ale zapomni włączyć harmonogram, twoja aplikacja zostanie zablokowana. Potrzebne są również specjalne uprawnienia, które mogą wymagać ponownego ustawienia na nowym serwerze.
Moja rada: najpierw utwórz procedurę składowaną (patrz przykładowy kod poniżej), która obsługuje okresową konserwację partycji: usuwanie starych partycji, jeśli tabela staje się zbyt duża, i dodawanie wystarczającej liczby nowych partycji (np. 1 tydzień), aby nawet jeśli Proces konserwacji nie działa przez jakiś czas, twoja aplikacja nie umiera.
Następnie nadmiarowo planuj połączenia z tym zapisanym proc. Użyj harmonogramu MySQL, użyj zadania cron i użyj dowolnego innego sposobu. Jeśli jeden program planujący nie działa, drugi może zwolnić. Jeśli projektujesz sproc poprawnie, to powinno być tanie, aby wykonać operację, jeśli nie musisz nic robić. Możesz nawet chcieć połączyć się z nią z aplikacji, np. jako pierwsza instrukcja generowania długiego raportu lub jako część codziennego procesu ETL (jeśli taki posiadasz). Chodzi mi o to, że piętą achillesową zaplanowanych zadań jest zapewnienie, że program planujący rzeczywiście działa - pomyśl więc o nadmiarowości tutaj.
Upewnij się, że nie zaplanujesz wszystkich połączeń jednocześnie, aby się nie nawzajem kontaktować! :-)
Oto przykład kodu dla tego, jak powinien wyglądać twój proces konserwacji - najpierw usuwa stare partycje, a następnie dodaje nowe. Zostawiłem sprawdzanie błędów i zapobieganie wielu jednoczesnym egzekucjom jako egzerise dla czytelnika.
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, obsługę partycji (zapewnienie nowe partycje są tworzone z góry, przycinanie starych partycji, itd.) Jest, moim skromnym zdaniem, niezwykle ważne, aby zautomatyzować. Osobiście widziałem, jak duża hurtownia danych dla przedsiębiorstw zanika na jeden dzień, ponieważ początkowa wartość partycji została utworzona na początku roku, ale nikt nie pamiętał, aby utworzyć więcej partycji po nadchodzącym roku. Więc dobrze, że myślisz o automatyzacji tutaj - dobrze wróży to dla projektu, nad którym pracujesz. :-)
Istnieje maksymalnie 1024 przegród pozwoliło na stole, więc to rozwiązanie nie zabraknie partycji w ciągu 3 lat. A przypadki, w których partycje dzienne poprawiłyby wydajność, będą dość rzadkie ... Jeśli naprawdę nalegasz na zrobienie tego, nie musisz tworzyć nowej partycji codziennie, zobacz [tutaj] (http://stackoverflow.com/a/6163679/238419) –