<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>http://mochiuwiki.e2.valueserver.jp/index.php?action=history&amp;feed=atom&amp;title=MySQL_-_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%A9</id>
	<title>MySQL - イベントスケジューラ - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="http://mochiuwiki.e2.valueserver.jp/index.php?action=history&amp;feed=atom&amp;title=MySQL_-_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%A9"/>
	<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=MySQL_-_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%A9&amp;action=history"/>
	<updated>2026-09-02T12:19:24Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://mochiuwiki.e2.valueserver.jp/index.php?title=MySQL_-_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%A9&amp;diff=14294&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == MySQLのイベントスケジューラは、データベース内でスケジュール済みタスクを自動実行する機能である。&lt;br&gt; これは、cronのようなスケジューリング機能をMySQL内で提供するものであり、定期的なメンテナンスやデータ整理、集計処理を自動化できる。&lt;br&gt; &lt;br&gt; イベントスケジューラは、MySQL 5.1以降で利用可能である。&lt;br&gt; &lt;br&gt; イベントには、1度…」</title>
		<link rel="alternate" type="text/html" href="http://mochiuwiki.e2.valueserver.jp/index.php?title=MySQL_-_%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%A9&amp;diff=14294&amp;oldid=prev"/>
		<updated>2026-02-15T09:30:14Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == MySQLのイベントスケジューラは、データベース内でスケジュール済みタスクを自動実行する機能である。&amp;lt;br&amp;gt; これは、cronのようなスケジューリング機能をMySQL内で提供するものであり、定期的なメンテナンスやデータ整理、集計処理を自動化できる。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; イベントスケジューラは、MySQL 5.1以降で利用可能である。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; イベントには、1度…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
