はい、できます。
スケジューラはデフォルトではアクティブではないことに注意してください (「イベント スケジューラの設定」を参照)。したがって、リスクのないオプションではありません。たとえば、運用チームがアプリを新しいサーバーに移行したものの、スケジューラを有効にするのを忘れた場合、アプリは失敗します。特別な権限も必要です。これも、新しいサーバーで設定する必要がある場合があります。
私のアドバイス: まず、定期的なパーティション メンテナンスを処理するストアド プロシージャ (以下のコード サンプルを参照) を作成します。しばらく実行しなくても、アプリは停止しません。
次に、そのストアド プロシージャへの呼び出しを重複してスケジュールします。MySQL スケジューラを使用したり、cron ジョブを使用したり、その他の方法を使用したりできます。1 つのスケジューラーが機能していない場合、もう 1 つのスケジューラーがスラックを拾うことができます。sproc を正しく設計すれば、何もする必要がない場合、no-op を実行する方が安上がりです。たとえば、長時間実行レポートを生成するときの最初のステートメントとして、または毎日の ETL プロセス (ある場合) の一部として、アプリから呼び出すこともできます。要点は、スケジュールされたタスクのアキレス腱は、スケジューラが実際に機能していることを確認することです。したがって、ここで冗長性について考えてください。
すべての通話を同時にスケジュールしないように注意してください。:-)
これは、メンテナンス プロシージャがどのようなものになるかを示すコード サンプルです。最初に古いパーティションを削除し、次に新しいパーティションを追加します。エラー チェックと複数の同時実行の防止については、読者の演習として残しました。
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 ;
ところで、パーティションのメンテナンス(新しいパーティションを事前に作成すること、古いパーティションをプルーニングすることなど)は、自動化するために非常に重要です。個人的には、大規模なエンタープライズ データ ウェアハウスが 1 日ダウンするのを見たことがあります。これは、最初に 1 年分のパーティションが作成されたが、翌年になってもさらにパーティションを作成することを覚えている人が誰もいなかったためです。したがって、ここで自動化について考えていることは非常に良いことです。それは、あなたが取り組んでいるプロジェクトにとって良い前兆です。:-)