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

推薦する

マークアップ言語 - テキストの CSS スタイルを指定する

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

DIV共通属性コレクション

1. 物件リストコードをコピーコードは次のとおりです。色: #999999 テキスト色フォントファミ...

MySQL は対応するクライアント プロセスにどのように接続しますか?

質問特定の MySQL 接続について、それがどのクライアント プロセスからのものであるかをどのように...

JavaScript 開発における標準コミットメッセージの重要性の詳細な説明

目次標準コミットメッセージの重要性コミットするコミットリント依存関係をインストールする.commit...

vue-routerフック関数はルーティングガードを実装します

目次概要グローバルフック関数ルーティング固有のフック関数コンポーネント内のフック関数概要ルートガード...

MySQL 外部キー制約とテーブル関係の概要

目次外部キーテーブルの関係を決定する方法テーブル関係を作成する方法1対多の関係 - 従業員テーブルと...

nginx と openssl で https を実装する方法

サーバーデータがSSL証明書を使用して暗号化および認証されていない場合、ユーザーのデータはプレーンテ...

MySQL パスワードに特殊文字が含まれている場合とコマンドラインからログインする場合

サーバーでは、データベースにすばやくログインするために、通常は mysql -hhost -uuse...

Linux (CentOS7) に Tomcat をインストールし、Tomcat をスタートアップ項目として設定します (tomcat8 を例に挙げます)

目次TomcatをインストールするTomcat 圧縮パッケージをダウンロードTomcatには3つの主...

MySQL で distinct メソッドを使用する詳細な例

明確な意味: distinctive は、一意のレコードの数を照会するために使用されます。つまり、d...

MySQL innodb例外の修復に関する経験の共有

テスト用の MySQL ライブラリのセット。以前使用されていたバージョンは、centos6 のデフォ...

JavaScript BOM ロケーション オブジェクト + ナビゲーター オブジェクト + 履歴オブジェクト

目次1. 場所オブジェクト1. URL 2. 場所オブジェクトのプロパティ3. ロケーションオブジェ...

Linuxはデュアルネットワークカードボンドとドライバーインターフェースを使用する

債券とは何かNIC ボンドは、実稼働シナリオでよく使用されるテクノロジーです。複数の NIC を 1...

MySQLデータベース移行におけるデータ文字化けの問題を解決する

リーダーの指示のもと、Java プロジェクトを引き継ぎ、リファクタリングを行う必要がありました。同時...

Linux echo テキスト処理コマンドの使用法と例

Linux ヘルプ ドキュメントでの echo の説明は、Python や Java などのプログラ...