MySQLのイベントスケジューラは、データベース内でスケジュール済みタスクを自動実行する機能である。&amp;lt;br&amp;gt;&lt;br /&gt;
これは、cronのようなスケジューリング機能をMySQL内で提供するものであり、定期的なメンテナンスやデータ整理、集計処理を自動化できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
イベントスケジューラは、MySQL 5.1以降で利用可能である。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
イベントには、1度限り実行される &amp;lt;u&amp;gt;ATイベント&amp;lt;/u&amp;gt; と、繰り返し実行される &amp;lt;u&amp;gt;EVERYイベント&amp;lt;/u&amp;gt; の2種類がある。&amp;lt;br&amp;gt;&lt;br /&gt;
* ATイベント&lt;br /&gt;
*: 指定された日時に1度だけ実行される。&lt;br /&gt;
* EVERYイベント&lt;br /&gt;
*: 指定された間隔で繰り返し実行される。&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
イベントスケジューラは、&amp;lt;code&amp;gt;event_scheduler&amp;lt;/code&amp;gt; システム変数によって制御される。&amp;lt;br&amp;gt;&lt;br /&gt;
この変数は、ON、OFF、DISABLEDの3つの状態を持ち、ランタイムで切り替えが可能である。(DISABLEDを除く)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
イベントは、&amp;lt;code&amp;gt;CREATE EVENT&amp;lt;/code&amp;gt; 文で作成し、&amp;lt;code&amp;gt;ALTER EVENT&amp;lt;/code&amp;gt; 文で変更し、&amp;lt;code&amp;gt;DROP EVENT&amp;lt;/code&amp;gt; 文で削除する。&amp;lt;br&amp;gt;&lt;br /&gt;
イベントの情報は、&amp;lt;code&amp;gt;INFORMATION_SCHEMA.EVENTS&amp;lt;/code&amp;gt; テーブルから確認できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;イベントスケジューラの主な用途には、古いログの定期削除、集計テーブルの更新、テーブル最適化、バックアップ処理等がある。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;SQL内で完結するため、外部スクリプトが不要であり、OS非依存で移植性が高いという利点がある。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イベントスケジューラの有効化 ==&lt;br /&gt;
==== event_scheduler変数 ====&lt;br /&gt;
イベントスケジューラの動作は、&amp;lt;code&amp;gt;event_scheduler&amp;lt;/code&amp;gt; システム変数で制御される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
この変数には、以下の3つの状態がある。&amp;lt;br&amp;gt;&lt;br /&gt;
br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ イベントスケジューラの状態&lt;br /&gt;
|-&lt;br /&gt;
! 状態 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| ON (または 1) || イベントスケジューラが有効であり、イベントが実行可能な状態である。&amp;lt;br&amp;gt;スケジューラスレッドが起動し、&amp;lt;code&amp;gt;SHOW PROCESSLIST&amp;lt;/code&amp;gt; に表示される。&lt;br /&gt;
|-&lt;br /&gt;
| OFF (または 0) || イベントスケジューラが無効であり、イベントは実行されない。&amp;lt;br&amp;gt;スレッドは停止しているが、ランタイムでONに切り替え可能である。&lt;br /&gt;
|-&lt;br /&gt;
| DISABLED || イベントスケジューラが完全に無効化されている。&amp;lt;br&amp;gt;サーバ起動時のみ設定可能であり、ランタイムでは変更できない。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
イベントスケジューラをランタイムで有効化する構文を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SET GLOBAL event_scheduler = ON;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
サーバ起動時にイベントスケジューラを有効化するには、&amp;lt;u&amp;gt;my.cnfファイル&amp;lt;/u&amp;gt; に以下に示す設定を追加する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 event_scheduler = ON&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 状態の確認 ====&lt;br /&gt;
イベントスケジューラの現在の状態を確認する方法を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW VARIABLES LIKE &amp;#039;event_scheduler&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
または、グローバル変数を直接参照する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SELECT @@GLOBAL.event_scheduler;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
イベントスケジューラスレッドが起動しているかどうかを確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW PROCESSLIST;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;event_scheduler&amp;lt;/code&amp;gt; が ON の場合、User が &amp;lt;code&amp;gt;event_scheduler&amp;lt;/code&amp;gt;、Command が Daemon のプロセスが表示される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イベントの作成 ==&lt;br /&gt;
==== 基本構文 ====&lt;br /&gt;
イベントを作成するには、&amp;lt;code&amp;gt;CREATE EVENT&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE&lt;br /&gt;
    [DEFINER = &amp;lt;ユーザ名&amp;gt;]&lt;br /&gt;
    EVENT [IF NOT EXISTS] &amp;lt;イベント名&amp;gt;&lt;br /&gt;
    ON SCHEDULE &amp;lt;スケジュール&amp;gt;&lt;br /&gt;
    [ON COMPLETION [NOT] PRESERVE]&lt;br /&gt;
    [ENABLE | DISABLE | DISABLE ON SLAVE]&lt;br /&gt;
    [COMMENT &amp;#039;string&amp;#039;]&lt;br /&gt;
    DO &amp;lt;イベント本体&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
下表に、主要な構文要素を示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 主要な構文要素&lt;br /&gt;
|-&lt;br /&gt;
! 構文要素 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| DEFINER || イベントを実行するユーザを指定する。&amp;lt;br&amp;gt;省略時は、現在のユーザが設定される。&lt;br /&gt;
|-&lt;br /&gt;
| IF NOT EXISTS || 同名のイベントが存在する場合、エラーにならず警告のみが出力される。&lt;br /&gt;
|-&lt;br /&gt;
| ON SCHEDULE || イベントの実行スケジュールを指定する。&lt;br /&gt;
|-&lt;br /&gt;
| ON COMPLETION || イベント実行完了後の動作を指定する。&lt;br /&gt;
|-&lt;br /&gt;
| ENABLE / DISABLE || イベントの有効・無効を指定する。&lt;br /&gt;
|-&lt;br /&gt;
| COMMENT || イベントのコメントを指定する。&lt;br /&gt;
|-&lt;br /&gt;
| DO || 実行するSQL文 または ストアドプロシージャを指定する。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== スケジュール指定 ====&lt;br /&gt;
イベントのスケジュールは、&amp;lt;code&amp;gt;ON SCHEDULE&amp;lt;/code&amp;gt; 句で指定する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 schedule: {&lt;br /&gt;
    AT &amp;lt;タイムスタンプ&amp;gt; [+ INTERVAL &amp;lt;間隔&amp;gt;] ...&lt;br /&gt;
  | EVERY &amp;lt;間隔&amp;gt;&lt;br /&gt;
    [STARTS &amp;lt;タイムスタンプ&amp;gt; [+ INTERVAL &amp;lt;間隔&amp;gt;] ...]&lt;br /&gt;
    [ENDS &amp;lt;タイムスタンプ&amp;gt; [+ INTERVAL &amp;lt;間隔&amp;gt;] ...]&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 interval:&lt;br /&gt;
    &amp;lt;数値&amp;gt; {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |&lt;br /&gt;
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |&lt;br /&gt;
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
AT構文は、1度限りのイベントを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT cleanup_event&lt;br /&gt;
    ON SCHEDULE AT &amp;#039;2026-03-01 03:00:00&amp;#039;&lt;br /&gt;
    DO DELETE FROM logs WHERE created_date &amp;lt; NOW() - INTERVAL 30 DAY;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
現在時刻からの相対時刻で指定することもできる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT temp_event&lt;br /&gt;
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR&lt;br /&gt;
    DO INSERT INTO status_log (message) VALUES (&amp;#039;Hourly check&amp;#039;);&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
EVERY構文は、繰り返しイベントを作成する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT daily_cleanup&lt;br /&gt;
    ON SCHEDULE EVERY 1 DAY&lt;br /&gt;
    DO DELETE FROM logs WHERE created_date &amp;lt; NOW() - INTERVAL 30 DAY;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;STARTS&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;ENDS&amp;lt;/code&amp;gt; を使用して、開始日時と終了日時を指定できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT monthly_report&lt;br /&gt;
    ON SCHEDULE EVERY 1 MONTH&lt;br /&gt;
    STARTS &amp;#039;2026-01-01 00:00:00&amp;#039;&lt;br /&gt;
    ENDS &amp;#039;2026-12-31 23:59:59&amp;#039;&lt;br /&gt;
    DO CALL generate_monthly_report();&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
様々な間隔の指定例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 -- 毎時間実行&lt;br /&gt;
 ON SCHEDULE EVERY 1 HOUR&lt;br /&gt;
 &lt;br /&gt;
 -- 15分ごとに実行&lt;br /&gt;
 ON SCHEDULE EVERY 15 MINUTE&lt;br /&gt;
 &lt;br /&gt;
 -- 毎週月曜日 (1週間ごと) に実行&lt;br /&gt;
 ON SCHEDULE EVERY 1 WEEK&lt;br /&gt;
    STARTS &amp;#039;2026-02-17 00:00:00&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
 -- 3時間ごとに実行&lt;br /&gt;
 ON SCHEDULE EVERY 3 HOUR&lt;br /&gt;
 &lt;br /&gt;
 -- 30秒ごとに実行&lt;br /&gt;
 ON SCHEDULE EVERY 30 SECOND&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ON COMPLETION ====&lt;br /&gt;
&amp;lt;code&amp;gt;ON COMPLETION&amp;lt;/code&amp;gt; 句は、イベント実行完了後の動作を制御する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ ON COMPLETIONの動作&lt;br /&gt;
|-&lt;br /&gt;
! オプション !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| PRESERVE || イベント実行完了後も、イベント定義を保持する。&amp;lt;br&amp;gt;1度限りイベントでも、実行後に削除されない。&lt;br /&gt;
|-&lt;br /&gt;
| NOT PRESERVE || イベント実行完了後、イベント定義を自動削除する。(デフォルト)&amp;lt;br&amp;gt;1度限りイベントは、実行後に自動的に削除される。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1度限りイベントを実行後も保持する例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT one_time_event&lt;br /&gt;
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY&lt;br /&gt;
    ON COMPLETION PRESERVE&lt;br /&gt;
    DO INSERT INTO maintenance_log (message) VALUES (&amp;#039;Scheduled maintenance&amp;#039;);&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
繰り返しイベントは、&amp;lt;code&amp;gt;ENDS&amp;lt;/code&amp;gt; で指定された終了日時を過ぎると完了とみなされる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;NOT PRESERVE&amp;lt;/code&amp;gt; を指定すると、終了日時後にイベント定義が削除される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== イベントの状態 ====&lt;br /&gt;
イベントの有効・無効状態を指定できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ イベントの有効・無効オプション&lt;br /&gt;
|-&lt;br /&gt;
! オプション !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| ENABLE || イベントを有効化する。(デフォルト)&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE || イベントを無効化する。&amp;lt;br&amp;gt;イベント定義は保持されるが、実行されない。&lt;br /&gt;
|-&lt;br /&gt;
| DISABLE ON SLAVE || レプリケーション環境でレプリカ側では無効化する。&amp;lt;br&amp;gt;マスタ側でのみ実行される。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
無効状態でイベントを作成する例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT maintenance_event&lt;br /&gt;
    ON SCHEDULE EVERY 1 DAY&lt;br /&gt;
    DISABLE&lt;br /&gt;
    COMMENT &amp;#039;メンテナンス用イベント (手動有効化が必要)&amp;#039;&lt;br /&gt;
    DO CALL maintenance_procedure();&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イベントの実行内容 ==&lt;br /&gt;
==== 単一SQL文 ====&lt;br /&gt;
&amp;lt;code&amp;gt;DO&amp;lt;/code&amp;gt; 句には、単一のSQL文を記述できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT delete_old_logs&lt;br /&gt;
    ON SCHEDULE EVERY 1 DAY&lt;br /&gt;
    DO DELETE FROM logs WHERE date &amp;lt; NOW() - INTERVAL 30 DAY;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
INSERT文 や UPDATE文も使用できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT update_statistics&lt;br /&gt;
    ON SCHEDULE EVERY 1 HOUR&lt;br /&gt;
    DO UPDATE stats SET last_update = CURRENT_TIMESTAMP;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 複数SQL文 ====&lt;br /&gt;
複数のSQL文を実行する場合は、&amp;lt;code&amp;gt;BEGIN ... END&amp;lt;/code&amp;gt; ブロックを使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
デリミタを変更して、ブロック内のセミコロンと区別する必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER |&lt;br /&gt;
 &lt;br /&gt;
 CREATE EVENT cleanup_and_optimize&lt;br /&gt;
    ON SCHEDULE EVERY 1 DAY STARTS &amp;#039;2026-01-01 03:00:00&amp;#039;&lt;br /&gt;
    DO BEGIN&lt;br /&gt;
       DELETE FROM logs WHERE created_date &amp;lt; NOW() - INTERVAL 30 DAY;&lt;br /&gt;
       OPTIMIZE TABLE logs;&lt;br /&gt;
    END |&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
変数やループを使用した複雑な処理も記述できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、10回に分けて1000行ずつ削除し、各削除の間に1秒の待機時間を設けている。&amp;lt;br&amp;gt;&lt;br /&gt;
これにより、データベースへの負荷を分散できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER |&lt;br /&gt;
 &lt;br /&gt;
 CREATE EVENT batch_delete&lt;br /&gt;
    ON SCHEDULE EVERY 1 DAY&lt;br /&gt;
    DO BEGIN&lt;br /&gt;
       DECLARE i INT DEFAULT 0;&lt;br /&gt;
       WHILE i &amp;lt; 10 DO&lt;br /&gt;
          DELETE FROM logs WHERE created_date &amp;lt; NOW() - INTERVAL 90 DAY LIMIT 1000;&lt;br /&gt;
          SET i = i + 1;&lt;br /&gt;
          DO SLEEP(1);&lt;br /&gt;
       END WHILE;&lt;br /&gt;
    END |&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== ストアドプロシージャの呼び出し ====&lt;br /&gt;
&amp;lt;code&amp;gt;DO&amp;lt;/code&amp;gt; 句でストアドプロシージャを呼び出すこともできる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT daily_maintenance&lt;br /&gt;
    ON SCHEDULE EVERY 1 DAY STARTS &amp;#039;2026-01-01 02:00:00&amp;#039;&lt;br /&gt;
    DO CALL cleanup_procedure();&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
パラメータを渡すこともできる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT monthly_archive&lt;br /&gt;
    ON SCHEDULE EVERY 1 MONTH&lt;br /&gt;
    DO CALL archive_old_data(90);&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イベントの変更 ==&lt;br /&gt;
既存のイベントを変更するには、&amp;lt;code&amp;gt;ALTER EVENT&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER [DEFINER = &amp;lt;ユーザ名&amp;gt;] EVENT &amp;lt;イベント名&amp;gt;&lt;br /&gt;
    [ON SCHEDULE &amp;lt;スケジュール&amp;gt;]&lt;br /&gt;
    [ON COMPLETION [NOT] PRESERVE]&lt;br /&gt;
    [RENAME TO &amp;lt;新しいイベント名&amp;gt;]&lt;br /&gt;
    [ENABLE | DISABLE | DISABLE ON SLAVE]&lt;br /&gt;
    [COMMENT &amp;#039;string&amp;#039;]&lt;br /&gt;
    [DO &amp;lt;イベント本体&amp;gt;]&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* スケジュールを変更する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER EVENT cleanup_event&lt;br /&gt;
    ON SCHEDULE EVERY 2 DAY;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* イベントを無効化する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER EVENT maintenance_event DISABLE;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* イベントを有効化する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER EVENT maintenance_event ENABLE;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* イベント名を変更する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER EVENT old_event_name&lt;br /&gt;
    RENAME TO new_event_name;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 実行内容を変更する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER EVENT cleanup_event&lt;br /&gt;
    DO DELETE FROM logs WHERE created_date &amp;lt; NOW() - INTERVAL 60 DAY;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 複数の項目を同時に変更することもできる。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 ALTER EVENT maintenance_event&lt;br /&gt;
    ON SCHEDULE EVERY 1 WEEK&lt;br /&gt;
    ON COMPLETION PRESERVE&lt;br /&gt;
    COMMENT &amp;#039;毎週実行されるメンテナンスイベント&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イベントの削除 ==&lt;br /&gt;
イベントを削除するには、&amp;lt;code&amp;gt;DROP EVENT&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DROP EVENT [IF EXISTS] &amp;lt;イベント名&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
イベントを削除する例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DROP EVENT cleanup_event;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;IF EXISTS&amp;lt;/code&amp;gt; 句を使用すると、イベントが存在しない場合でもエラーにならず、警告のみが出力される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DROP EVENT IF EXISTS temp_event;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イベントの確認 ==&lt;br /&gt;
イベント一覧を確認するには、&amp;lt;code&amp;gt;SHOW EVENTS&amp;lt;/code&amp;gt; 文を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW EVENTS;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* 特定のデータベースのイベントを確認する。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW EVENTS FROM &amp;lt;データベース名&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* パターンマッチングでイベントを検索する。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW EVENTS LIKE &amp;#039;cleanup%&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 特定のイベントの定義を確認するには、&amp;lt;code&amp;gt;SHOW CREATE EVENT&amp;lt;/code&amp;gt; 文を使用する。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SHOW CREATE EVENT &amp;lt;イベント名&amp;gt;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* イベントの詳細情報は、&amp;lt;code&amp;gt;INFORMATION_SCHEMA.EVENTS&amp;lt;/code&amp;gt; テーブルから取得できる。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SELECT EVENT_SCHEMA, EVENT_NAME, EVENT_TYPE, EXECUTE_AT,&lt;br /&gt;
        INTERVAL_VALUE, INTERVAL_FIELD, STARTS, ENDS,&lt;br /&gt;
        STATUS, ON_COMPLETION, LAST_EXECUTED&lt;br /&gt;
 FROM INFORMATION_SCHEMA.EVENTS&lt;br /&gt;
 WHERE EVENT_NAME = &amp;#039;cleanup_event&amp;#039;;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ INFORMATION_SCHEMA.EVENTS の主要カラム&lt;br /&gt;
! カラム名 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EVENT_SCHEMA&amp;lt;/code&amp;gt; || イベントが属するデータベース名&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EVENT_NAME&amp;lt;/code&amp;gt; || イベント名&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DEFINER&amp;lt;/code&amp;gt; || イベントの定義者&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EVENT_TYPE&amp;lt;/code&amp;gt; || ONE TIME または RECURRING&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EXECUTE_AT&amp;lt;/code&amp;gt; || 一度限りイベントの実行日時&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;INTERVAL_VALUE&amp;lt;/code&amp;gt; || 繰り返しイベントの間隔値&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;INTERVAL_FIELD&amp;lt;/code&amp;gt; || 繰り返しイベントの間隔単位 (HOUR、DAY等)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;STARTS&amp;lt;/code&amp;gt; || 繰り返しイベントの開始日時&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ENDS&amp;lt;/code&amp;gt; || 繰り返しイベントの終了日時&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;STATUS&amp;lt;/code&amp;gt; || ENABLED、DISABLED、SLAVESIDE_DISABLED&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ON_COMPLETION&amp;lt;/code&amp;gt; || PRESERVE または NOT PRESERVE&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LAST_EXECUTED&amp;lt;/code&amp;gt; || 最後に実行された日時&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
全てのイベントの実行状態を確認する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SELECT EVENT_NAME, STATUS, LAST_EXECUTED&lt;br /&gt;
 FROM INFORMATION_SCHEMA.EVENTS&lt;br /&gt;
 WHERE EVENT_SCHEMA = DATABASE();&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== サンプルクエリ ==&lt;br /&gt;
==== 古いデータの削除 ====&lt;br /&gt;
* 30日以上前のログデータを毎日削除するイベント&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT cleanup_old_logs&lt;br /&gt;
    ON SCHEDULE EVERY 1 DAY STARTS &amp;#039;2026-01-01 02:00:00&amp;#039;&lt;br /&gt;
    DO DELETE FROM logs WHERE created_date &amp;lt; NOW() - INTERVAL 30 DAY;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 90日以上前のデータをバッチで削除し、負荷を分散する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER |&lt;br /&gt;
 &lt;br /&gt;
 CREATE EVENT batch_cleanup&lt;br /&gt;
    ON SCHEDULE EVERY 1 DAY STARTS &amp;#039;2026-01-01 03:00:00&amp;#039;&lt;br /&gt;
    DO BEGIN&lt;br /&gt;
       DECLARE i INT DEFAULT 0;&lt;br /&gt;
       WHILE i &amp;lt; 10 DO&lt;br /&gt;
          DELETE FROM transaction_logs&lt;br /&gt;
          WHERE created_date &amp;lt; NOW() - INTERVAL 90 DAY&lt;br /&gt;
          LIMIT 1000;&lt;br /&gt;
          SET i = i + 1;&lt;br /&gt;
          DO SLEEP(1);&lt;br /&gt;
       END WHILE;&lt;br /&gt;
    END |&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 集計テーブルの更新 ====&lt;br /&gt;
* 1時間ごとにセンサデータを集計して、統計テーブルに挿入する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER |&lt;br /&gt;
 &lt;br /&gt;
 CREATE EVENT update_hourly_stats&lt;br /&gt;
    ON SCHEDULE EVERY 1 HOUR&lt;br /&gt;
    DO BEGIN&lt;br /&gt;
       INSERT INTO hourly_stats (stat_time, count, avg_value, max_value)&lt;br /&gt;
       SELECT CURRENT_TIMESTAMP, COUNT(*), AVG(value), MAX(value)&lt;br /&gt;
       FROM sensor_readings&lt;br /&gt;
       WHERE timestamp &amp;gt; CURRENT_TIMESTAMP - INTERVAL 1 HOUR;&lt;br /&gt;
    END |&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 毎日の売上集計を作成する例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER |&lt;br /&gt;
 &lt;br /&gt;
 CREATE EVENT daily_sales_summary&lt;br /&gt;
    ON SCHEDULE EVERY 1 DAY STARTS &amp;#039;2026-01-01 23:00:00&amp;#039;&lt;br /&gt;
    DO BEGIN&lt;br /&gt;
       INSERT INTO daily_sales (sale_date, total_amount, order_count)&lt;br /&gt;
       SELECT CURDATE(), SUM(amount), COUNT(*)&lt;br /&gt;
       FROM orders&lt;br /&gt;
       WHERE DATE(order_date) = CURDATE();&lt;br /&gt;
    END |&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 定期メンテナンス ====&lt;br /&gt;
* 毎週テーブルを最適化し、統計情報を更新するイベントを作成する。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER |&lt;br /&gt;
 &lt;br /&gt;
 CREATE EVENT weekly_maintenance&lt;br /&gt;
    ON SCHEDULE EVERY 1 WEEK STARTS &amp;#039;2026-01-05 03:00:00&amp;#039;&lt;br /&gt;
    DO BEGIN&lt;br /&gt;
       OPTIMIZE TABLE users;&lt;br /&gt;
       OPTIMIZE TABLE transactions;&lt;br /&gt;
       OPTIMIZE TABLE logs;&lt;br /&gt;
       ANALYZE TABLE users;&lt;br /&gt;
       ANALYZE TABLE transactions;&lt;br /&gt;
       ANALYZE TABLE logs;&lt;br /&gt;
    END |&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 毎月1日にレポートを生成するイベントを作成する。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 CREATE EVENT monthly_report_generation&lt;br /&gt;
    ON SCHEDULE EVERY 1 MONTH STARTS &amp;#039;2026-03-01 01:00:00&amp;#039;&lt;br /&gt;
    DO CALL generate_monthly_report();&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CRONとの比較 ==&lt;br /&gt;
下表に、イベントスケジューラとCRONの比較を示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ イベントスケジューラ と CRONの比較&lt;br /&gt;
! 項目 !! イベントスケジューラ !! cron&lt;br /&gt;
|-&lt;br /&gt;
| 実行環境 || MySQL内 || OS (UNIX系システム)&lt;br /&gt;
|-&lt;br /&gt;
| 設定場所 || データベース内 || crontabファイル&lt;br /&gt;
|-&lt;br /&gt;
| 実行内容 || SQL文、ストアドプロシージャ || シェルスクリプト、コマンド、プログラム&lt;br /&gt;
|-&lt;br /&gt;
| OS依存性 || 非依存 (移植性が高い) || 依存 (UNIX系のみ)&lt;br /&gt;
|-&lt;br /&gt;
| 権限管理 || DEFINER で一元管理 || ユーザ権限、ファイルシステム権限&lt;br /&gt;
|-&lt;br /&gt;
| ログ確認 || INFORMATION_SCHEMA.EVENTS || syslog、cronログ&lt;br /&gt;
|-&lt;br /&gt;
| データベース停止時 || 実行されない || 実行可能 (データベース接続が必要)&lt;br /&gt;
|-&lt;br /&gt;
| 複雑な処理 || SQLの範囲内 || 任意のプログラム実行可能&lt;br /&gt;
|-&lt;br /&gt;
| スケジューリング精度 || 秒単位 || 分単位 (標準)&lt;br /&gt;
|-&lt;br /&gt;
| エラーハンドリング || SQLエラーハンドリング || シェルスクリプトのエラー処理&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ イベントスケジューラ と CRONのメリット&lt;br /&gt;
|-&lt;br /&gt;
! 方式 !! メリット&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | イベントスケジューラ&lt;br /&gt;
| SQL内で完結し、外部スクリプトが不要である&lt;br /&gt;
|-&lt;br /&gt;
| OS非依存で移植性が高い。&lt;br /&gt;
|-&lt;br /&gt;
| DEFINER権限で一元管理できる。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;INFORMATION_SCHEMA.EVENTS&amp;lt;/code&amp;gt; で実行情報を確認できる。&lt;br /&gt;
|-&lt;br /&gt;
| データベースと一体化しており、バックアップ時にイベント定義も含められる。&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; | cron&lt;br /&gt;
| シェルスクリプトや外部プログラムを実行できる。&lt;br /&gt;
|-&lt;br /&gt;
| POSIX標準で多くのシステムで利用可能である。&lt;br /&gt;
|-&lt;br /&gt;
| データベース停止時も動作可能である。&lt;br /&gt;
|-&lt;br /&gt;
| より柔軟なスケジューリングが可能である。&lt;br /&gt;
|-&lt;br /&gt;
| システムレベルのタスクを実行できる。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
用途に応じて、イベントスケジューラとCRONを使い分けることが推奨される。&amp;lt;br&amp;gt;&lt;br /&gt;
データベース内部の定期処理にはイベントスケジューラを使用し、外部プログラムの実行やシステムレベルのタスクにはCRONを使用するとよい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== イベントスケジューラの制限事項 ==&lt;br /&gt;
イベントスケジューラには、以下に示すような制限事項がある。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ イベントスケジューラの制限事項&lt;br /&gt;
|-&lt;br /&gt;
! 制限事項 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LOCK TABLES&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;UNLOCK TABLES&amp;lt;/code&amp;gt; は使用不可 || イベント内でテーブルロックを明示的に取得・解放することはできない。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ALTER VIEW&amp;lt;/code&amp;gt; は使用不可 || イベント内でビューの定義を変更することはできない。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LOAD DATA&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;LOAD XML&amp;lt;/code&amp;gt; は使用不可 || イベント内で外部ファイルからデータをロードすることはできない。&lt;br /&gt;
|-&lt;br /&gt;
| イベント内からのイベント操作は不可 || イベント内で &amp;lt;code&amp;gt;CREATE EVENT&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;ALTER EVENT&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;DROP EVENT&amp;lt;/code&amp;gt; を実行することはできない。&lt;br /&gt;
|-&lt;br /&gt;
| イベント名の大文字小文字は区別されない || event_name と EVENT_NAME は同一のイベントとして扱われる。&lt;br /&gt;
|-&lt;br /&gt;
| 複数実行保護メカニズムがない || 同じイベントが前回の実行完了前に再度トリガーされる可能性がある。&amp;lt;br&amp;gt;&amp;lt;code&amp;gt;GET_LOCK()&amp;lt;/code&amp;gt; 関数で排他制御を実装する必要がある。&lt;br /&gt;
|-&lt;br /&gt;
| 年2038以上の日付はサポートされない || 32ビット UNIXエポックの制限により、2038年1月19日以降の日付を正確に扱えない場合がある。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
複数実行を防ぐための排他制御の例を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、&amp;lt;code&amp;gt;GET_LOCK()&amp;lt;/code&amp;gt; 関数でロックを取得して、ロック取得に成功した場合のみ処理を実行する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;GET_LOCK(&amp;#039;my_event_lock&amp;#039;, 0)&amp;lt;/code&amp;gt; の第2パラメータ 0は、タイムアウトを0秒に設定しており、即座にロック取得の成否を返す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 DELIMITER |&lt;br /&gt;
 &lt;br /&gt;
 CREATE EVENT protected_event&lt;br /&gt;
    ON SCHEDULE EVERY 5 MINUTE&lt;br /&gt;
    DO BEGIN&lt;br /&gt;
       DECLARE lock_acquired INT;&lt;br /&gt;
       SET lock_acquired = GET_LOCK(&amp;#039;my_event_lock&amp;#039;, 0);&lt;br /&gt;
 &lt;br /&gt;
       IF lock_acquired = 1 THEN&lt;br /&gt;
          -- 実際の処理&lt;br /&gt;
          DELETE FROM logs WHERE created_date &amp;lt; NOW() - INTERVAL 30 DAY;&lt;br /&gt;
 &lt;br /&gt;
          DO RELEASE_LOCK(&amp;#039;my_event_lock&amp;#039;);&lt;br /&gt;
       END IF;&lt;br /&gt;
    END |&lt;br /&gt;
 &lt;br /&gt;
 DELIMITER ;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 関連ページ ==&lt;br /&gt;
* [[MySQL - ストアドプロシージャ]]&lt;br /&gt;
* [[MySQL - トリガー]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki&lt;br /&gt;
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,MySQL,Event Scheduler,イベントスケジューラ,CREATE EVENT,ALTER EVENT,DROP EVENT,Database,データベース,SQL,スケジューリング,自動実行,定期実行,cron,メンテナンス,集計,バッチ処理,電気回路,電子回路,基板,プリント基板&lt;br /&gt;
|description={{PAGENAME}} - MySQLのイベントスケジューラの設定、使用方法、実用例に関する総合ガイド | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux&lt;br /&gt;
|image=/resources/assets/MochiuLogo_Single_Blue.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:MySQL]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>