Sí, puede hacerlo.
Tenga en cuenta que el planificador no está activo de forma predeterminada (consulte Event Scheduler Configuration), por lo que no es una opción de cero riesgo. Por ejemplo, si su equipo de operaciones migra su aplicación a un nuevo servidor, pero se olvida de habilitar el programador, su aplicación recibirá una manguera. También se necesitan privilegios especiales, que de nuevo pueden necesitar ser configurados en un nuevo servidor.
Mi consejo: primero, cree un procedimiento almacenado (vea el ejemplo del código a continuación) que maneja el mantenimiento periódico de la partición: descarta particiones viejas si la tabla es demasiado grande y agrega suficientes particiones nuevas (ej. 1 semana) El proceso de mantenimiento no se ejecuta por un tiempo, su aplicación no morirá.
Luego programe llamadas de forma redundante a ese proceso almacenado. Utiliza el programador MySQL, utiliza un trabajo cron y utiliza cualquier otra forma que desees. Entonces, si un planificador no funciona, el otro puede tomar la holgura. Si diseñas correctamente el sproc, sería barato ejecutar un no-operativo si no necesita hacer nada. Es posible que incluso quieras llamarlo desde tu aplicación, p. como la primera declaración al generar un informe de larga ejecución o como parte de su proceso diario de ETL (si tiene uno). Mi punto es que el talón de Aquiles de las tareas programadas es garantizar que el planificador esté realmente funcionando, así que piense en la redundancia aquí.
¡Solo asegúrese de no programar todas las llamadas al mismo tiempo para que no se pisen! :-)
Aquí hay un ejemplo de código para ver cómo se vería su proceso de mantenimiento: primero borra las particiones viejas y luego agrega las nuevas. Dejé la comprobación de errores y evité múltiples ejecuciones simultáneas como un ejercicio para el lector.
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 ;
Por cierto, el mantenimiento de partición (asegurando nuevas particiones se crean de antemano, la poda de particiones antiguas, etc.) está, en mi humilde opinión, una importancia crítica para automatizar. Personalmente, he visto un gran almacén de datos de la empresa bajar por un día porque inicialmente se creó un año de particiones, pero nadie recordó que crearía más particiones una vez que llegara el año siguiente. Por lo tanto, es muy bueno que esté pensando en la automatización, es un buen augurio para el proyecto en el que está trabajando. :-)
Hay un máximo de 1024 particiones permitidas por mesa, por lo que esta solución se quedarán sin particiones en menos de 3 años. Y los casos en que las particiones diarias mejorarían el rendimiento serán bastante raros ... Si realmente insiste en hacerlo, es posible que no necesite crear una nueva partición todos los días, consulte [aquí] (http://stackoverflow.com)./a/6163679/238419) –