適用於 MySQL 的 Azure 資料庫中的伺服器參數

適用於: 適用於 MySQL 的 Azure 資料庫 - 單一伺服器

重要

適用於 MySQL 的 Azure 資料庫單一伺服器已位於淘汰路徑上。 強烈建議您升級至適用於 MySQL 的 Azure 資料庫彈性伺服器。 如需移轉至適用於 MySQL 的 Azure 資料庫彈性伺服器的詳細資訊,請參閱 適用於 MySQL 的 Azure 資料庫單一伺服器會發生了什麽狀況?

本文提供在適用於 MySQL 的 Azure 資料庫中設定伺服器參數的考量和指導方針。

什麼是伺服器參數?

MySQL 引擎提供許多不同的伺服器變數和參數,讓您用來設定和調整引擎行為。 有些參數可以在執行階段期間動態設定,而其他參數則是靜態的,並且需要伺服器重新啟動才能套用。

適用於 MySQL 的 Azure 資料庫會使用 Azure 入口網站Azure CLIPowerShell 來公開變更各種 MySQL 伺服器參數值的功能,以達到您的工作負載需求。

可設定的伺服器參數

支援的伺服器參數清單會不斷成長。 在 Azure 入口網站中,使用 [伺服器參數] 索引標籤來檢視完整清單並設定伺服器參數值。

請參閱下列各節,以深入了解數個經常更新的伺服器參數的限制。 這些限制取決於伺服器的定價層和虛擬核心。

執行緒集區

MySQL 通常會為每個用戶端連線指派執行緒。 隨著並行使用者數目的增長,效能會相應下降。 許多作用中執行緒可能會大幅影響效能,因為 CPU 快取的內容切換增加、執行緒爭用,以及不正確的位置。

執行緒集區是一項伺服器端功能,並且與連線共用不同,藉由引進背景工作執行緒的動態集區,將效能最大化。 您可以使用此功能來限制伺服器上執行的作用中執行緒數目,並將執行緒流失降至最低。 這有助於確保連線高載不會造成伺服器用盡資源或記憶體。 執行緒集區對於簡短查詢和 CPU 密集工作負載 (例如 OLTP 工作負載) 最有效率。

如需詳細資訊,請參閱適用於 MySQL 的 Azure 資料庫中的執行緒集區簡介

注意

MySQL 5.6 不支援執行緒集區。

設定執行緒集區

若要啟用執行緒集區,請將 thread_handling 伺服器參數更新為 pool-of-threads。 依預設,此參數會設定為 one-thread-per-connection,這表示 MySQL 會為每個新連線建立新的執行緒。 這是靜態參數,並且需要將伺服器重新啟動。

您也可以藉由設定下列伺服器參數,設定集區中的執行緒數目上限和下限:

  • thread_pool_max_threads: 此值會限制集區中的執行緒數目。
  • thread_pool_min_threads: 此值會設定即使關閉連線之後,仍會保留的執行緒數目。

若要改善執行緒集區上簡短查詢的效能問題,您可以啟用批次執行。 執行緒在執行查詢之後不會立即返回執行緒集區,而是會短暫保持作用中,以等候透過此連線的下一個查詢。 然後執行緒會快速執行查詢,並在完成時,執行緒會等候下一個查詢。 此程序會繼續執行,直到耗費的整體時間超過某個閾值為止。

您可以使用下列伺服器參數來判斷批次執行的行為:

  • thread_pool_batch_wait_timeout:此值會指定執行緒等候另一個查詢處理的時間。
  • thread_pool_batch_max_time:此值會決定執行緒將重複查詢執行週期,並等候下一個查詢的時間上限。

重要

在測試執行緒集區之前,請勿在生產環境中開啟執行緒集區。

log_bin_trust_function_creators

在適用於 MySQL 的 Azure 資料庫中,一律會啟用二進位記錄 (log_bin 參數設定為 ON)。 如果您想要使用觸發程序,您會收到類似下列的錯誤: 您沒有 SUPER 權限且二進位記錄已啟用 (您可能會想使用較不安全的 log_bin_trust_function_creators 變數)

