Oui, vous pouvez le faire.
Notez que le planificateur n'est pas actif par défaut (voir Event Scheduler Configuration). Il ne s'agit donc pas d'une option à risque zéro. Par exemple, si votre équipe d'opérations migre votre application vers un nouveau serveur, mais oublie d'activer le planificateur, votre application sera arrosée. Des privilèges spéciaux sont également nécessaires, ce qui peut nécessiter une nouvelle configuration sur un nouveau serveur. Mon conseil: d'abord, créer une procédure stockée (voir exemple de code ci-dessous) qui gère la maintenance périodique des partitions: abandonner les anciennes partitions si la table devient trop grande et ajouter suffisamment de nouvelles partitions (par exemple 1 semaine) proc de maintenance n'est pas exécuté pendant un certain temps, votre application ne mourra pas.
Ensuite, planifiez de manière redondante les appels à ce proc stocké. Utilisez le planificateur MySQL, utilisez un travail cron et utilisez n'importe quel autre moyen. Ensuite, si un planificateur ne fonctionne pas, l'autre peut prendre le relais. Si vous concevez le sproc correctement, il devrait être bon marché d'exécuter un no-op s'il n'a pas besoin de faire quoi que ce soit. Vous pourriez même vouloir l'appeler depuis votre application, par ex. comme première déclaration lors de la génération d'un rapport de longue durée ou dans le cadre de votre processus ETL quotidien (si vous en avez un). Mon point est que le talon d'Achille des tâches planifiées est de s'assurer que le planificateur fonctionne réellement - alors pensez à la redondance ici. Assurez-vous de ne pas programmer tous les appels en même temps afin qu'ils ne se chevauchent pas! :-)
Voici un exemple de code pour ce à quoi pourrait ressembler votre proc de maintenance - d'abord, il élague les anciennes partitions, puis en ajoute de nouvelles. J'ai laissé la vérification d'erreur et empêché plusieurs exécutions simultanées en tant qu'exercice pour le lecteur.
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, la maintenance de la partition (assurant de nouvelles partitions sont créées à l'avance, la taille des partitions anciennes, etc.) est, à mon humble avis, d'une importance cruciale pour automatiser. J'ai personnellement vu un entrepôt de données d'une grande entreprise disparaître pendant une journée, car une partition d'une année avait déjà été créée, mais personne ne s'est souvenu de créer plus de partitions une fois l'année suivante. Donc, c'est très bien que vous pensiez à l'automatisation ici - c'est de bon augure pour le projet sur lequel vous travaillez. :-)
Il y a un maximum de 1024 partitions autorisées par table, donc cette solution à court de partitions en moins de 3 ans. Et les cas où les partitions quotidiennes amélioreraient les performances vont être plutôt rares ... Si vous insistez vraiment pour cela, vous n'aurez pas besoin de créer une nouvelle partition tous les jours, voir [ici] (http://stackoverflow.com)/a/6163679/238419) –