MySQL の計画タスクとイベント スケジュール例の分析

MySQL の計画タスクとイベント スケジュール例の分析

この記事では、例を使用して、MySQL の計画されたタスクとイベントのスケジュールについて説明します。ご参考までに、詳細は以下の通りです。

MySQL イベントは、事前定義されたスケジュールに基づいて実行されるタスクであるため、スケジュールされたイベントと呼ばれることもあります。 MySQL イベントは、トリガーのようにテーブルを更新するのではなく、時間によってトリガーされるため、「時間トリガー」とも呼ばれます。 MySQL イベントは、UNIX の cron ジョブや Windows のタスク スケジューラに似ています。 MySQL イベントは、データベース テーブルの最適化、ログのクリーンアップ、データのアーカイブ、またはオフピーク時の複雑なレポートの生成に使用できます。

MySQL は、イベントディスパッチスレッドと呼ばれる特別なスレッドを使用して、スケジュールされたすべてのイベントを実行します。次のコマンドを実行すると、イベント スケジューラ スレッドのステータスを表示できます。

プロセスリストを表示します。

上記のクエリステートメントを実行すると、次の結果が得られます。

mysql> プロセスリストを表示します。
+----+------+-----------------+----------+--------+---------+----------+------------------+
| ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 |
+----+------+-----------------+----------+--------+---------+----------+------------------+
| 2 | ルート | localhost:50405 | NULL | スリープ | 1966 | | NULL |
| 3 | ルート | localhost:50406 | yiibaidb | スリープ | 1964 | | NULL |
| 4 | root | localhost:50407 | yiibaidb | クエリ | 0 | 開始 | SHOW PROCESSLIST |
+----+------+-----------------+----------+--------+---------+----------+------------------+
3行セット

デフォルトでは、イベント ディスパッチャ スレッドは有効になっていません。 イベント ディスパッチャ スレッドを有効にして開始するには、次のコマンドを実行する必要があります。

グローバルイベントスケジューラを ON に設定します。

ここで、イベント スケジューラ スレッドのステータスを確認するには、SHOW PROCESSLIST コマンドを再度実行します。結果は次のようになります。

mysql> プロセスリストを表示します。
+----+-----------------+-----------------+----------+--------+------------------------+------------------+
| ID | ユーザー | ホスト | db | コマンド | 時間 | 状態 | 情報 |
+----+-----------------+-----------------+----------+--------+------------------------+------------------+
| 2 | ルート | localhost:50405 | NULL | スリープ | 1986 | | NULL |
| 3 | ルート | localhost:50406 | luyaran | スリープ | 1984 | | NULL |
| 4 | root | localhost:50407 | luyaran | クエリ | 0 | 開始 | SHOW PROCESSLIST |
| 5 | event_scheduler | localhost | NULL | デーモン | 6 | 空のキューを待機中 | NULL |
+----+-----------------+-----------------+----------+--------+------------------------+------------------+
4行セット

イベント スケジューラ スレッドを無効にして停止するには、SET GLOBAL コマンドを実行して event_scheduler の値を OFF に設定します。

グローバルイベントスケジューラを OFF に設定します。

ご存知のとおり、イベントは SQL ステートメントを含む名前付きオブジェクトです。イベントの作成は、他のデータベース オブジェクト (ストアド プロシージャやトリガーなど) の作成と似ています。ただし、ストアド プロシージャは直接呼び出された場合にのみ実行されます。トリガーは、テーブル上のイベント (挿入、更新、削除など) に関連付けられています。イベントが発生すると、イベントは 1 回以上の定期的な間隔で実行できます。それで、イベントはどうですか?次に、CREATE EVENT ステートメントを使用してイベントを作成します。構文構造を見てみましょう。

イベントを作成 [存在しない場合] イベント名
スケジュール通りのスケジュール
する
イベント本体

上記の SQL のパラメータの意味を詳しく見てみましょう。

まず、CREATE EVENT 句の後にイベント名を指定します。イベント名はデータベース スキーマ内で一意である必要があります。

次に、ON SCHEDULE 句の後にテーブルを追加します。イベントが 1 回限りのイベントの場合は、構文 AT timestamp [+ INTERVAL] を使用します。イベントが定期的なイベントの場合は、EVERY 句を使用します。EVERY interval STARTS timestamp [+INTERVAL] ENDS timestamp [+INTERVAL]