二進位記錄格式一律為 ROW,而對伺服器的所有連線一律會使用以資料列為基礎的二進位記錄。 以資料列為基礎的二進位記錄有助於保有安全性,而且二進位記錄不會中斷,因此您可以安全地將 log_bin_trust_function_creators 設定為 TRUE

innodb_buffer_pool_size

請檢閱 MySQL 文件 \(英文\),以深入了解此參數。

伺服器採用一般用途儲存體 v1 (最多支援 4 TB)

定價層 vCore(s) 預設值 (位元組) 最小值 (位元組) 最大值 (位元組)
基本 1 872415232 134217728 872415232
基本 2 2684354560 134217728 2684354560
一般用途 2 3758096384 134217728 3758096384
一般用途 4 8053063680 134217728 8053063680
一般用途 8 16106127360 134217728 16106127360
一般用途 16 32749125632 134217728 32749125632
一般用途 32 66035122176 134217728 66035122176
一般用途 64 132070244352 134217728 132070244352
記憶體最佳化 2 7516192768 134217728 7516192768
記憶體最佳化 4 16106127360 134217728 16106127360
記憶體最佳化 8 32212254720 134217728 32212254720
記憶體最佳化 16 65498251264 134217728 65498251264
記憶體最佳化 32 132070244352 134217728 132070244352

伺服器採用一般用途儲存體 v2 (最多支援 16 TB)

定價層 vCore(s) 預設值 (位元組) 最小值 (位元組) 最大值 (位元組)
基本 1 872415232 134217728 872415232
基本 2 2684354560 134217728 2684354560
一般用途 2 7516192768 134217728 7516192768
一般用途 4 16106127360 134217728 16106127360
一般用途 8 32212254720 134217728 32212254720
一般用途 16 65498251264 134217728 65498251264
一般用途 32 132070244352 134217728 132070244352
一般用途 64 264140488704 134217728 264140488704
記憶體最佳化 2 15032385536 134217728 15032385536
記憶體最佳化 4 32212254720 134217728 32212254720
記憶體最佳化 8 64424509440 134217728 64424509440
記憶體最佳化 16 130996502528 134217728 130996502528
記憶體最佳化 32 264140488704 134217728 264140488704

innodb_file_per_table

MySQL 會根據在建立資料表期間所提供的設定,將 InnoDB 資料表儲存在不同的資料表空間中。 系統資料表空間InnoDB 資料字典的儲存區域。 file-per-table 資料表空間 包含單一 InnoDB 資料表的資料和索引,且會獨自儲存在檔案系統的資料檔中。

您可以使用 innodb_file_per_table 伺服器參數來控制此行為。 將 innodb_file_per_table 設定為 OFF 會導致 InnoDB 在系統資料表空間中建立資料表。 否則,InnoDB 會在 file-per-table 資料表空間中建立資料表。

注意

您只能在一般用途儲存體 v2一般用途儲存體 v1 的一般用途和記憶體最佳化定價層中更新 innodb_file_per_table

適用於 MySQL 的 Azure 資料庫在一般用途儲存體 v2 上的單一資料檔案中最大支援 4 TB。 如果資料庫大小大於 4 TB,則應該在 innodb_file_per_table 資料表空間中建立資料表。 如果單一資料表大小大於 4 TB,則應該使用分割區資料表。

join_buffer_size

請檢閱 MySQL 文件 \(英文\),以深入了解此參數。

定價層 vCore(s) 預設值 (位元組) 最小值 (位元組) 最大值 (位元組)
基本 1 無法在基本層中設定 N/A N/A
基本 2 無法在基本層中設定 N/A N/A
一般用途 2 262144 128 268435455
一般用途 4 262144 128 536870912
一般用途 8 262144 128 1073741824
一般用途 16 262144 128 2147483648
一般用途 32 262144 128 4294967295
一般用途 64 262144 128 4294967295
記憶體最佳化 2 262144 128 536870912
記憶體最佳化 4 262144 128 1073741824
記憶體最佳化 8 262144 128 2147483648
記憶體最佳化 16 262144 128 4294967295
記憶體最佳化 32 262144 128 4294967295

