TTL(Time to Live)の対象となるMySQLレコードの作成方法|イベントスケジューラで自動削除を実現
MySQLデータベースでTTL(Time To Live:生存期間)を設定し、期限切れのレコードを自動的に削除したい場合は、MySQLイベントスケジューラ(Event Scheduler)を利用します。イベントスケジューラは、あらかじめ定義したスケジュールに従ってSQL処理を自動実行してくれる仕組みで、「毎日1回、有効期限を過ぎたレコードを削除する」といった運用を簡単に実現できます。
全体の流れ
- サンプル用のテーブルを作成する
- INSERT文でテストデータを登録する
- SELECT文で登録内容を確認する
- 毎日実行される削除イベント(CREATE EVENT)を作成する
手順1:サンプルテーブルを作成する
まずは動作確認用のテーブルを作成しましょう。Idカラムを主キー(AUTO_INCREMENT)、EventDateTimeカラムに日時を格納するシンプルな構造です。
mysql> create table EventDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> EventDateTime datetime
-> );
Query OK, 0 rows affected (0.71 sec)
手順2:テーブルにレコードを挿入する
続いて、INSERT文を使って複数のレコードを登録します。
mysql> insert into EventDemo(EventDateTime) values('2010-09-21');
Query OK, 1 row affected (0.19 sec)
mysql> insert into EventDemo(EventDateTime) values('2016-10-27');
Query OK, 1 row affected (0.20 sec)
mysql> insert into EventDemo(EventDateTime) values('2018-12-09');
Query OK, 1 row affected (0.10 sec)
mysql> insert into EventDemo(EventDateTime) values('2019-03-12');
Query OK, 1 row affected (0.17 sec)
mysql> insert into EventDemo(EventDateTime) values('2019-01-04');
Query OK, 1 row affected (0.15 sec)手順3:登録したレコードを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from EventDemo;
実行結果は以下のとおりです。
+----+---------------------+
| Id | EventDateTime |
+----+---------------------+
| 1 | 2010-09-21 00:00:00 |
| 2 | 2016-10-27 00:00:00 |
| 3 | 2018-12-09 00:00:00 |
| 4 | 2019-03-12 00:00:00 |
| 5 | 2019-01-04 00:00:00 |
+----+---------------------+
5 rows in set (0.00 sec)
手順4:TTLの対象となる削除イベントを作成する
ここが本題です。CREATE EVENT文を使って、毎日1回自動実行されるイベントを定義します。この例では、EventDateTimeが現在時刻(NOW())より前、つまり有効期限が切れたレコードをすべて削除します。
mysql> delimiter //
mysql> CREATE EVENT
-> DeleteDemo
-> ON SCHEDULE EVERY 1 DAY
-> DO
-> BEGIN
-> DELETE FROM
-> EventDemo
-> WHERE EventDateTime < NOW();
-> END //
Query OK, 0 rows affected (0.31 sec)
ポイント解説
- delimiter //:ストアドプロシージャやイベント内では複数のSQL文を扱うため、区切り文字を「//」に変更しています。定義後は
delimiter ;で元に戻すのが一般的です。 - ON SCHEDULE EVERY 1 DAY:イベントを毎日1回実行するよう指定しています。「EVERY 1 HOUR」「EVERY 1 WEEK」など、目的に応じて間隔を変更できます。
- WHERE EventDateTime < NOW():現在時刻より過去の日時を持つレコード、つまりTTLの有効期限が切れたレコードだけを削除対象にしています。
補足:イベントスケジューラが有効か確認しよう
イベントスケジューラが無効になっていると、作成したイベントは実行されません。以下のコマンドで状態を確認し、必要なら有効化してください。
-- 現在の状態を確認
mysql> SHOW VARIABLES LIKE 'event_scheduler';
-- イベントスケジューラを有効化
mysql> SET GLOBAL event_scheduler = ON;
このように、イベントスケジューラを活用すれば、アプリケーション側で定期バッチを組むことなく、MySQLだけでTTLベースのレコード自動削除を実装できます。ログやセッション情報など、保存期間が決まっているデータの管理にぜひ活用してください。
-
MySQLコマンドラインでデータベースを作成する方法を初心者向けに解説
MySQLコマンドラインでデータベースを作成する手順 この記事では、WindowsのコマンドプロンプトからMySQLに接続し、データベースを作成する一連の手順をスクリーンショット付きで解説します。初心者の方でも迷わず進められるよう、順番に見ていきましょう。 1. コマンドプロンプトを開く まず、コマンドプロンプトを起動します。キーボードのショートカット「Windows + R」キーを押すと、「ファイル名を指定して実行」ダイアログが表示されます。 2. 「CMD」と入力してOKをクリック 表示された入力欄に CMD と入力し、「OK」ボタンをクリックしてください。 3. コマンドプロンプトが
-
MySQLでシーケンスを作成する方法|AUTO_INCREMENTの使い方とルールを解説
MySQLにおけるシーケンスとは?MySQLにおける「シーケンス」とは、1(指定した場合は0)から始まり、昇順で自動生成される整数の連番のことです。多くのアプリケーションでは、レコードを一意に識別するための番号を発行する目的でシーケンスが利用されています。具体例代表的な例としては、CRMシステムの顧客ID、人事管理システムの社員番号、設備管理システムの機器番号などが挙げられます。MySQLでシーケンスを自動的に作成するには、対象のカラムにAUTO_INCREMENT属性を設定します。通常は、主キー(PRIMARY KEY)カラムに対して適用するのが一般的です。AUTO_INCREMENTを使用