3 番目に、DO キーワードの後に​​ DO ステートメントを配置します。ストアド プロシージャはイベント本体内で呼び出すことができることに注意してください。 複合 SQL ステートメントがある場合は、それを BEGIN END ブロック内に配置できます。

デモ用にメッセージ テーブルを作成しましょう。

CREATE TABLE IF NOT EXISTS メッセージ (
  id INT 主キー AUTO_INCREMENT、
  メッセージ VARCHAR(255) NOT NULL、
  created_at 日時 NOT NULL
);

次に、CREATE EVENT ステートメントを使用してイベントを作成しましょう。

存在しない場合はイベントを作成する test_event_01
CURRENT_TIMESTAMP のスケジュールどおり
する
 メッセージに INSERT INTO (メッセージ、created_at)
 VALUES('テストMySQLイベント1',NOW());

メッセージ テーブルを確認すると、レコードが 1 つあることがわかります。これは、イベントが作成時に実行されたことを意味します。

mysql> SELECT * FROM メッセージ;
+----+--------------------+---------------------+
| ID | メッセージ | 作成日時 |
+----+--------------------+---------------------+
| 1 | テスト MySQL イベント 1 | 2017-08-03 04:23:11 |
+----+--------------------+---------------------+
セット内の1行

データベース (testdb) のすべてのイベントを表示するには、次のステートメントを使用します。

testdb からのイベントを表示します。

上記のクエリを実行しても、イベントは期限が切れると自動的に削除されるため、返される行は表示されません。 この場合、これは実行が完了すると期限が切れる 1 回限りのイベントです。この動作を変更するには、ON COMPLETION PRESERVE 句を使用できます。次のステートメントは、作成時刻の 1 分後に実行され、実行後に削除されない別の 1 回限りのイベントを作成します。

イベントの作成 test_event_02
スケジュールどおり、CURRENT_TIMESTAMP + 1分間隔
完了時に保存
する
  メッセージに INSERT INTO (メッセージ、created_at)
  VALUES('テストMySQLイベント2',NOW());

1 分待ってからメッセージ テーブルを確認すると、別のレコードが追加されていることがわかります。

mysql> SELECT * FROM メッセージ;
+----+--------------------+---------------------+
| ID | メッセージ | 作成日時 |
+----+--------------------+---------------------+
| 1 | テスト MySQL イベント 1 | 2017-08-03 04:23:11 |
| 2 | テスト MySQL イベント 2 | 2017-08-03 04:24:48 |
+----+--------------------+---------------------+
2行セット

SHOW EVENTS ステートメントを再度実行すると、イベントが ON COMPLETION PRESERVE 句によるものであることがわかります。

mysql> testdb からのイベントを表示します。
+--------+---------------+----------------+------------+----------+----------+----------------------+----------------+--------+----------+----------------------+----------------------+----------------------+
| Db | 名前 | 定義者 | タイム ゾーン | タイプ | 実行時刻 | 間隔値 | 間隔フィールド | 開始 | 終了 | ステータス | 発信元 | character_set_client | collat​​ion_connection | データベース照合 |
+--------+---------------+----------------+------------+----------+----------+----------------------+----------------+--------+----------+----------------------+----------------------+----------------------+
| testdb | test_event_02 | root@localhost | SYSTEM | ONE TIME | 2017-08-03 04:24:48 | NULL | NULL | NULL | NULL | 無効 | 0 | utf8 | utf8_general_ci | utf8_general_ci |
+--------+---------------+----------------+------------+----------+----------+----------------------+----------------+--------+----------+----------------------+----------------------+----------------------+
セット内の1行

毎分実行され、作成時刻から 1 時間以内に期限が切れる定期的なイベントを作成しましょう。

イベントの作成 test_event_03
スケジュールどおり1分ごとに
開始時刻: CURRENT_TIMESTAMP
終了 CURRENT_TIMESTAMP + 間隔 1 時間
する
  メッセージに INSERT INTO (メッセージ、created_at)
  VALUES('MySQL の定期イベントをテスト',NOW());

イベントの有効期間を定義するには、STARTS 句と ENDS 句を使用することに注意してください。 3 ~ 5 分待ってから、メッセージ テーブル データをチェックして、このループ イベントの実行をテストおよび検証します。