max_connections

定價層 vCore(s) 預設值 最小值 最大值
基本 1 50 10 50
基本 2 100 10 100
一般用途 2 300 10 600
一般用途 4 625 10 1250
一般用途 8 1250 10 2500
一般用途 16 2500 10 5000
一般用途 32 5000 10 10000
一般用途 64 10000 10 20000
記憶體最佳化 2 625 10 1250
記憶體最佳化 4 1250 10 2500
記憶體最佳化 8 2500 10 5000
記憶體最佳化 16 5000 10 10000
記憶體最佳化 32 10000 10 20000

當連線數目超過限制時,您可能會收到錯誤。

提示

若要有效率地管理連線,最好使用連線共用器,例如 ProxySQL。 若要了解如何設定 ProxySQL,請參閱部落格文章在適用於 MySQL 的 Azure 資料庫中使用 ProxySQL 負載平衡讀取複本。 請注意,ProxySQL 是開放原始碼社群工具。 Microsoft 會盡力提供支援。

max_heap_table_size

請檢閱 MySQL 文件 \(英文\),以深入了解此參數。

定價層 vCore(s) 預設值 (位元組) 最小值 (位元組) 最大值 (位元組)
基本 1 無法在基本層中設定 N/A N/A
基本 2 無法在基本層中設定 N/A N/A
一般用途 2 16777216 16384 268435455
一般用途 4 16777216 16384 536870912
一般用途 8 16777216 16384 1073741824
一般用途 16 16777216 16384 2147483648
一般用途 32 16777216 16384 4294967295
一般用途 64 16777216 16384 4294967295
記憶體最佳化 2 16777216 16384 536870912
記憶體最佳化 4 16777216 16384 1073741824
記憶體最佳化 8 16777216 16384 2147483648
記憶體最佳化 16 16777216 16384 4294967295
記憶體最佳化 32 16777216 16384 4294967295

query_cache_size

查詢快取依預設為關閉。 若要啟用查詢快取,請設定 query_cache_type 參數。

請檢閱 MySQL 文件 \(英文\),以深入了解此參數。

注意

查詢快取從 MySQL 5.7.20 開始就已取代,且已在 MySQL 8.0 中移除。

定價層 vCore(s) 預設值 (位元組) 最小值 (位元組) 最大值
基本 1 無法在基本層中設定 N/A N/A
基本 2 無法在基本層中設定 N/A N/A
一般用途 2 0 0 16777216
一般用途 4 0 0 33554432
一般用途 8 0 0 67108864
一般用途 16 0 0 134217728
一般用途 32 0 0 134217728
一般用途 64 0 0 134217728
記憶體最佳化 2 0 0 33554432
記憶體最佳化 4 0 0 67108864
記憶體最佳化 8 0 0 134217728
記憶體最佳化 16 0 0 134217728
記憶體最佳化 32 0 0 134217728

lower_case_table_names

lower_case_table_name 參數預設設定為 1,您可以在 MySQL 5.6 和 MySQL 5.7 中更新此參數。

請檢閱 MySQL 文件 \(英文\),以深入了解此參數。

注意

在 MySQL 8.0 中,lower_case_table_name 預設設定為 1,而且您無法變更它。

innodb_strict_mode

如果您收到類似 Row size too large (> 8126) 的錯誤,請考慮關閉 innodb_strict_mode 參數。 您無法在伺服器層級全域修改 innodb_strict_mode。 如果資料列資料大小大於 8K,則會截斷資料,而不會發生錯誤通知,導致潛在的資料遺失。 最好修改結構描述以符合頁面大小限制。

您可以使用 init_connect 在工作階段層級設定此參數。 若要在工作階段層級設定 innodb_strict_mode,請參閱設定參數未列出

注意

如果您有讀取複本伺服器,在來源伺服器上的工作階段層級將 innodb_strict_mode 設定為 OFF 會中斷複寫。 如果您有讀取複本,建議您將參數保持設定為 ON

