Azure Database for MySQL - フレキシブル サーバーのサーバー パラメーター
この記事では、Azure Database for MySQL - フレキシブル サーバーでサーバー パラメーターを構成するための考慮事項とガイドラインを示します。
Note
この記事には、Microsoft では現在使用されていなくなった "スレーブ" という用語への言及が含まれています。 ソフトウェアからこの用語が削除された時点で、この記事から削除します。
サーバー パラメーターとは
MySQL エンジンには、エンジンの動作を構成および調整するために使用する、さまざまなサーバー パラメーター ("変数" とも呼ばれます) が用意されています。 一部のパラメーターは、実行時に動的に設定できます。 一方で静的なパラメーターもあり、それらは設定後にサーバーを再起動する必要があります。
Azure Database for MySQL - フレキシブル サーバーでは、「Azure portal を使用して Azure Database for MySQL - フレキシブル サーバーのサーバー パラメーターを構成する」および「Azure CLI を使用して Azure Database for MySQL - フレキシブル サーバーのサーバー パラメーターを構成する」を使用して、さまざまな MySQL のサーバー パラメーターを変更し、ワークロードのニーズに合うようにできます。
構成可能なサーバー パラメーター
サーバー パラメーターを使用して Azure Database for MySQL フレキシブル サーバーの構成を管理できます。 このサーバー パラメーターは、サーバーの作成時に既定値と推奨値を使用して構成されます。 Azure portal の [サーバー パラメーター] ペインには、変更可能および変更不可の両方のパラメーターが表示されます。 変更不可のサーバー パラメーターは選択できません。
サポートされるサーバー パラメーターの一覧は、拡大を続けています。 Azure portal を使用して、サーバー パラメーターの完全な一覧を定期的に表示し、値を構成できます。
ポータルを使用して静的サーバー パラメーターを変更する場合、変更を有効にするためにサーバーを再起動する必要があります。 Azure Resource Manager テンプレート、Terraform、Azure CLI などのツールを使用して自動化スクリプトを使用する場合、作成エクスペリエンスの一部として構成を変更する場合でも、設定を有効にするためにサービスを再起動するプロビジョニングをスクリプトに含める必要があります。
お使いの環境に合わせて変更不可のサーバー パラメーターを変更する場合は、コミュニティ フィードバックからアイデアを投稿するか、フィードバックが既に存在する場合は投票してください。これは Microsoft が優先順位を付けるのに役立ちます。
以降のセクションでは、一般的に更新されるサーバー パラメーターの制限について説明します。 制限は、サーバーのコンピューティング レベルとサイズ (仮想コア) によって決まります。
lower_case_table_names
MySQL バージョン 5.7 の場合、Azure Database for MySQL - フレキシブル サーバーでは、lower_case_table_names
の既定値は 1
です。 サポートされている値を 2
に変更することはできますが、2
から 1
に戻すことはできません。 既定値の変更については、サポート チケットを作成してください。
MySQL バージョン 8.0 以降では、サーバーを初期化する場合にのみ lower_case_table_names
を構成できます。 詳細情報。 サーバーの初期化後に lower_case_table_names
設定を変更することは禁止されています。
Azure Database for MySQL - フレキシブル サーバーでは、MySQL バージョン 8.0 でサポートされている値は 1
と 2
です。 既定値は 1
です。 サーバー作成時の既定値の変更については、サポート チケットを作成してください。
innodb_tmpdir
Azure Database for MySQL - フレキシブル サーバーの innodb_tmpdir パラメーターを使用して、再構築するオンライン ALTER TABLE
操作中に作成された一時的な並べ替えファイルのディレクトリを定義します。
innodb_tmpdir
の既定値は /mnt/temp
です。 この場所は一時ストレージ SSD に対応し、各サーバーのコンピューティング サイズ (ギガバイト単位 (GiB)) で使用できます。 この場所は、大量の領域を必要としない操作に最適です。
より多くの領域が必要な場合は、innodb_tmpdir
を /app/work/tmpdir
に設定できます。 この設定では、Azure Database for MySQL フレキシブル サーバーで使用可能なストレージ容量を利用します。 この設定は、より多くの一時ストレージを必要とする大規模な操作に役立ちます。
/app/work/tmpdir
を使用すると、既定の一時ストレージ (SSD) の /mnt/temp
値と比較してパフォーマンスが低下するのでご注意ください。 操作の特定の要件に基づいて選択してください。
innodb_tmpdir
に対して提供される情報は、パラメーター innodb_temp_tablespaces_dir、tmpdir、および slave_load_tmpdir に適用できます。
- 既定値
/mnt/temp
は共通です。 - 代替ディレクトリ
/app/work/tmpdir
は、一時ストレージの増加を構成するために使用でき、特定の運用要件に基づくパフォーマンスのトレードオフがあります。
log_bin_trust_function_creators
Azure Database for MySQL - フレキシブル サーバーの場合、バイナリ ログは常に有効になっています (つまり、log_bin
が ON
に設定されています)。 log_bin_trust_function_creators
パラメーターは、フレキシブル サーバーでは既定で ON
に設定されます。
バイナリ ログ形式は常にROW
であり、サーバーへの接続では常に行ベースのバイナリ ログが使用されます。 行ベースのバイナリ ログを使用すると、セキュリティ上の問題が存在せず、バイナリ ログを中断できないため、安全に log_bin_trust_function_creators
を ON
のままにしておくことができます。
log_bin_trust_function_creators
が OFF
に設定されている場合、トリガーの作成を試みると、"SUPER 特権を持っておらず、バイナリ ログが有効になっています (より安全度の低い log_bin_trust_function_creators
変数を使用することもできます)" のようなエラーが表示されます。
innodb_buffer_pool_size
innodb_buffer_pool_size
パラメーターの詳細については、MySQL のドキュメントを参照してください。
次の表の物理メモリ サイズは、Azure Database for MySQL フレキシブル サーバーで使用可能なランダム アクセス メモリ (RAM) をギガバイト (GB) 単位で表したものです。
価格レベル | 仮想コア | 物理メモリ サイズ (GB) | 既定値 (バイト) | 最小値 (バイト) | 最大値 (バイト) |
---|---|---|---|---|---|
バースト可能 (B1s) | 1 | 1 | 134217728 | 33554432 | 268435456 |
バースト可能 (B1ms) | 1 | 2 | 536870912 | 134217728 | 1073741824 |
バースト可能 (B2s) | 2 | 4 | 2147483648 | 134217728 | 2147483648 |
バースト可能 (B2ms) | 2 | 8 | 4294967296 | 134217728 | 5368709120 |
バースト可能 | 4 | 16 | 12884901888 | 134217728 | 12884901888 |
バースト可能 | 8 | 32 | 25769803776 | 134217728 | 25769803776 |
バースト可能 | 12 | 48 | 51539607552 | 134217728 | 51539607552 |
バースト可能 | 16 | 64 | 2147483648 | 134217728 | 2147483648 |
バースト可能 | 20 | 80 | 64424509440 | 134217728 | 64424509440 |
汎用 | 2 | 8 | 4294967296 | 134217728 | 5368709120 |
General Purpose | 4 | 16 | 12884901888 | 134217728 | 12884901888 |
General Purpose | 8 | 32 | 25769803776 | 134217728 | 25769803776 |
General Purpose | 16 | 64 | 51539607552 | 134217728 | 51539607552 |
General Purpose | 32 | 128 | 103079215104 | 134217728 | 103079215104 |
General Purpose | 48 | 192 | 154618822656 | 134217728 | 154618822656 |
General Purpose | 64 | 256 | 206158430208 | 134217728 | 206158430208 |
Business Critical | 2 | 16 | 12884901888 | 134217728 | 12884901888 |
Business Critical | 4 | 32 | 25769803776 | 134217728 | 25769803776 |
Business Critical | 8 | 64 | 51539607552 | 134217728 | 51539607552 |
Business Critical | 16 | 128 | 103079215104 | 134217728 | 103079215104 |
Business Critical | 20 | 160 | 128849018880 | 134217728 | 128849018880 |
Business Critical | 32 | 256 | 206158430208 | 134217728 | 206158430208 |
Business Critical | 48 | 384 | 309237645312 | 134217728 | 309237645312 |
Business Critical | 64 | 504 | 405874409472 | 134217728 | 405874409472 |
innodb_file_per_table
MySQL では、テーブルの作成時に指定した構成に基づいて、InnoDB テーブルが異なるテーブルスペースに格納されます。 システム テーブルスペースは、InnoDB データ辞書のストレージ領域です。 file-per-table テーブルスペースは、1 つの InnoDB テーブルに対するデータとインデックスを含み、固有のデータ ファイル内のファイル システムに格納されています。 innodb_file_per_table サーバー パラメーターは、この動作を制御します。
innodb_file_per_table
を OFF
に設定すると、InnoDB ではシステム テーブルスペースにテーブルが作成されます。 それ以外の場合、InnoDB では file-per-table テーブルスペースにテーブルが作成されます。
Azure Database for MySQL - フレキシブル サーバーは、1 つのデータ ファイル内で、最大 8 テラバイト (TB) までをサポートしています。 データベースのサイズが 8 TB を超える場合は、innodb_file_per_table
テーブルスペースにテーブルを作成する必要があります。 1 つのテーブル サイズが 8 TB を超える場合は、パーティション テーブルを使用する必要があります。
innodb_log_file_size
innodb_log_file_size の値は、ログ グループ内の各ログ ファイルのサイズ (バイト単位) です。 ログ ファイルの合計サイズ (innodb_log_file_size * innodb_log_files_in_group) は、最大値 (512 GB 弱) を超えることはできません。
ログ ファイルのサイズを大きくすると、パフォーマンスが向上しますが、クラッシュ後の復旧時間が長くなるという欠点があります。 まれに発生するクラッシュ後の復旧時間と、ピーク操作中のスループットの最大化との間でバランスを取る必要があります。 ログ ファイルのサイズを大きくすると、再起動時間が長くなることもあります。
Azure Database for MySQL - フレキシブル サーバーでは、innodb_log_size
を 256 メガバイト (MB)、512 MB、1 GB、2 GB のいずれかの値に構成できます。 このパラメーターは静的であり、再起動が必要です。
Note
innodb_log_file_size
パラメーターを既定値から変更した場合は、再起動の遅延を回避するために、show global status like 'innodb_buffer_pool_pages_dirty'
の値が 30 秒間 0
にとどまっているかどうかを確認します。
max_connections
サーバーのメモリ サイズによって max_connections
の値が決まります。 次の表の物理メモリ サイズは、Azure Database for MySQL フレキシブル サーバーで使用可能な RAM をギガバイト単位で表したものです。
価格レベル | 仮想コア | 物理メモリ サイズ (GB) | 規定値 | 最小値 | 最大値 |
---|---|---|---|---|---|
バースト可能 (B1s) | 1 | 1 | 85 | 10 | 171 |
バースト可能 (B1ms) | 1 | 2 | 171 | 10 | 341 |
バースト可能 (B2s) | 2 | 4 | 341 | 10 | 683 |
バースト可能 (B2ms) | 2 | 4 | 683 | 10 | 1365 |
バースト可能 | 4 | 16 | 1365 | 10 | 2731 |
バースト可能 | 8 | 32 | 2731 | 10 | 5461 |
バースト可能 | 12 | 48 | 4097 | 10 | 8193 |
バースト可能 | 16 | 64 | 5461 | 10 | 10923 |
バースト可能 | 20 | 80 | 6827 | 10 | 13653 |
汎用 | 2 | 8 | 683 | 10 | 1365 |
General Purpose | 4 | 16 | 1365 | 10 | 2731 |
General Purpose | 8 | 32 | 2731 | 10 | 5461 |
General Purpose | 16 | 64 | 5461 | 10 | 10923 |
General Purpose | 32 | 128 | 10923 | 10 | 21845 |
General Purpose | 48 | 192 | 16384 | 10 | 32768 |
General Purpose | 64 | 256 | 21845 | 10 | 43691 |
Business Critical | 2 | 16 | 1365 | 10 | 2731 |
Business Critical | 4 | 32 | 2731 | 10 | 5461 |
Business Critical | 8 | 64 | 5461 | 10 | 10923 |
Business Critical | 16 | 128 | 10923 | 10 | 21845 |
Business Critical | 20 | 160 | 13653 | 10 | 27306 |
Business Critical | 32 | 256 | 21845 | 10 | 43691 |
Business Critical | 48 | 384 | 32768 | 10 | 65536 |
Business Critical | 64 | 504 | 43008 | 10 | 86016 |
接続数が制限を超えると、"エラー 1040 (08004): 接続が多すぎます" というエラーが表示される場合があります。
新しいクライアント接続を MySQL に作成すると、時間がかかります。 これらの接続を確立すると、アイドル状態であっても、データベース リソースが占有されます。 ほとんどのアプリケーションでは、短時間の接続を多数要求します。これにより、この状況が悪化します。 結果として、実際のワークロードに使用できるリソースが少なくなるため、パフォーマンスが低下します。
アイドル状態の接続を減らして既存の接続を再利用する接続プーラーは、この問題を回避するのに役立ちます。 最適なエクスペリエンスを得るために、ProxySQL のような接続プーラーを使用して、接続を効率的に管理することをお勧めします。 ProxySQL の設定については、ブログ投稿を参照してください。
Note
ProxySQL はオープンソースのコミュニティ ツールです。 Microsoft は、ベスト エフォート方式でサポートします。 信頼のあるガイダンスでの運用サポートを受けるには、ProxySQL 製品サポートにお問い合わせください。
innodb_strict_mode
"行のサイズが大きすぎます (> 8126)" などのエラーが表示された場合は、innodb_strict_mode
サーバー パラメーターをオフにすることができます。 このパラメーターをサーバー レベルでグローバルに変更することはできません。行データのサイズが 8K を超える場合、エラーが表示されずにデータが切り捨てられるためです。 この切り捨てによって、データが失われる可能性があります。 ページ サイズの制限に合うようにスキーマを変更することをお勧めします。
このパラメーターは、init_connect
を使用してセッション レベルで設定できます。 詳細については、変更不可のサーバー パラメーターの設定に関する記事を参照してください。
Note
読み取りレプリカ サーバーがある場合、ソース サーバーのセッション レベルで innodb_strict_mode
を OFF
に設定すると、レプリケーションが中断されます。 読み取りレプリカがある場合、このパラメーターは ON
に設定したままにすることをお勧めします。
time_zone
初期デプロイの時点で、Azure Database for MySQL - フレキシブル サーバー インスタンスにはタイム ゾーン情報のシステム テーブルが含まれていますが、これらのテーブルには値が設定されていません。 タイム ゾーン テーブルには、MySQL コマンド ラインや MySQL Workbench などのツールから mysql.az_load_timezone
ストアド プロシージャを呼び出すことでデータを入力できます。 Azure portal または Azure CLI を使用して、ストアド プロシージャを呼び出し、グローバル レベルまたはセッション レベルのタイム ゾーンを設定できます。
binlog_expire_logs_seconds
Azure Database for MySQL - フレキシブル サーバーでは、binlog_expire_logs_seconds
パラメーターは、サービスがバイナリ ログ ファイルを削除するまでに待機する秒数を指定します。
"バイナリ ログ" には、テーブルの作成操作やテーブル データの変更など、データベースの変更を示すイベントが含まれます。 バイナリ ログには、変更を加えた可能性のあるステートメントのイベントも含まれます。 バイナリ ログは、主にレプリケーション操作とデータの復旧操作の 2 つの目的で使用されます。
通常、バイナリ ログは、ハンドルがサービス、バックアップ、またはレプリカ セットから解放されるとすぐに削除されます。 レプリカが複数ある場合、バイナリ ログは、最も遅いレプリカが変更を読み取るまで待機してから削除されます。
バイナリ ログを長く保持する場合は、binlog_expire_logs_seconds
パラメーターを構成できます。 binlog_expire_logs_seconds
が既定値の 0
に設定されている場合、バイナリ ログは、そのハンドルが解放されるとただちに削除されます。 binlog_expire_logs_seconds
の値が 0
より大きい場合、バイナリ ログは構成された秒数後に削除されます。
Azure Database for MySQL - フレキシブル サーバーは、バイナリ ファイルのバックアップや読み取りレプリカの削除などのマネージド機能を内部で処理します。 Azure Database for MySQL - フレキシブル サーバーからデータ出力をレプリケートする場合は、レプリカがプライマリの変更内容を読み取る前にバイナリ ログが削除されるのを防ぐために、プライマリでこのパラメーターを設定する必要があります。 binlog_expire_logs_seconds
を大きい値に設定すると、バイナリ ログはすぐには削除されなくなります。 それにより、ストレージの課金が増加する場合があります。
event_scheduler
Azure Database for MySQL - フレキシブル サーバーでは、event_scheduler
サーバー パラメーターによって、イベントの作成、スケジュール設定、実行が管理されます。 つまり、パラメーターは、特別な MySQL イベントスケジューラ スレッドによってスケジュールに従って実行されるタスクを管理します。 event_scheduler
パラメーターが ON
に設定されている場合、イベントスケジューラ スレッドは SHOW PROCESSLIST
の出力にデーモン プロセスとして一覧表示されます。
event_scheduler - MySQL バージョン 5.7 サーバーの場合、バックアップが開始されると、サーバー パラメーター event_scheduler
は自動的に 'OFF' になり、バックアップが正常に完了した後、サーバー パラメーター event_scheduler
は 'ON' に戻ります。 Azure Database for MySQL - フレキシブル サーバーの MySQL バージョン 8.0 では、event_scheduler はバックアップ中に影響を受けません。 よりスムーズな操作を実現するために、メジャー バージョンのアップグレードを使用して、MySQL 5.7 サーバーをバージョン 8.0 にアップグレードすることをお勧めします。
次の SQL 構文を使用して、イベントを作成およびスケジュール設定できます。
CREATE EVENT <event name>
ON SCHEDULE EVERY _ MINUTE / HOUR / DAY
STARTS TIMESTAMP / CURRENT_TIMESTAMP
ENDS TIMESTAMP / CURRENT_TIMESTAMP + INTERVAL 1 MINUTE / HOUR / DAY
COMMENT '<comment>'
DO
<your statement>;
イベントの作成の詳細については、MySQL リファレンス マニュアルのイベントスケジューラに関する以下のドキュメントを参照してください。
event_scheduler サーバー パラメーターの構成
次のシナリオは、Azure Database for MySQL - フレキシブル サーバーで event_scheduler
パラメーターを使用する 1 つの方法を示しています。
シナリオを説明するために、次の単純なテーブルの例を考えてみましょう。
mysql> describe tab1;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
| +-----------+-------------+------+-----+---------+----------------+ |
| id | int(11) | NO | PRI | NULL | auto_increment |
| CreatedAt | timestamp | YES | | NULL | |
| CreatedBy | varchar(16) | YES | | NULL | |
| +-----------+-------------+------+-----+---------+----------------+ |
| 3 rows in set (0.23 sec) |
| ``` |
| To configure the `event_scheduler` server parameter in Azure Database for MySQL - Flexible Server, perform the following steps: |
1. In the Azure portal, go to your Azure Database for MySQL - Flexible Server instance. Under **Settings**, select **Server parameters**.
1. On the **Server parameters** pane, search for `event_scheduler`. In the **VALUE** dropdown list, select **ON**, and then select **Save**.
> [!NOTE]
> Deployment of the dynamic configuration change to the server parameter doesn't require a restart.
1. To create an event, connect to the Azure Database for MySQL - Flexible Server instance and run the following SQL command:
```sql
CREATE EVENT test_event_01
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
COMMENT 'Inserting record into the table tab1 with current timestamp'
DO
INSERT INTO tab1(id,createdAt,createdBy)
VALUES('',NOW(),CURRENT_USER());
```
1. To view the Event Scheduler details, run the following SQL statement:
```sql
SHOW EVENTS;
```
The following output appears:
```sql
mysql> show events;
+-----+---------------+-------------+-----------+-----------+------------+----------------+----------------+---------------------+---------------------+---------+------------+----------------------+----------------------+--------------------+
| Db | Name | Definer | Time zone | Type | Execute at | Interval value | Interval field | Starts | Ends | Status | Originator | character_set_client | collation_connection | Database Collation |
| +-----+---------------+-------------+-----------+-----------+------------+----------------+----------------+---------------------+---------------------+---------+------------+----------------------+----------------------+--------------------+ |
| db1 | test_event_01 | azureuser@% | SYSTEM | RECURRING | NULL | 1 | MINUTE | 2023-04-05 14:47:04 | 2023-04-05 15:47:04 | ENABLED | 3221153808 | latin1 | latin1_swedish_ci | latin1_swedish_ci |
| +-----+---------------+-------------+-----------+-----------+------------+----------------+----------------+---------------------+---------------------+---------+------------+----------------------+----------------------+--------------------+ |
| 1 row in set (0.23 sec) |
| ``` |
1. After a few minutes, query the rows from the table to begin viewing the rows inserted every minute according to the `event_scheduler` parameter that you configured:
```azurecli
mysql> select * from tab1;
+----+---------------------+-------------+
| id | CreatedAt | CreatedBy |
| +----+---------------------+-------------+ |
| 1 | 2023-04-05 14:47:04 | azureuser@% |
| 2 | 2023-04-05 14:48:04 | azureuser@% |
| 3 | 2023-04-05 14:49:04 | azureuser@% |
| 4 | 2023-04-05 14:50:04 | azureuser@% |
| +----+---------------------+-------------+ |
| 4 rows in set (0.23 sec) |
| ``` |
| 1. After an hour, run a `select` statement on the table to view the complete result of the values inserted into table every minute for an hour (as `event_scheduler` is configured in this case): |
```azurecli
mysql> select * from tab1;
+----+---------------------+-------------+
| id | CreatedAt | CreatedBy |
| +----+---------------------+-------------+ |
| 1 | 2023-04-05 14:47:04 | azureuser@% |
| 2 | 2023-04-05 14:48:04 | azureuser@% |
| 3 | 2023-04-05 14:49:04 | azureuser@% |
| 4 | 2023-04-05 14:50:04 | azureuser@% |
| 5 | 2023-04-05 14:51:04 | azureuser@% |
| 6 | 2023-04-05 14:52:04 | azureuser@% |
| ..< 50 lines trimmed to compact output >.. |
| 56 | 2023-04-05 15:42:04 | azureuser@% |
| 57 | 2023-04-05 15:43:04 | azureuser@% |
| 58 | 2023-04-05 15:44:04 | azureuser@% |
| 59 | 2023-04-05 15:45:04 | azureuser@% |
| 60 | 2023-04-05 15:46:04 | azureuser@% |
| 61 | 2023-04-05 15:47:04 | azureuser@% |
| +----+---------------------+-------------+ |
| 61 rows in set (0.23 sec) |
| ``` |
#### Other scenarios
You can set up an event based on the requirements of your specific scenario. A few examples of scheduling SQL statements to run at various time intervals follow.
To run a SQL statement now and repeat one time per day with no end:
```sql
CREATE EVENT <event name>
ON SCHEDULE
EVERY 1 DAY
STARTS (TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR)
COMMENT 'Comment'
DO
<your statement>;
1 時間ごとに SQL ステートメントを実行し、終了時間は設定しません。
CREATE EVENT <event name>
ON SCHEDULE
EVERY 1 HOUR
COMMENT 'Comment'
DO
<your statement>;
1 日ごとに SQL ステートメントを実行し、終了時間は設定しません。
CREATE EVENT <event name>
ON SCHEDULE
EVERY 1 DAY
STARTS str_to_date( date_format(now(), '%Y%m%d 0200'), '%Y%m%d %H%i' ) + INTERVAL 1 DAY
COMMENT 'Comment'
DO
<your statement>;
制限事項
高可用性が構成されているサーバーの場合、フェールオーバーが発生すると、event_scheduler
サーバー パラメーターが OFF
に設定される可能性があります。 これが発生した場合は、フェールオーバーが完了したら、パラメーターを構成して値を ON
に設定します。
変更不可のサーバー パラメーター
Azure portal の [サーバー パラメーター] ペインには、変更可能および変更不可のサーバー パラメーターの両方が表示されます。 変更不可のサーバー パラメーターは選択できません。 Azure portal または Azure CLI で init_connect
を使用し、セッション レベルで変更不可のサーバー パラメーターを構成できます。