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 ファイアウォールの紹介

推薦する

設計仕様に準拠した設計は良い設計でしょうか?

これまでの数年間、私はいわゆる「設計仕様」についてかなりの数の執筆やコンサルティングを行ってきました...

純粋なCSS3で実装されたネオンライト効果

達成される効果は次のとおりです。 マウスがボタン内に移動すると、ネオンライトのような効果が生成され、...

よく使われる Docker コマンドと例の概要と分析

目次1. コンテナライフサイクル管理(1)ドッカー実行(2)スタート/ストップ/リスタート(3)ドッ...

Vue コンポーネント値転送中のデータ損失の分析と解決

序文前回の記事では、JavaScript の 2 つのデータ型、基本型と参照型、および参照型の浅いコ...

表のセル間隔とセルパディングの違いの詳細な説明

テーブルとは何ですか?セルセルで構成されています。表では、<td> の数は、<tr...

win10 64 ビット システムに複数の JDK バージョンをインストールする際の切り替え問題と解決策の概要

コンピューターにmyeclipse2017とidea2017がインストールされているため、ideaが...

クールな点滅アラームボタンをおすすめします

効果は以下のとおりです。 コードは次のとおりです (クリックすると展開してソース コードが表示されま...

CentOS ベースの OpenStack 環境の展開に関する詳細なチュートリアル (OpenStack のインストール)

エフェクト表示: 環境準備コントローラーノード: 6GB 4時間60GB/30GB/30GB計算ノー...

1 行または複数行のテキストがオーバーフローしたときに省略記号を表示する CSS を実装する方法

1. 単一行オーバーフロー1. 1 行がオーバーフローした場合、超過部分は表示されます...または、...

jsはカスタムドロップダウンボックスを実装します

この記事の例では、カスタムドロップダウンボックスを実装するためのjsの具体的なコードを参考までに共有...

ReactHooks バッチ更新状態とルートパラメータの取得例の分析

目次1. 一括更新の方法コンソール出力2. フックがルーティングパラメータを取得する方法実行効果1....

H5ゲームをnginxサーバーにデプロイする方法の詳細な説明

自己学習型ゲーム開発の道において、最も充実した瞬間は、自分でミニゲームを作り、友達と共有して試しにプ...

Mysqlは日付範囲の抽出方法を指定します

データベースを操作する過程では、いくつかの指標を日付別にまとめたり、一定期間内の合計金額をカウントし...

Linux でファイル内の特定の文字の数を数える方法

ファイル内の文字列の数を数えることは、実際には砂の中の石を探すようなものです。ある人は、石を見た後に...