sort_buffer_size

請檢閱 MySQL 文件 \(英文\),以深入了解此參數。

定價層 vCore(s) 預設值 (位元組) 最小值 (位元組) 最大值 (位元組)
基本 1 無法在基本層中設定 N/A N/A
基本 2 無法在基本層中設定 N/A N/A
一般用途 2 524288 32768 4194304
一般用途 4 524288 32768 8388608
一般用途 8 524288 32768 16777216
一般用途 16 524288 32768 33554432
一般用途 32 524288 32768 33554432
一般用途 64 524288 32768 33554432
記憶體最佳化 2 524288 32768 8388608
記憶體最佳化 4 524288 32768 16777216
記憶體最佳化 8 524288 32768 33554432
記憶體最佳化 16 524288 32768 33554432
記憶體最佳化 32 524288 32768 33554432

tmp_table_size

請檢閱 MySQL 文件 \(英文\),以深入了解此參數。

定價層 vCore(s) 預設值 (位元組) 最小值 (位元組) 最大值 (位元組)
基本 1 無法在基本層中設定 N/A N/A
基本 2 無法在基本層中設定 N/A N/A
一般用途 2 16777216 1024 67108864
一般用途 4 16777216 1024 134217728
一般用途 8 16777216 1024 268435456
一般用途 16 16777216 1024 536870912
一般用途 32 16777216 1024 1073741824
一般用途 64 16777216 1024 1073741824
記憶體最佳化 2 16777216 1024 134217728
記憶體最佳化 4 16777216 1024 268435456
記憶體最佳化 8 16777216 1024 536870912
記憶體最佳化 16 16777216 1024 1073741824
記憶體最佳化 32 16777216 1024 1073741824

InnoDB 緩衝集區暖機

重新啟動適用於 MySQL 的 Azure 資料庫之後,會載入磁碟中的資料頁,因為會查詢資料表。 這會導致第一次執行查詢的延遲和效能變慢。 對於對延遲敏感的工作負載,您可能會覺得這樣的效能變慢無法接受。

您可以使用 InnoDB 緩衝集區暖機來縮短暖機期間。 此程序會在重新啟動之前重新載入緩衝集區中的磁碟頁面,而不是等候 DML 或 SELECT 作業來存取對應的資料列。 如需詳細資訊,請參閱 InnoDB 緩衝集區伺服器參數

但是,改善的效能需要花費伺服器較長的啟動時間。 啟用此參數時,伺服器啟動和重新啟動時間應該會根據伺服器上佈建的 IOPS 而增加。 最好測試和監視重新啟動時間,以確保啟動或重新啟動效能可接受,因為伺服器在該時間無法使用。 佈建的 IOPS 小於 1000 IOPS 時 (換句話說,佈建的儲存體小於 335 GB),請勿使用此參數。

若要在伺服器關機時儲存緩衝集區的狀態,請將伺服器參數 innodb_buffer_pool_dump_at_shutdown 設定為 ON。 同樣地,請將伺服器參數 innodb_buffer_pool_load_at_startup 設定為 ON,以在伺服器啟動時還原緩衝集區狀態。 您可以降低和微調伺服器參數 innodb_buffer_pool_dump_pct 的值,來控制對啟動或重新啟動時間的影響。 根據預設,此參數設定為 25

注意

InnoDB 緩衝集區暖機參數僅在最多 16 TB 儲存體的一般用途儲存體伺服器中支援。 如需詳細資訊,請參閱適用於 MySQL 的 Azure 資料庫儲存體選項

time_zone

初始部署時,執行適用於 MySQL 的 Azure 資料庫的伺服器會包含時區資訊的系統資料表,但不會填入這些資料表。 您可以從 MySQL 命令列或 MySQL Workbench 等工具呼叫 mysql.az_load_timezone 預存程序,以填入資料表。 如需如何呼叫預存程序並設定全域或工作階段層級時區的資訊,請參閱使用時區參數 (Azure 入口網站)使用時區參數 (Azure CLI)