mysql> SELECT * FROM メッセージ;
+----+----------------------------+---------------------+
| ID | メッセージ | 作成日時 |
+----+----------------------------+---------------------+
| 1 | テスト MySQL イベント 1 | 2017-08-03 04:23:11 |
| 2 | テスト MySQL イベント 2 | 2017-08-03 04:24:48 |
| 3 | MySQL 定期イベントのテスト | 2017-08-03 04:25:20 |
| 4 | MySQL 定期イベントのテスト | 2017-08-03 04:26:20 |
| 5 | MySQL 定期イベントのテスト | 2017-08-03 04:27:20 |
+----+----------------------------+---------------------+
5行セット

その後、DROP EVENT ステートメントを使用してイベントを削除できます。構文構造を見てみましょう。

DROP EVENT [存在する場合] event_name;

test_event_03 のイベントを削除するには、次の SQL を使用できます。

存在する場合はイベントを削除します test_event_03;

さて、この記録についてはこれですべてです。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL インデックス操作スキルの概要」、「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL ストアド プロシージャ、トリガー、イベント スケジューラの入門ガイド
  • 初心者から熟練者まで使えるMySQLデータベーストリガー
  • MySQLトリガートリガー例の詳細な説明
  • MySQL トリガーの使用方法と利点と欠点の紹介
  • バックアップと削除のためにリアルタイムでステートメントを検出するMySQLトリガーの考え方の詳細な説明
  • MySQLはイベントを使用してスケジュールされたタスクを完了します
  • MySQL スケジュールタスク (EVENT イベント) を詳細に設定する方法
  • MySQLのイベントスケジューラEVENTを理解する
  • MySQL イベントとトリガーのトピックの絞り込み

<<:  uniapp プロジェクトの最適化方法と提案

>>:  Linux の ufw ファイアウォールの紹介

推薦する

CentOS7 64でのMySQL5.6.40の詳細なインストール手順

CentOS7 64でのMySQL5.6.40のインストール手順1) 以前にインストールしたMySQ...

Docker の 4 つのネットワーク タイプの主な例

4 つのネットワーク タイプ:なし: コンテナのネットワーク機能を一切設定しません。--net=no...

フォーム検証機能を実装するためのネイティブ js

目次開発の際には、機能を段階的に分析して実装することで、明確な考え方を保つことができます。 1. フ...

sysbenchツールによるMySQLデータベースのパフォーマンステストの実装方法

1. 背景Sysbench は、システムのハードウェア パフォーマンスをテストできるストレス テスト...

スクロールバーを非表示にする HTML の簡単な実装

1. 属性付きHTMLタグXML/HTML コードコンテンツをクリップボードにコピー< htm...

vue+el-upload は複数ファイルの動的アップロードを実現します

vue+el-upload 複数ファイルの動的アップロード、参考までに具体的な内容は以下のとおりです...

Vue+webrtc (Tencent Cloud) ライブブロードキャスト機能の実装実践

目次1. 生放送効果2. ライブストリーミングを開始する手順2.1 Tencent Web(高速ライ...

JavaScript での実行コンテキストと実行スタックの例の説明

JavaScript - 原則シリーズ日常の開発では、既存のプロジェクトを引き継ぐときは常に、まず他...

JavaScriptアップロードファイル制限パラメータケースの詳細な説明

プロジェクトシナリオ: 1. アップロードファイルの制限関数: 1. フロントエンド操作による異常な...

HTML におけるブロックコメントの使用に関する詳細な紹介

HTML の一般的なコメント: <!--XXXXXXXX--> (XXXXXXXX はコ...

ランキングを取得するためのMySQLソートの例コード

コードは次のようになります。 SELECT @i:=@i+1 行番号、 if(@total=t.s_...

uniAppエディタWeChatスライド問題について

ユニアプリアプレットはWeChatでも同様のドロップダウン問題を抱えることになる解決策は、app.v...

JavaScriptは行削除機能を備えたテーブルを動的に生成します

この記事の例では、テーブルを動的に生成したり行を削除したりするためのJavaScriptの具体的なコ...

JS の 6 つの継承方法とその長所と短所

目次序文プロトタイプチェーン継承コンストラクタの継承組み合わせ継承(プロトタイプチェーン継承とコンス...

Linux 負荷分散 LVS の詳細な理解

目次1. LVS 負荷分散2. 負荷分散LVSの基本紹介3. LVSアーキテクチャ3.1 ロードバラ...