binlog_expire_logs_seconds

在適用於 MySQL 的 Azure 資料庫中,此參數會指定服務在清除二進位記錄檔之前等候的秒數。

二進位記錄檔包含描述資料庫變更的事件,例如資料表建立作業或對資料表資料的變更。 它也包含可能會進行變更的陳述式的事件。 二進位記錄檔主要用於兩個用途:複寫和資料復原作業。

一般而言,只要控制代碼沒有服務、備份或複本集,就會清除二進位記錄檔。 如果有多個複本,二進位記錄檔會等候最慢的複本讀取變更,然後再清除。 如果您想要讓二進位記錄檔保存較長的時間,您可以設定 binlog_expire_logs_seconds 參數。 如果您將 binlog_expire_logs_seconds 設定為 0,這是預設值,則會在釋放二進位記錄檔的控制代碼時立即清除。 如果您將 binlog_expire_logs_seconds 設定為大於 0,則二進位記錄檔只會在該期間之後清除。

針對適用於 MySQL 的 Azure 資料庫,備份和讀取二進位檔案的複本清除等受控功能會在內部處理。 從適用於 MySQL 的 Azure 資料庫服務複寫資料時,必須在主要複本中設定此參數,以避免在複本從主要複本讀取變更之前清除二進位記錄檔。 如果您將 binlog_expire_logs_seconds 設定為較高的值,則二進位記錄檔不會很快被清除。 這可能會導致儲存體計費增加。

event_scheduler

在適用於 MySQL 的 Azure 資料庫中,event_schedule 伺服器參數會管理建立、排程和執行事件,也就是根據排程執行的工作,並由特殊事件排程器執行緒執行。 當 event_scheduler 參數設定為 [開啟] 時,事件排程器執行緒會在 SHOW PROCESSLIST 的輸出中列為精靈程序。 您可以使用下列 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 文件:

設定 event_scheduler 伺服器參數

下列案例會說明在適用於 MySQL 的 Azure 資料庫中使用 event_scheduler 參數的一種方式。 若要示範案例,請考慮下列範例,簡單的資料表:

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)

若要在適用於 MySQL 的 Azure 資料庫中設定 event_scheduler 伺服器參數,請執行下列步驟:

  1. 在 Azure 入口網站中,瀏覽至您的伺服器,然後在 [設定] 底下選取 [伺服器參數]

  2. [伺服器參數] 刀鋒視窗上,搜尋 event_scheduler,在 [VALUE] 下拉式清單中,選取 [ON],然後選取 [儲存]

    注意

    動態伺服器參數設定變更將會部署,而不會重新啟動。

  3. 然後,若要建立事件,連線到 MySQL 伺服器,然後執行下列 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());
    
  4. 若要檢視 Event Scheduler 詳細資料,請執行下列 SQL 陳述式:

    SHOW EVENTS;
    

    會出現下列輸出:

    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)
    
  5. 幾分鐘後,查詢資料表中的資料列,以根據您設定的 event_scheduler 參數,開始檢視每分鐘插入的資料列:

    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)
    
  6. 一小時後,在資料表上執行 Select 陳述式,以檢視在案例中設定 event_scheduler 時,每分鐘插入資料表之值的完整結果。

    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)
    

其他案例

您可以根據特定案例的需求來設定事件。 排程 SQL 陳述式以不同時間間隔執行的一些類似範例如下。

立即執行 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>;

每小時執行 SQL 陳述式,沒有結束時間

CREATE EVENT <event name>
ON SCHEDULE
EVERY 1 HOUR
COMMENT 'Comment'
DO
<your statement>;

每天執行 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>;

無法設定的伺服器參數

下列伺服器參數無法在服務中設定:

參數 固定值
innodb_file_per_table 在基本層中 OFF
innodb_flush_log_at_trx_commit 1
sync_binlog 1
innodb_log_file_size 256 MB
innodb_log_files_in_group 2

此處未列出的其他變數會設定為預設的 MySQL 值。 請參閱版本 8.05.75.6 的 MySQL 文件。

下一步