

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Aurora MySQL 第 3 版與 MySQL 8.0 相容
<a name="AuroraMySQL.MySQL80"></a>

 您可以使用 Aurora MySQL 第 3 版，取得與 MySQL 相容的最新功能、效能增強功能和錯誤修正。你可以在下文了解 Aurora MySQL 第 3 版，與 MySQL 8.0 的相容性。您可以了解如何將叢集和應用程式升級至 Aurora MySQL 第 3 版。

 一些 Aurora 功能，例如 Aurora Serverless v2, 需要 Aurora MySQL 第 3 版。

**Topics**
+ [MySQL 8.0 社群版的功能](#AuroraMySQL.8.0-features-community)
+ [Aurora MySQL Serverless v2 的 Aurora MySQL 第 3 版先決條件](#AuroraMySQL.serverless-v2-8.0-prereq)
+ [Aurora MySQL 第 3 版的版本備註](#AuroraMySQL.mysql80-bugs-fixed)
+ [新的平行查詢最佳化](#AuroraMySQL.8.0-features-pq)
+ [最佳化以減少資料庫重新啟動時間](#ReducedRestartTime)
+ [Aurora MySQL 第 3 版的新暫時資料表行為](ams3-temptable-behavior.md)
+ [比較 Aurora MySQL 第 2 版和 Aurora MySQL 第 3 版](AuroraMySQL.Compare-v2-v3.md)
+ [比較 Aurora MySQL 第 3 版與 MySQL 8.0 社群版](AuroraMySQL.Compare-80-v3.md)
+ [升級至 Aurora MySQL 第 3 版](AuroraMySQL.mysql80-upgrade-procedure.md)

## MySQL 8.0 社群版的功能
<a name="AuroraMySQL.8.0-features-community"></a>

 最初發行的 Aurora MySQL 第 3 版與 MySQL 8.0.23 社群版相容。MySQL 8.0 引進了幾個新功能，包括以下功能：
+ 單元資料定義語言 (DDL) 支援。如需更多詳細資訊，請參閱 [單元資料定義語言 (DDL) 支援。](AuroraMySQL.Compare-v2-v3.md#AuroraMySQL.Compare-v2-v3-atomic-ddl)。
+ JSON 函數 如需用法資訊，請參閱《MySQL 參考手冊》**中的 [JSON 函數](https://dev.mysql.com/doc/refman/8.0/en/json-functions.html)。
+ 視窗函數。如需用法資訊，請參閱《MySQL 參考手冊》**中的[視窗函數](https://dev.mysql.com/doc/refman/8.0/en/window-functions.html)。
+ 一般資料表表達式 (CTE)，使用 `WITH` 子句。如需用法資訊，請參閱《MySQL 參考手冊》**中的 [WITH (一般資料表表達式)](https://dev.mysql.com/doc/refman/8.0/en/with.html)。
+ 已針對 `ALTER TABLE` 陳述式最佳化 `ADD COLUMN` 和 `RENAME COLUMN` 子句。這些最佳化稱為「即時 DDL」。Aurora MySQL 第 3 版與社群 MySQL 即時 DLL 功能相容。未使用早期的 Aurora 快速 DLL 功能。如需即時 DDL 的用法資訊，請參閱 [即時 DDL (Aurora MySQL 第 3 版)](AuroraMySQL.Managing.FastDDL.md#AuroraMySQL.mysql80-instant-ddl)。
+ 遞減索引、功能索引和隱藏索引。如需用法資訊，請參閱《MySQL 參考手冊》**中的[隱藏索引](https://dev.mysql.com/doc/refman/8.0/en/invisible-indexes.html)、[遞減索引](https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html)，以及[CREATE INDEX 陳述式](https://dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-functional-key-parts)。
+ 透過 SQL 陳述式控制的角色型權限。如需權限模型變更的詳細資訊，請參閱[角色型權限模型](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)。
+ 搭配 `SELECT ... FOR SHARE` 陳述式的 `NOWAIT` 和 `SKIP LOCKED` 子句。這些子句避免等待其他交易釋放資料列鎖定。如需用法資訊，請參閱《MySQL 參考手冊》**中的[鎖定讀取](https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html)。
+ 二進位日誌 (binlog) 複寫的改進。如需 Aurora MySQL 詳細資訊，請參閱[二進位日誌複寫](AuroraMySQL.Compare-v2-v3.md#AuroraMySQL.mysql80-binlog)。尤其，您可以執行篩選的複寫。如需篩選複寫的用法資訊，請參閱《MySQL 參考手冊》**中的[伺服器如何評估複寫篩選規則](https://dev.mysql.com/doc/refman/8.0/en/replication-rules.html)。
+ 提示。一些 MySQL 8.0 相容的提示已向後移植到 Aurora MySQL 第 2 版。如需搭配使用提示與 Aurora MySQL 的詳細資訊，請參閱 [Aurora MySQL 提示](AuroraMySQL.Reference.Hints.md)。如需社群 MySQL 8.0 中的完整提示清單，請參閱《MySQL 參考手冊》**中的[最佳化工具提示](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html)。

如需新增到 MySQL 8.0 社群的完整功能清單，請參閱部落格文章 [The complete list of new features in MySQL 8.0](https://dev.mysql.com/blog-archive/the-complete-list-of-new-features-in-mysql-8-0/)。

Aurora MySQL 第 3 版還包括對包容性語言之關鍵字的變更，從社群 MySQL 8.0.26 向後移植。如需這些變更的詳細資訊，請參閱[Aurora MySQL 第 3 版的包容性語言變更](AuroraMySQL.Compare-v2-v3.md#AuroraMySQL.8.0-inclusive-language)。

## Aurora MySQL Serverless v2 的 Aurora MySQL 第 3 版先決條件
<a name="AuroraMySQL.serverless-v2-8.0-prereq"></a>

 Aurora MySQL 第 3 版是 Aurora MySQL Serverless v2 叢集中所有資料庫執行個體的先決條件。Aurora MySQL Serverless v2 包括對資料庫叢集中的讀取器執行個體的支援，及其他 Aurora 功能，這些功能不適用於 Aurora MySQL Serverless v1。其還具有比 Aurora MySQL Serverless v1 更快、更精細的擴展。

## Aurora MySQL 第 3 版的版本備註
<a name="AuroraMySQL.mysql80-bugs-fixed"></a>

 如需所有 Aurora MySQL 第 3 版的版本備註，請參閱 *Aurora MySQL 版本備註*中的 [Amazon Aurora MySQL 第 3 版的資料庫引擎更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html)。

## 新的平行查詢最佳化
<a name="AuroraMySQL.8.0-features-pq"></a>

 Aurora 平行查詢最佳化現在適用於更多的 SQL 作業：
+  平行查詢現在適用於包含資料類型 `TEXT`、`BLOB`、`JSON`、`GEOMETRY` 和 `VARCHAR`，以及 `CHAR` (長度超過 768 個位元組) 的資料表。
+  平行查詢可以最佳化涉及分割資料表的查詢。
+  平行查詢可以最佳化查詢，其中涉及選取清單中的彙總函數呼叫，以及 `HAVING` 子句。

 如需這些增強功能的詳細資訊，請參閱[將平行查詢叢集升級至 Aurora MySQL 第 3 版](aurora-mysql-parallel-query-optimizing.md#aurora-mysql-parallel-query-upgrade-pqv2)。如需 Aurora 平行查詢的一般資訊，請參閱[Amazon Aurora MySQL 的平行查詢](aurora-mysql-parallel-query.md)。

## 最佳化以減少資料庫重新啟動時間
<a name="ReducedRestartTime"></a>

您的 Aurora MySQL 資料庫叢集在計畫中斷和意外中斷期間都必須具有高可用性。

資料庫管理員需要偶爾執行資料庫維護。此維護包括資料庫修補、升級、需要手動重新開機的資料庫參數修改、執行容錯移轉以減少執行個體類別變更所需的時間等等。這些計劃的動作需要停機。

不過，停機時間也可能是因為意外的動作造成，例如因為基礎硬體故障或資料庫資源限流而導致意外的容錯移轉。所有這些計劃和未計劃的動作都會導致資料庫重新啟動。

在 Aurora MySQL 3.05 及更高版本中，我們引入了可縮短資料庫重新啟動時間的最佳化功能。與沒有最佳化相比，這些最佳化可減少多達 65% 的停機時間，並且在重新啟動後減少資料庫工作負載的中斷情況。

在資料庫啟動期間，會初始化許多內部記憶體元件。其中最大的是 [InnoDB 緩衝區集區](https://aws.amazon.com/blogs/database/best-practices-for-amazon-aurora-mysql-database-configuration/)，在 Aurora MySQL 中預設為執行個體記憶體大小的 75%。我們的測試發現初始化時間與 InnoDB 緩衝池的大小成正比，因此可以隨著資料庫執行個體類別大小進行擴展。在此初始化階段，資料庫無法接受連線，這會在重新啟動期間造成較長的停機時間。Aurora MySQL 快速重新啟動的第一階段會最佳化緩衝區集區初始化，以減少資料庫初始化的時間，進而減少整體重新啟動時間。

如需詳細資訊，請參閱部落格：[利用 Amazon Aurora MySQL 資料庫重新啟動時間最佳化減少停機時間](https://aws.amazon.com/blogs/database/reduce-downtime-with-amazon-aurora-mysql-database-restart-time-optimizations/)。

# Aurora MySQL 第 3 版的新暫時資料表行為
<a name="ams3-temptable-behavior"></a>

Aurora MySQL 第 3 版會以與舊版 Aurora MySQL 不同的方式處理暫時資料表。這種新行為是從 MySQL 8.0 社群版繼承的。有兩種類型的暫時資料表可以使用 Aurora MySQL 第 3 版建立：
+ 內部 (或*隱含*) 暫時資料表 – 由 Aurora MySQL 引擎建立，可處理如排序彙總、衍生資料表，或通用資料表表達式 (CTE) 等操作。
+ 使用者建立 (或*明確*) 的暫時資料表 –當您使用 `CREATE TEMPORARY TABLE` 陳述式時由 Aurora MySQL 引擎建立。

Aurora 讀取器資料庫執行個體上的內部暫時資料表和使用者建立的暫時資料表皆有其他注意事項。我們會在下列各節討論這些變更。

**Topics**
+ [內部 (隱含) 暫時資料表的儲存引擎](#ams3-temptable-behavior-engine)
+ [限制記憶體內部暫存資料表的大小](#ams3-temptable-behavior-limit)
+ [緩解 Aurora 複本上內部暫時資料表的完整性問題](#ams3-temptable-behavior-mitigate)
+ [在 Aurora MySQL 資料庫執行個體上最佳化 temptable\$1max\$1mmap 參數](#ams-optimize-temptable_max_mmap)
+ [讀取器資料庫執行個體上的使用者建立 (明確) 的暫時資料表](#ams3-temptable-behavior.user)
+ [暫時資料表建立時發生的錯誤和緩解措施](#ams3-temptable-behavior.errors)

## 內部 (隱含) 暫時資料表的儲存引擎
<a name="ams3-temptable-behavior-engine"></a>

產生中繼結果集時，Aurora MySQL 一開始會嘗試寫入記憶體內暫時資料表。這可能不成功，因為資料類型不相容或設定了限制。若是如此，則暫存資料表會轉換為磁碟上暫存資料表，而不是保留在記憶體中。如需詳細資訊，請參閱 MySQL 文件中的 [MySQL 中內部暫時資料表的使用](https://dev.mysql.com/doc/refman/8.0/en/internal-temporary-tables.html)。

在 Aurora MySQL 第 3 版中，內部暫時資料表的運作方式與早期的 Aurora MySQL 版本不同。現在您可以在 與 InnoDB 儲存引擎之間進行選擇，而不是為這類暫時資料表，在 `TempTable` 和 `MEMORY` 儲存引擎之間進行選擇。

使用 `TempTable` 儲存引擎，您可以另外選擇如何處理特定資料。受影響的資料溢出記憶體集區，此記憶體集區保留資料庫執行個體的所有內部暫時資料表。

這些選擇可能會影響產生大量暫存資料之查詢的效能，例如在大型資料表上執行彙總 (例如 `GROUP BY`) 時。

**提示**  
如果您的工作負載包含產生內部暫時資料表的查詢，請執行基準化分析並監控效能相關指標，以確認您的應用程式如何搭配此變更執行。  
在某些情況下，暫存資料量容納於 `TempTable` 記憶體集區內，或僅少量溢出記憶體集區。在這些情況下，我們建議將 `TempTable` 設定用於內部暫時資料表，並使用記憶體映射檔案來保留任何溢位資料。此設定是預設值。

`TempTable` 儲存引擎是預設值。`TempTable` 會針對使用此引擎的所有暫時資料表使用一般記憶體集區，而不是每個資料表的最大記憶體限制。此記憶體集區的大小是由 [temptable\$1max\$1ram](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram) 參數指定。其在具有 16 GiB 或更多記憶體的資料庫執行個體上預設為 1 GiB，而在記憶體少於 16 GiB 的資料庫執行個體上則預設為 16 MB。記憶體集區的大小會影響工作階段層級的記憶體耗用量。

在某些情況下，當您使用 `TempTable` 儲存引擎時，暫存資料可能會超過記憶體集區的大小。若是如此，Aurora MySQL 會使用次要機制來存放溢位資料。

您可以設定 [temptable\$1max\$1mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap) 參數來指定資料是否溢出到記憶體對應的暫存檔案，還是溢出到磁碟上的 InnoDB 內部暫時資料表。這些溢位機制的不同資料格式和溢位準則可能會影響查詢效能。它們會藉由影響寫入至磁碟的資料量以及對磁碟儲存輸送量的需求來達到此目的。

Aurora MySQL 第 3 版會以下列方式存放溢出資料：
+ 在寫入器資料庫執行個體上，溢出至 InnoDB 內部暫存資料表或記憶體映射暫存檔案的資料會存放在執行個體上的本機儲存體中。
+ 在讀取器執行個體上，溢出資料始終位於本機儲存上的記憶體映射暫存檔中。

  唯讀執行個體無法在 Aurora 叢集磁碟區上存放任何資料。

與內部暫時資料表相關的組態參數會以不同方式套用至叢集中的寫入器和讀取器執行個體：
+ 在讀取器執行個體上，MySQL Aurora 始終使用 `TempTable` 儲存引擎。
+ 對於寫入器和讀取器執行個體，不論資料庫執行個體的記憶體大小為何，`temptable_max_mmap` 的大小都會預設為 1 GiB。您可以在寫入器和讀取器執行個體上調整此值。
+ 將 `temptable_max_mmap` 設為 `0` 會關閉在寫入器執行個體上使用記憶體映射暫存檔案的功能。
+ 您無法在讀取器執行個體上將 `temptable_max_mmap` 設為 `0`。

**注意**  
我們不建議使用 [temptable\$1use\$1mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_use_mmap) 參數。該參數已被棄用，且預計未來的 MySQL 版本不會再支援該參數。

## 限制記憶體內部暫存資料表的大小
<a name="ams3-temptable-behavior-limit"></a>

正如 [內部 (隱含) 暫時資料表的儲存引擎](#ams3-temptable-behavior-engine) 中所討論，您可以使用 [temptable\$1max\$1ram](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram) 和 [temptable\$1max\$1mmap](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_mmap) 設定控制全域資源暫存資料表。

您也可以使用 [tmp\$1table\$1size](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmp_table_size) 資料庫參數限制個別內部、記憶體內暫存資料表的大小。此限制是為了防止個別查詢耗用大量的全域資源暫存資料表資源，這可能會影響同時需要這些資源的查詢效能。

`tmp_table_size` 參數定義 `MEMORY` 儲存體引擎在 Aurora MySQL 3 版中建立暫存資料表的大小上限。

Aurora MySQL 3.04 版及更新版本中，`tmp_table_size` 還定義 `aurora_tmptable_enable_per_table_limit` 資料庫參數設定為 `ON` 時，`TempTable` 儲存體引擎建立臨時資料表的大小上限。此行為預設為停用 (`OFF`)，這與 Aurora MySQL 3.03 版及更低版本中的行為相同。
+ 當 `aurora_tmptable_enable_per_table_limit` 為 `OFF` 時，透過 `TempTable` 儲存體引擎建立記憶體內部暫存資料表不用考慮 `tmp_table_size`。

  但是，全域 `TempTable` 資源限制仍然適用。當全域 `TempTable` 資源達到限制時，Aurora MySQL 具有下列行為：
  + 寫入器資料庫執行個體 – Aurora MySQL 會自動將記憶體內暫存資料表轉換為 InnoDB 磁碟上的暫存資料表。
  + 讀取器資料庫執行個體 – 查詢因錯誤而結束。

    ```
    ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sqlxx_xxx' is full
    ```
+ 當 `aurora_tmptable_enable_per_table_limit` 為 `ON` 時，全域 `tmp_table_size` 資源達到限制，Aurora MySQL 具有下列行為：
  + 寫入器資料庫執行個體 – Aurora MySQL 會自動將記憶體內暫存資料表轉換為 InnoDB 磁碟上的暫存資料表。
  + 讀取器資料庫執行個體 – 查詢因錯誤而結束。

    ```
    ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sqlxx_xxx' is full
    ```

    在這種情況下，全域 `TempTable` 資源限制和每個資料表限制都適用。

**注意**  
當 [ internal\$1tmp\$1mem\$1storage\$1engine](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_internal_tmp_mem_storage_engine) 設定為 `MEMORY` 時，`aurora_tmptable_enable_per_table_limit` 參數沒有作用。在這種情況下，記憶體內暫存資料表的大小上限由 [tmp\$1table\$1size](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmp_table_size) 或者 [max\$1heap\$1table\$1size](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_heap_table_size) 值定義，以較小者為準。

下列範例顯示 `aurora_tmptable_enable_per_table_limit` 參數對寫入器和讀取器資料庫執行個體的行為。

**Example 或者將寫入器資料庫執行個體 `aurora_tmptable_enable_per_table_limit` 設定為 `OFF`**  
記憶體內的暫存資料表不會轉換為 InnoDB 磁碟上的暫存資料表。  

```
mysql> set aurora_tmptable_enable_per_table_limit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@temptable_max_ram,@@temptable_max_mmap;
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
| @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@temptable_max_ram | @@temptable_max_mmap |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
|                  0 | 3.04.0           |                                        0 |          1073741824 |           1073741824 |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
1 row in set (0.00 sec)

mysql> show status like '%created_tmp_disk%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
+-------------------------+-------+
1 row in set (0.00 sec)

mysql> set cte_max_recursion_depth=4294967295;
Query OK, 0 rows affected (0.00 sec)

mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 60000000) SELECT max(n) FROM cte;
+----------+
| max(n)   |
+----------+
| 60000000 |
+----------+
1 row in set (13.99 sec)

mysql> show status like '%created_tmp_disk%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
+-------------------------+-------+
1 row in set (0.00 sec)
```

**Example 或者將寫入器資料庫執行個體 `aurora_tmptable_enable_per_table_limit` 設定為 `ON`**  
記憶體內的暫存資料表會轉換為 InnoDB 磁碟上的暫存資料表。  

```
mysql> set aurora_tmptable_enable_per_table_limit=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@tmp_table_size;
+--------------------+------------------+------------------------------------------+------------------+
| @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@tmp_table_size |
+--------------------+------------------+------------------------------------------+------------------+
|                  0 | 3.04.0           |                                        1 |         16777216 |
+--------------------+------------------+------------------------------------------+------------------+
1 row in set (0.00 sec)

mysql> set cte_max_recursion_depth=4294967295;
Query OK, 0 rows affected (0.00 sec)

mysql> show status like '%created_tmp_disk%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
+-------------------------+-------+
1 row in set (0.00 sec)

mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 6000000) SELECT max(n) FROM cte;
+---------+
| max(n)  |
+---------+
| 6000000 |
+---------+
1 row in set (4.10 sec)

mysql> show status like '%created_tmp_disk%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 1     |
+-------------------------+-------+
1 row in set (0.00 sec)
```

**Example 將讀取器資料庫執行個體 `aurora_tmptable_enable_per_table_limit` 設定為 `OFF`**  
查詢結束時沒有錯誤，因為 `tmp_table_size` 不適用，並且全域 `TempTable` 資源尚未達到限制。  

```
mysql> set aurora_tmptable_enable_per_table_limit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@temptable_max_ram,@@temptable_max_mmap;
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
| @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@temptable_max_ram | @@temptable_max_mmap |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
|                  1 | 3.04.0           |                                        0 |          1073741824 |           1073741824 |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
1 row in set (0.00 sec)

mysql> set cte_max_recursion_depth=4294967295;
Query OK, 0 rows affected (0.00 sec)

mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 60000000) SELECT max(n) FROM cte;
+----------+
| max(n)   |
+----------+
| 60000000 |
+----------+
1 row in set (14.05 sec)
```

**Example 將讀取器資料庫執行個體 `aurora_tmptable_enable_per_table_limit` 設定為 `OFF`**  
此查詢已達到全域 TempTable 資源限制，將 `aurora_tmptable_enable_per_table_limit` 設定為關閉。查詢因讀取器執行個體上發生錯誤而結束。  

```
mysql> set aurora_tmptable_enable_per_table_limit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@temptable_max_ram,@@temptable_max_mmap;
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
| @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@temptable_max_ram | @@temptable_max_mmap |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
|                  1 | 3.04.0           |                                        0 |          1073741824 |           1073741824 |
+--------------------+------------------+------------------------------------------+---------------------+----------------------+
1 row in set (0.00 sec)

mysql> set cte_max_recursion_depth=4294967295;
Query OK, 0 rows affected (0.01 sec)

mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 120000000) SELECT max(n) FROM cte;
ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sqlfd_1586_2' is full
```

**Example 將讀取器資料庫執行個體 `aurora_tmptable_enable_per_table_limit` 設定為 `ON`**  
已達到 `tmp_table_size` 限制，查詢因發生錯誤而結束。  

```
mysql> set aurora_tmptable_enable_per_table_limit=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@innodb_read_only,@@aurora_version,@@aurora_tmptable_enable_per_table_limit,@@tmp_table_size;
+--------------------+------------------+------------------------------------------+------------------+
| @@innodb_read_only | @@aurora_version | @@aurora_tmptable_enable_per_table_limit | @@tmp_table_size |
+--------------------+------------------+------------------------------------------+------------------+
|                  1 | 3.04.0           |                                        1 |         16777216 |
+--------------------+------------------+------------------------------------------+------------------+
1 row in set (0.00 sec)

mysql> set cte_max_recursion_depth=4294967295;
Query OK, 0 rows affected (0.00 sec)

mysql> WITH RECURSIVE cte (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM cte WHERE n < 6000000) SELECT max(n) FROM cte;
ERROR 1114 (HY000): The table '/rdsdbdata/tmp/#sqlfd_8_2' is full
```

## 緩解 Aurora 複本上內部暫時資料表的完整性問題
<a name="ams3-temptable-behavior-mitigate"></a>

若要避免發生暫時資料表的大小限制問題，請將 `temptable_max_ram` 和 `temptable_max_mmap` 參數設定為符合工作負載需求的合併值。

設定 `temptable_max_ram` 參數的值時請小心。將此值設定得過高，會減少資料庫執行個體上的可用記憶體，這可能會導致發生記憶體不足的狀況。監控資料庫執行個體上的平均可用記憶體。然後為 `temptable_max_ram` 決定適合的值，以便執行個體上仍能保留合理的可用記憶體量。如需詳細資訊，請參閱[Amazon Aurora 中的可用記憶體問題](CHAP_Troubleshooting.md#Troubleshooting.FreeableMemory)。

監控本機儲存空間的大小和暫時資料表空間的耗用狀況，也很重要。您可以使用 `FreeLocalStorage` Amazon CloudWatch 指標來監控特定資料庫執行個體可用的暫存空間，如 [Amazon Aurora 的 Amazon CloudWatch 指標](Aurora.AuroraMonitoring.Metrics.md) 中所述。

**注意**  
當 `aurora_tmptable_enable_per_table_limit` 參數設定為 `ON` 時，此程序不適用。如需詳細資訊，請參閱[限制記憶體內部暫存資料表的大小](#ams3-temptable-behavior-limit)。

**Example 1**  
您知識暫時資料表的大小會累積成長至 20 GiB。您希望將記憶體內暫時資料表設定為 2 GiB，並在磁碟上成長到上限 20 GiB。  
將 `temptable_max_ram` 設定為 **2,147,483,648**，將 `temptable_max_mmap` 設定為 **21,474,836,480**。這些值以位元組為單位。  
這些參數設定確保暫時資料表可累積成長到總共 22 GiB。

**Example 2**  
您目前的執行個體大小為 16xlarge 或以上。您不知道您可能需要的暫時資料表總大小。您希望能夠在記憶體中使用多達 4 GiB，最多達磁碟上的可用儲存空間大小上限。  
將 `temptable_max_ram` 設定為 **4,294,967,296**，將 `temptable_max_mmap` 設定為 **1,099,511,627,776**。這些值以位元組為單位。  
在此您將 `temptable_max_mmap` 設定為 1 TiB，這小於 16xlarge Aurora 資料庫執行個體上 1.2 TiB 的本機儲存空間上限。  
在大小較小的執行個體上，調整 `temptable_max_mmap` 的值，使其不會填滿可用的本機儲存空間。例如，一個 2xlarge 執行個體只有 160 GiB 的可用本機儲存空間。因此，建議將該值設定為小於 160 GiB。如需資料庫執行個體大小的可用本機儲存空間詳細資訊，請參閱 [Aurora MySQL 的暫存空間限制暫存空間限制](AuroraMySQL.Managing.Performance.md#AuroraMySQL.Managing.TempStorage)。

## 在 Aurora MySQL 資料庫執行個體上最佳化 temptable\$1max\$1mmap 參數
<a name="ams-optimize-temptable_max_mmap"></a>

Aurora MySQL 中的 `temptable_max_mmap` 參數控制記憶體映射檔案在溢出至磁碟上 InnoDB 暫存資料表 (寫入器資料庫執行個體上) 或導致錯誤 (讀取器資料庫執行個體上) 之前可使用的本機磁碟空間上限。正確設定此資料庫執行個體參數有助於最佳化資料庫執行個體的效能。

**先決條件**  

1. 確定已啟用效能結構描述。您可以透過執行以下 SQL 命令來進行確認。

   ```
   SELECT @@performance_schema;
   ```

   `1` 的輸出值表示已啟用。

1. 確認已啟用暫存資料表記憶體檢測。您可以透過執行以下 SQL 命令來進行確認。

   ```
   SELECT name, enabled FROM performance_schema.setup_instruments WHERE name LIKE '%memory%temptable%';
   ```

   `enabled` 欄會針對相關的暫存資料表記憶體檢測項目顯示 `YES`。

**監控暫存資料表用量**  
設定 `temptable_max_mmap` 的初始值時，建議您從使用的資料庫執行個體類別的本機儲存體大小的 80% 開始。這可確保暫存資料表有足夠的磁碟空間可有效運作，同時為執行個體上的其他磁碟使用保留空間。  
若要尋找資料庫執行個體類別的本機儲存體大小，請參閱 [Aurora MySQL 的暫存空間限制暫存空間限制](AuroraMySQL.Managing.Performance.md#AuroraMySQL.Managing.TempStorage)。  
例如，如果您使用的是 db.r5.large 資料庫執行個體類別，則本機儲存體大小為 32 GiB。在這種情況下，您一開始會將 `temptable_max_mmap` 參數設定為 32 GiB 的 80%，也就是 25.6 GiB。  
設定初始 `temptable_max_mmap` 值後，在 Aurora MySQL 執行個體上執行尖峰工作負載。使用下列 SQL 查詢監控目前和高暫存資料表磁碟用量：  

```
SELECT event_name, current_count, current_alloc, current_avg_alloc, high_count, high_alloc, high_avg_alloc
FROM sys.memory_global_by_current_bytes WHERE event_name LIKE 'memory/temptable/%';
```
此查詢會擷取下列資訊：  
+ `event_name` – 暫存資料表記憶體或磁碟用量事件的名稱。
+ `current_count` – 目前配置的暫存資料表記憶體或磁碟區塊數量。
+ `current_alloc` – 針對暫存資料表配置的目前記憶體或磁碟數量。
+ `current_avg_alloc` – 暫存資料表記憶體或磁碟區塊的目前平均大小。
+ `high_count` – 配置的暫存資料表記憶體或磁碟區塊數量上限。
+ `high_alloc` – 針對暫存資料表配置的最高記憶體或磁碟數量。
+ `high_avg_alloc` – 暫存資料表記憶體或磁碟區塊的平均大小上限。
如果您的查詢失敗，且使用此設定時發生資料表已滿錯誤，則表示您的工作負載需要更多磁碟空間來執行暫存資料表操作。在此情況下，請考慮將資料庫執行個體大小增加為具有更多本機儲存空間的執行個體大小。

**設定最佳 `temptable_max_mmap` 值**  
使用下列程序來監控和設定 `temptable_max_mmap` 參數的正確大小。  

1. 檢閱上一個查詢的輸出，並識別尖峰暫存資料表磁碟用量，如 `high_alloc` 欄所示。

1. 根據尖峰暫存資料表磁碟用量，調整 Aurora MySQL 資料庫執行個體資料庫參數群組中的 `temptable_max_mmap` 參數。

   將值設為稍微高於尖峰暫存資料表磁碟用量，以適應未來的成長。

1. 將參數群組變更套用至資料庫執行個體。

1. 在尖峰工作負載期間再次監控暫存資料表磁碟用量，以確保新 `temptable_max_mmap` 值是適當的。

1. 視需要重複上述步驟，以微調 `temptable_max_mmap` 參數。

## 讀取器資料庫執行個體上的使用者建立 (明確) 的暫時資料表
<a name="ams3-temptable-behavior.user"></a>

您可以在 `CREATE TABLE` 陳述式中使用 `TEMPORARY` 的關鍵字建立明確的暫時資料表。Aurora 資料庫叢集中寫入器資料庫執行個體支援明確暫時資料表。您也可以在讀取器資料庫執行個體上使用明確暫時資料表，但該資料表無法強制使用 InnoDB 儲存引擎。

若要避免在 Aurora MySQL 讀取器資料庫執行個體上建立明確暫時資料表時發生錯誤，請確定您以下列其中一種或兩種方式執行所有 `CREATE TEMPORARY TABLE` 陳述句：
+ 不指定 `ENGINE=InnoDB` 子句。
+ 不將 SQL 模式設為 `NO_ENGINE_SUBSTITUTION`。

## 暫時資料表建立時發生的錯誤和緩解措施
<a name="ams3-temptable-behavior.errors"></a>

您收到的錯誤會有所不同，取決於您使用純 `CREATE TEMPORARY TABLE` 陳述式，還是變異 `CREATE TEMPORARY TABLE AS SELECT`。下列範例顯示不同類型的錯誤。

此暫時資料表行為僅適用於唯讀執行個體。這個第一個範例確認其是工作階段連線到的執行個體類型。

```
mysql> select @@innodb_read_only;
+--------------------+
| @@innodb_read_only |
+--------------------+
|                  1 |
+--------------------+
```

對於純 `CREATE TEMPORARY TABLE` 陳述式，陳述式會在 `NO_ENGINE_SUBSTITUTION` SQL 模式開啟時失敗。當 `NO_ENGINE_SUBSTITUTION` 關閉時 (預設值),會進行適當的引擎替換，並會成功建立暫時資料表。

```
mysql> set sql_mode = 'NO_ENGINE_SUBSTITUTION';

mysql>  CREATE TEMPORARY TABLE tt2 (id int) ENGINE=InnoDB;
ERROR 3161 (HY000): Storage engine InnoDB is disabled (Table creation is disallowed).

mysql> SET sql_mode = '';

mysql> CREATE TEMPORARY TABLE tt4 (id int) ENGINE=InnoDB;

mysql> SHOW CREATE TABLE tt4\G
*************************** 1. row ***************************
       Table: tt4
Create Table: CREATE TEMPORARY TABLE `tt4` (
  `id` int DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
```

對於 `CREATE TEMPORARY TABLE AS SELECT` 陳述式，陳述式會在 `NO_ENGINE_SUBSTITUTION` SQL 模式開啟時失敗。當 `NO_ENGINE_SUBSTITUTION` 關閉時 (預設值),會進行適當的引擎替換，並會成功建立暫時資料表。

```
mysql> set sql_mode = 'NO_ENGINE_SUBSTITUTION';

mysql> CREATE TEMPORARY TABLE tt1 ENGINE=InnoDB AS SELECT * FROM t1;
ERROR 3161 (HY000): Storage engine InnoDB is disabled (Table creation is disallowed).

mysql> SET sql_mode = '';

mysql> show create table tt3;
+-------+----------------------------------------------------------+
| Table | Create Table                                             |
+-------+----------------------------------------------------------+
| tt3   | CREATE TEMPORARY TABLE `tt3` (
  `id` int DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+----------------------------------------------------------+
1 row in set (0.00 sec)
```

如需有關 Aurora MySQL 第 3 版中臨時資料表儲存方面和效能影響的詳細資訊，請參閱部落格文章 [Use the TempTable storage engine on Amazon RDS for MySQL and Amazon Aurora MySQL](https://aws.amazon.com/blogs/database/use-the-temptable-storage-engine-on-amazon-rds-for-mysql-and-amazon-aurora-mysql/) (在 Amazon RDS for MySQL 和 Amazon Aurora MySQL 上使用 TempTable 儲存引擎)。

# 比較 Aurora MySQL 第 2 版和 Aurora MySQL 第 3 版
<a name="AuroraMySQL.Compare-v2-v3"></a>

使用以下內容來了解當您將 Aurora MySQL 第 2 版叢集升級至第 3 版時，應注意的變更。

**Topics**
+ [單元資料定義語言 (DDL) 支援。](#AuroraMySQL.Compare-v2-v3-atomic-ddl)
+ [Aurora MySQL 第 2 版與第 3 版之間的功能差異](#AuroraMySQL.Compare-v2-v3-features)
+ [執行個體類別支援](#AuroraMySQL.mysql80-instance-classes)
+ [Aurora MySQL 第 3 版的參數變更](#AuroraMySQL.mysql80-parameter-changes)
+ [狀態變數](#AuroraMySQL.mysql80-status-vars)
+ [Aurora MySQL 第 3 版的包容性語言變更](#AuroraMySQL.8.0-inclusive-language)
+ [AUTO\$1INCREMENT 值](#AuroraMySQL.mysql80-autoincrement)
+ [二進位日誌複寫](#AuroraMySQL.mysql80-binlog)

## 單元資料定義語言 (DDL) 支援。
<a name="AuroraMySQL.Compare-v2-v3-atomic-ddl"></a>

從 MySQL 5.7 到 8.0 的最大變更之一是引入[單元資料字典](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html)。在 MySQL 8.0 之前，MySQL 資料字典使用以檔案為基礎的方法來存放中繼資料，例如資料表定義 (.frm)、觸發 (.trg)，以及與儲存引擎中繼資料 (例如 InnoDB 的) 分開的函數。這有一些問題，包括如果在 DDL 操作期間發生意外，導致檔案型和儲存引擎中繼資料不同步，資料表會變成「[孤立](https://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html)」的風險。

為了修正此問題，MySQL 8.0 推出了單元資料字典，該字典會將所有中繼資料存放在 `mysql` 結構描述中的一組內部 InnoDB 資料表中。這個新架構提供交易、[ACID](https://en.wikipedia.org/wiki/ACID) 合規的方式來管理資料庫中繼資料，從舊的檔案型方法解決「單元 DDL」問題。如需單元資料字典的詳細資訊，請參閱 *MySQL 參考手冊*中的[移除檔案型中繼資料儲存](https://dev.mysql.com/doc/refman/8.0/en/data-dictionary-file-removal.html)和[單元資料定義陳述式支援](https://dev.mysql.com/doc/refman/8.0/en/atomic-ddl.html)。

由於此架構變更，從 Aurora MySQL 第 2 版升級至第 3 版時，您必須考量下列事項：
+ 第 2 版的檔案型中繼資料必須在升級到第 3 版的過程中遷移到新的資料字典資料表。視遷移多少資料庫物件而定，這可能需要一些時間。
+ 這些變更也引入了一些新的不相容，可能需要先解決，才能從 MySQL 5.7 升級到 8.0。例如，8.0 有一些新的預留關鍵字，可能與現有的資料庫物件名稱衝突。

為了協助您在升級引擎之前識別這些不相容，Aurora MySQL 會執行一系列的升級相容性檢查 (預先檢查)，以確定資料庫字典中是否有任何不相容的物件，然後再執行資料字典升級。如需關於預先檢查的詳細資訊，請參閱 [Aurora MySQL 的主要版本升級預先檢查](AuroraMySQL.upgrade-prechecks.md)。

## Aurora MySQL 第 2 版與第 3 版之間的功能差異
<a name="AuroraMySQL.Compare-v2-v3-features"></a>

Aurora MySQL for MySQL 5.7 中支援下列 Amazon Aurora MySQL 功能，但 Aurora MySQL for MySQL 8.0 中不支援這些功能。
+ 您無法將 Aurora MySQL 第 3 版用於 Aurora Serverless v1 叢集。Aurora MySQL 第 3 版可與 Aurora Serverless v2 搭配使用。
+ 實驗室模式不適用於 Aurora MySQL 第 3 版。Aurora MySQL 第 3 版中沒有任何實驗室模式功能。即時 DDL 會取代先前可在實驗室模式中使用的快速線上 DDL 功能。如需範例，請參閱「[即時 DDL (Aurora MySQL 第 3 版)](AuroraMySQL.Managing.FastDDL.md#AuroraMySQL.mysql80-instant-ddl)」。
+ 查詢快取會從社群 MySQL 8.0 移除，也會從 Aurora MySQL 第 3 版移除。
+ Aurora MySQL 第 3 版與社群 MySQL 雜湊聯結功能相容。未使用 Aurora MySQL 第 2 版中雜湊聯結的 Aurora 特定實作。如需搭配使用雜湊聯結與 Aurora 平行查詢的相關資訊，請參閱[開啟平行查詢叢集的雜湊聯結](aurora-mysql-parallel-query-enabling.md#aurora-mysql-parallel-query-enabling-hash-join)和 [Aurora MySQL 提示](AuroraMySQL.Reference.Hints.md)。如需雜湊聯結的一般用法資訊，請參閱《MySQL 參考手冊》**中的[雜湊聯結最佳化](https://dev.mysql.com/doc/refman/8.0/en/hash-joins.html)。
+ 已在 Aurora MySQL 第 2 版中取代的 `mysql.lambda_async` 預存程序會在第 3 版中移除。對於第 3 版，請改用非同步函數 `lambda_async`。
+ Aurora MySQL 第 3 版中的預設字元集是 `utf8mb4`。在 Aurora MySQL 第 2 版中，預設字元集是 `latin1`。如需此字元集的相關資訊，請參閱《MySQL 參考手冊》**中的 [utf8mb4 字元集 (4 位元組 UTF-8 Unicode 編碼)](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb4.html)。

某些 Aurora MySQL 功能可用於 AWS 區域和資料庫引擎版本的特定組合。如需詳細資訊，請參閱 [AWS 區域 和 Aurora 資料庫引擎在 Amazon Aurora 中支援的功能](Concepts.AuroraFeaturesRegionsDBEngines.grids.md)。

## 執行個體類別支援
<a name="AuroraMySQL.mysql80-instance-classes"></a>

Aurora MySQL 第 3 版支援的執行個體類別集與 Aurora MySQL 第 2 版支援的不同：
+ 對於較大的執行個體，您可以使用新式執行個體類別，例如 `db.r5`、`db.r6g` 和 `db.x2g`。
+ 對於較小的執行個體，您可以使用新式執行個體類別，例如 `db.t3` 和 `db.t4g`。
**注意**  
建議您在開發、測試伺服器或其他非生產伺服器時，僅使用 T 資料庫執行個體類別。如需詳細了解 T 執行個體類別，請參閱 [使用 T 執行個體類別進行開發和測試](AuroraMySQL.BestPractices.Performance.md#AuroraMySQL.BestPractices.T2Medium)。

來自 Aurora MySQL 第 2 版的以下執行個體類別不適用於 Aurora MySQL 第 3 版：
+  `db.r4` 
+  `db.r3` 
+  `db.t3.small` 
+  `db.t2` 

 檢查您的管理指令碼是否有任何建立 Aurora MySQL 資料庫執行個體的 CLI 陳述式。無法用於 Aurora MySQL 第 3 版的硬式編碼執行個體類別名稱。如有必要，請將執行個體類別名稱修改為 Aurora MySQL 第 3 版支援的名稱。

**提示**  
 若要檢查您可以用於 Aurora MySQL 版本和 AWS 區域之特定組合的執行個體類別，請使用 `describe-orderable-db-instance-options` AWS CLI 命令。

 如需 Aurora 執行個體類別的完整詳細資訊，請參閱 [Amazon Aurora 資料庫執行個體類別](Concepts.DBInstanceClass.md)。

## Aurora MySQL 第 3 版的參數變更
<a name="AuroraMySQL.mysql80-parameter-changes"></a>

Aurora MySQL 第 3 版包含新的叢集層級和執行個體層級組態參數。Aurora MySQL 第 3 版也移除一些存在於 Aurora MySQL 第 2 版中的參數。有些參數名稱會由於包容性語言的倡議而變更。為了回溯相容性，您仍然可以使用舊名稱或新名稱來擷取參數值。不過，您必須使用新名稱來指定自訂參數群組中的參數值。

在 Aurora MySQL 第 3 版中，`lower_case_table_names` 參數的值會在建立叢集時永久設定。如果您對此選項使用非預設值，請在升級之前設定您的 Aurora MySQL 第 3 版自訂參數群組。然後，在建立叢集或快照還原作業期間指定參數群組。

**注意**  
使用以 Aurora MySQL 為基礎的 Aurora 全域資料庫時，若啟用 `lower_case_table_names` 參數，即無法從 Aurora MySQL 第 2 版就地升級至第 3 版。請改用快照還原技術。

在 Aurora MySQL 第 3 版中，`init_connect` 和 `read_only` 參數不適用於具有 `CONNECTION_ADMIN` 權限的使用者。這包括 Aurora 主要使用者。如需更多詳細資訊，請參閱 [角色型權限模型](AuroraMySQL.Compare-80-v3.md#AuroraMySQL.privilege-model)。

如需 Aurora MySQL 叢集參數的完整清單，請參閱[叢集層級參數](AuroraMySQL.Reference.ParameterGroups.md#AuroraMySQL.Reference.Parameters.Cluster)。資料表涵蓋了來自 Aurora MySQL 第 2 和 3 版的所有參數。資料表包含附註，其中顯示哪些參數在 Aurora MySQL 第 3 版中是新的，或是哪些參數已從 Aurora MySQL 第 3 版中移除。

如需 Aurora MySQL 執行個體參數的完整清單，請參閱[執行個體層級參數](AuroraMySQL.Reference.ParameterGroups.md#AuroraMySQL.Reference.Parameters.Instance)。資料表涵蓋了來自 Aurora MySQL 第 2 和 3 版的所有參數。資料表包含附註，其中顯示哪些參數在 Aurora MySQL 第 3 版中是新的，以及哪些參數已從 Aurora MySQL 第 3 版中移除。它還包括其他附註，其中顯示哪些參數在早期版本中是可修改的，但不是 Aurora MySQL 第 3 版。

如需已變更之參數名稱的相關資訊，請參閱 [Aurora MySQL 第 3 版的包容性語言變更](#AuroraMySQL.8.0-inclusive-language)。

## 狀態變數
<a name="AuroraMySQL.mysql80-status-vars"></a>

如需不適用於 Aurora MySQL 之狀態變數的相關資訊，請參閱[不適用於 Aurora MySQL 的 MySQL 狀態變數](AuroraMySQL.Reference.GlobalStatusVars.md#AuroraMySQL.Reference.StatusVars.Inapplicable)。

## Aurora MySQL 第 3 版的包容性語言變更
<a name="AuroraMySQL.8.0-inclusive-language"></a>

 Aurora MySQL 第 3 版與來自 MySQL 社群版的 8.0.23 版相容。Aurora MySQL 第 3 版還包括來自 MySQL 8.0.26 的變更，這些變更與包容性語言之關鍵字和系統結構描述相關。例如，`SHOW REPLICA STATUS` 命令現在是偏好的命令，而不是 `SHOW SLAVE STATUS`。

 下列 Amazon CloudWatch 指標在 Aurora MySQL 第 3 版中具有新名稱。

 在 Aurora MySQL 第 3 版中，只有新的指標名稱可用。升級至 Aurora MySQL 第 3 版時，請務必更新任何警示或其他依賴指標名稱的自動化。


|  舊名稱  |  新名稱  | 
| --- | --- | 
|  ForwardingMasterDMLLatency  |  ForwardingWriterDMLLatency  | 
|  ForwardingMasterOpenSessions  |  ForwardingWriterOpenSessions  | 
|  AuroraDMLRejectedMasterFull  |  AuroraDMLRejectedWriterFull  | 
|  ForwardingMasterDMLThroughput  |  ForwardingWriterDMLThroughput  | 

 下列狀態變數在 Aurora MySQL 第 3 版中具有新名稱。

 為了相容性，您可以在初始的 Aurora MySQL 第 3 版中使用任一個名稱。舊的狀態變數名稱將在未來版本中移除。


|  要移除的名稱  |  新名稱或偏好名稱  | 
| --- | --- | 
|  Aurora\$1fwd\$1master\$1dml\$1stmt\$1duration  |  Aurora\$1fwd\$1writer\$1dml\$1stmt\$1duration  | 
|  Aurora\$1fwd\$1master\$1dml\$1stmt\$1count  |  Aurora\$1fwd\$1writer\$1dml\$1stmt\$1count  | 
|  Aurora\$1fwd\$1master\$1select\$1stmt\$1duration  |  Aurora\$1fwd\$1writer\$1select\$1stmt\$1duration  | 
|  Aurora\$1fwd\$1master\$1select\$1stmt\$1count  |  Aurora\$1fwd\$1writer\$1select\$1stmt\$1count  | 
|  Aurora\$1fwd\$1master\$1errors\$1session\$1timeout  |  Aurora\$1fwd\$1writer\$1errors\$1session\$1timeout  | 
|  Aurora\$1fwd\$1master\$1open\$1sessions  |  Aurora\$1fwd\$1writer\$1open\$1sessions  | 
|  Aurora\$1fwd\$1master\$1errors\$1session\$1limit  |  Aurora\$1fwd\$1writer\$1errors\$1session\$1limit  | 
|  Aurora\$1fwd\$1master\$1errors\$1rpc\$1timeout  |  Aurora\$1fwd\$1writer\$1errors\$1rpc\$1timeout  | 

下列組態參數在 Aurora MySQL 第 3 版中具有新名稱。

為了相容性，您可以檢查 `mysql` 用戶端中的參數名稱，方法是在初始 Aurora MySQL 第 3 版中使用任一名稱。修改自訂參數群組中的值時，您只能使用新名稱。舊的參數名稱將在未來版本中移除。


|  要移除的名稱  |  新名稱或偏好名稱  | 
| --- | --- | 
|  aurora\$1fwd\$1master\$1idle\$1timeout  |  aurora\$1fwd\$1writer\$1idle\$1timeout  | 
|  aurora\$1fwd\$1master\$1max\$1connections\$1pct  |  aurora\$1fwd\$1writer\$1max\$1connections\$1pct  | 
|  master\$1verify\$1checksum  |  source\$1verify\$1checksum  | 
|  sync\$1master\$1info  |  sync\$1source\$1info  | 
|  init\$1slave  |  init\$1replica  | 
|  rpl\$1stop\$1slave\$1timeout  |  rpl\$1stop\$1replica\$1timeout  | 
|  log\$1slow\$1slave\$1statements  |  log\$1slow\$1replica\$1statements  | 
|  slave\$1max\$1allowed\$1packet  |  replica\$1max\$1allowed\$1packet  | 
|  slave\$1compressed\$1protocol  |  replica\$1compressed\$1protocol  | 
|  slave\$1exec\$1mode  |  replica\$1exec\$1mode  | 
|  slave\$1type\$1conversions  |  replica\$1type\$1conversions  | 
|  slave\$1sql\$1verify\$1checksum  |  replica\$1sql\$1verify\$1checksum  | 
|  slave\$1parallel\$1type  |  replica\$1parallel\$1type  | 
|  slave\$1preserve\$1commit\$1order  |  replica\$1preserve\$1commit\$1order  | 
|  log\$1slave\$1updates  |  log\$1replica\$1updates  | 
|  slave\$1allow\$1batching  |  replica\$1allow\$1batching  | 
|  slave\$1load\$1tmpdir  |  replica\$1load\$1tmpdir  | 
|  slave\$1net\$1timeout  |  replica\$1net\$1timeout  | 
|  sql\$1slave\$1skip\$1counter  |  sql\$1replica\$1skip\$1counter  | 
|  slave\$1skip\$1errors  |  replica\$1skip\$1errors  | 
|  slave\$1checkpoint\$1period  |  replica\$1checkpoint\$1period  | 
|  slave\$1checkpoint\$1group  |  replica\$1checkpoint\$1group  | 
|  slave\$1transaction\$1retries  |  replica\$1transaction\$1retries  | 
|  slave\$1parallel\$1workers  |  replica\$1parallel\$1workers  | 
|  slave\$1pending\$1jobs\$1size\$1max  |  replica\$1pending\$1jobs\$1size\$1max  | 
|  pseudo\$1slave\$1mode  |  pseudo\$1replica\$1mode  | 

 下列預存程序在 Aurora MySQL 第 3 版中具有新名稱。

 為了相容性，您可以在初始的 Aurora MySQL 第 3 版中使用任一個名稱。未來版本將移除舊的程序名稱。


|  要移除的名稱  |  新名稱或偏好名稱  | 
| --- | --- | 
|  mysql.rds\$1set\$1master\$1auto\$1position  |  mysql.rds\$1set\$1source\$1auto\$1position  | 
|  mysql.rds\$1set\$1external\$1master  |  mysql.rds\$1set\$1external\$1source  | 
|  mysql.rds\$1set\$1external\$1master\$1with\$1auto\$1position  |  mysql.rds\$1set\$1external\$1source\$1with\$1auto\$1position  | 
|  mysql.rds\$1reset\$1external\$1master  |  mysql.rds\$1reset\$1external\$1source  | 
|  mysql.rds\$1next\$1master\$1log  |  mysql.rds\$1next\$1source\$1log  | 

## AUTO\$1INCREMENT 值
<a name="AuroraMySQL.mysql80-autoincrement"></a>

 在 Aurora MySQL 第 3 版中，Aurora 會在其重新啟動每個資料庫執行個體時保留每個資料表的 `AUTO_INCREMENT` 值。在 Aurora MySQL 第 2 版中，重新啟動後未保留 `AUTO_INCREMENT` 值。

 從快照還原、執行時間點復原，以及複製叢集來設定新叢集時，不會保留 `AUTO_INCREMENT` 值。在這些情況下，`AUTO_INCREMENT` 值會在建立快照時初始化為基於資料表中最大資料欄值的值。這種行為與 RDS for MySQL 8.0 中不同，其中 `AUTO_INCREMENT` 值會在這些作業期間保留。

## 二進位日誌複寫
<a name="AuroraMySQL.mysql80-binlog"></a>

 在 MySQL 8.0 社群版中，預設為開啟二進位日誌複寫。在 Aurora MySQL 第 3 版中，預設為關閉二進位日誌複寫。

**提示**  
 如果 Aurora 內建複寫功能滿足您的高可用性需求，您可以將二進位日誌複寫保留關閉狀態。如此一來，就可以避免二進位日誌複寫的效能負荷。也可以避免管理二進位日誌複寫所需的相關聯監控和疑難排解。

 Aurora 支援二進位日誌從 MySQL 5.7 相容來源複寫到 Aurora MySQL 第 3 版。來源系統可以是 Aurora MySQL 資料庫叢集、RDS for MySQL 資料庫執行個體或內部部署 MySQL 執行個體。

 與社群 MySQL 一樣，Aurora MySQL 支援從執行特定版本的來源複寫到執行相同主要版本或更高主要版本的目標。例如，不支援從 MySQL 5.6 相容系統複寫到 Aurora MySQL 第 3 版。不支援從 Aurora MySQL 第 3 版複寫到 MySQL 5.7 相容系統或 MySQL 5.6 相容系統。如需使用二進位日誌複寫的詳細資訊，請參閱 [Aurora 與 MySQL 之間或 Aurora 與另一個 Aurora 資料庫叢集之間的複寫 (二進位複寫)](AuroraMySQL.Replication.MySQL.md)。

 Aurora MySQL 第 3 版包含對社群 MySQL 8.0 中二進位日誌複寫的改進，例如篩選的複寫。如需有關社群 MySQL 8.0 改進的詳細資訊，請參閱《MySQL 參考手冊》**中的[伺服器如何評估複寫篩選規則](https://dev.mysql.com/doc/refman/8.0/en/replication-rules.html)。

### 二進位日誌複寫的交易壓縮
<a name="AuroraMySQL.binlog-transaction-compression"></a>

 如需二進位日誌壓縮的用法資訊，請參閱《MySQL 參考手冊》中的[二進位日誌交易壓縮](https://dev.mysql.com/doc/refman/8.0/en/binary-log-transaction-compression.html)。

 下列限制適用於 Aurora MySQL 第 3 版中的二進位日誌壓縮：
+  其二進位日誌資料大於最大允許封包大小的交易不會進行壓縮。無論 Aurora MySQL 二進位日誌壓縮設定是否開啟，都會發生此情況。這類交易會在不壓縮的情況下進行複寫。
+  如果您對尚未支援 MySQL 8.0 的變更資料擷取 (CDC) 使用連接器，則無法使用此功能。建議您使用二進位日誌壓縮，完整測試任何第三方連接器。此外，建議您先這樣做，然後在針對 CDC 使用 binlog 複寫的系統上開啟 binlog 壓縮。

# 比較 Aurora MySQL 第 3 版與 MySQL 8.0 社群版
<a name="AuroraMySQL.Compare-80-v3"></a>

您可以使用下列資訊，來了解當您從不同的 MySQL 8.0 相容系統轉換為 Aurora MySQL 第 3 版時，應注意的變更。

 通常，Aurora MySQL 第 3 版支援社群 MySQL 8.0.23 的功能集。來自 MySQL 8.0 社群版的一些新功能不適用於 Aurora MySQL。其中有些功能與 Aurora 的某些方面不相容，例如 Aurora 儲存架構。不需要其他功能，因為 Amazon RDS 管理服務會提供同等功能。社群 MySQL 8.0 中的下列功能不受支援，或在 Aurora MySQL 第 3 版中以不同方式運作。

 如需所有 Aurora MySQL 第 3 版的版本備註，請參閱 *Aurora MySQL 版本備註*中的 [Amazon Aurora MySQL 第 3 版的資料庫引擎更新](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html)。

**Topics**
+ [MySQL 8.0 功能不適用於 Aurora MySQL 第 3 版](#AuroraMySQL.Compare-80-v3-features)
+ [角色型權限模型](#AuroraMySQL.privilege-model)
+ [尋找資料庫伺服器 ID](#AuroraMySQL.server-id)
+ [身分驗證](#AuroraMySQL.mysql80-authentication)

## MySQL 8.0 功能不適用於 Aurora MySQL 第 3 版
<a name="AuroraMySQL.Compare-80-v3-features"></a>

來自社群 MySQL 8.0 中的下列功能無法使用，或在 Aurora MySQL 第 3 版中以不同方式運作。
+ Aurora MySQL 中不支援資源群組和相關聯的 SQL 陳述式。
+ Aurora MySQL 不支援使用者定義的復原資料表空間和相關聯的 SQL 陳述式，例如 `CREATE UNDO TABLESPACE`、`ALTER UNDO TABLESPACE ... SET INACTIVE` 和 `DROP UNDO TABLESPACE`。
+ 對於低於 3.06 的 Aurora MySQL 版本，Aurora MySQL 不支援復原資料表空間截斷。在 Aurora MySQL 3.06 版和更新版本中，支援[自動復原資料表空間截斷](https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html#truncate-undo-tablespace)。
+ 支援密碼驗證外掛程式。
+ 您無法修改任何 MySQL 外掛程式的設定，包括密碼驗證外掛程式。
+ 不支援 X 外掛程式。
+ 不支援多來源複寫。

## 角色型權限模型
<a name="AuroraMySQL.privilege-model"></a>

使用 Aurora MySQL 第 3 版，您無法直接修改 `mysql` 資料庫中的資料表。尤其，您無法藉由插入至 `mysql.user` 資料表來設定使用者。相反地，您可以使用 SQL 陳述式來授與角色型權限。您也無法建立其他類型的物件，例如 `mysql` 資料庫中已存放的程序。您仍然可以查詢 `mysql` 資料表。如果您使用二進位日誌複寫，則直接對來源叢集上 `mysql` 資料表所做的變更不會複寫至目標叢集。

 在某些情況下，您的應用程式可能會使用捷徑來建立使用者或其他物件，方法是插入至 `mysql` 資料表。若是這樣，請變更您應用程式的程式碼來使用對應的陳述式，例如 `CREATE USER`。如果您的應用程式在 `mysql` 資料庫中建立已存放的程序或其他物件，請改為使用不同的資料庫。

若要在遷移期間從外部 MySQL 資料庫匯出資料庫使用者的中繼資料，您可以使用 MySQL Shell 命令，而不是 `mysqldump`。如需詳細資訊，請參閱[執行個體傾印公用程式、結構描述傾印公用程式和資料表傾印公用程式](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-dump-instance-schema.html#mysql-shell-utilities-dump-about)。

若要簡化許多使用者或應用程式的權限管理，您可以使用 `CREATE ROLE` 陳述式來建立具有一組權限的角色。然後，您可以使用 `GRANT` 和 `SET ROLE` 陳述式，以及 `current_role` 函數，將角色指派給使用者或應用程式、切換目前角色，並檢查哪些角色有效。如需 MySQL 8.0 中角色型權限系統的詳細資訊，請參閱《MySQL 參考手冊》中的[使用角色](https://dev.mysql.com/doc/refman/8.0/en/roles.html)。

**重要**  
我們強烈建議您不要直接在您的應用程式中使用主要使用者。而是遵循最佳實務，使用以應用程式所需的最低權限建立的資料庫使用者。

**Topics**
+ [rds\$1superuser\$1role](#AuroraMySQL.privilege-model.rds_superuser_role)
+ [權限檢查使用者是否有二進位日誌複寫](#AuroraMySQL.privilege-model.binlog)
+ [存取其他 AWS 服務的角色](#AuroraMySQL.privilege-model.other)

### rds\$1superuser\$1role
<a name="AuroraMySQL.privilege-model.rds_superuser_role"></a>

Aurora MySQL 第 3 版包含具有下列所有權限的特殊角色。此角色已命名為 `rds_superuser_role`。每個叢集的主要管理使用者已授與此角色。`rds_superuser_role` 角色包含所有資料庫物件的下列權限：
+ `ALTER`
+ `APPLICATION_PASSWORD_ADMIN`
+ `ALTER ROUTINE`
+ `CONNECTION_ADMIN`
+ `CREATE`
+ `CREATE ROLE`
+ `CREATE ROUTINE`
+ `CREATE TEMPORARY TABLES`
+ `CREATE USER`
+ `CREATE VIEW`
+ `DELETE`
+ `DROP`
+ `DROP ROLE`
+ `EVENT`
+ `EXECUTE`
+ `FLUSH_OPTIMIZER_COSTS` (Aurora MySQL 3.09 版及更新版本)
+ `FLUSH_STATUS` (Aurora MySQL 3.09 版及更新版本)
+ `FLUSH_TABLES` (Aurora MySQL 3.09 版及更新版本)
+ `FLUSH_USER_RESOURCES` (Aurora MySQL 3.09 版及更新版本)
+ `INDEX`
+ `INSERT`
+ `LOCK TABLES`
+ `PROCESS`
+ `REFERENCES`
+ `RELOAD`
+ `REPLICATION CLIENT`
+ `REPLICATION SLAVE`
+ `ROLE_ADMIN`
+ `SET_USER_ID`
+ `SELECT`
+ `SHOW DATABASES`
+ `SHOW_ROUTINE` (Aurora MySQL 3.04 版及更新版本)
+ `SHOW VIEW`
+ `TRIGGER`
+ `UPDATE`
+ `XA_RECOVER_ADMIN`

角色定義還包括 `WITH GRANT OPTION`，以便管理使用者可以將該角色授與其他使用者。尤其，管理員必須授與執行二進位日誌複寫所需的任何權限，以 Aurora MySQL 叢集做為目標。

**提示**  
若要查看權限的完整詳細資訊，請輸入下列陳述式。  

```
SHOW GRANTS FOR rds_superuser_role@'%';
SHOW GRANTS FOR name_of_administrative_user_for_your_cluster@'%';
```

### 權限檢查使用者是否有二進位日誌複寫
<a name="AuroraMySQL.privilege-model.binlog"></a>

Aurora MySQL 第 3 版包含權限檢查使用者是否有二進位日誌 (binlog) 複寫，`rdsrepladmin_priv_checks_user`。除了 `rds_superuser_role` 的權限之外，此使用者還有 `replication_applier` 權限。

當您呼叫 `mysql.rds_start_replication` 預存程序來開啟 binlog 複寫時，`rdsrepladmin_priv_checks_user` 會建立。

`rdsrepladmin_priv_checks_user@localhost` 使用者是預留使用者。請勿修改它。

### 存取其他 AWS 服務的角色
<a name="AuroraMySQL.privilege-model.other"></a>

Aurora MySQL 第 3 版包含您可用來存取其他 AWS 服務的角色。您可以設定許多這些角色作為授予權限的替代方案。例如，您可以指定 `GRANT AWS_LAMBDA_ACCESS TO user`，而不是 `GRANT INVOKE LAMBDA ON *.* TO user`。如需存取其他 AWS 服務的程序，請參閱 [將 Amazon Aurora MySQL 與其他 AWS 服務整合](AuroraMySQL.Integrating.md)。Aurora MySQL 第 3 版包含下列與存取其他服務相關的角色 AWS ：
+ `AWS_LAMBDA_ACCESS` – 作為 `INVOKE LAMBDA` 權限的替代項目。如需使用方式的資訊，請參閱 [從 Amazon Aurora MySQL 資料庫叢集叫用 Lambda 函式](AuroraMySQL.Integrating.Lambda.md)。
+ `AWS_LOAD_S3_ACCESS` – 作為 `LOAD FROM S3` 權限的替代項目。如需使用方式的資訊，請參閱 [從 Amazon S3 儲存貯體中的文字檔案將資料載入 Amazon Aurora MySQL 資料庫叢集](AuroraMySQL.Integrating.LoadFromS3.md)。
+ `AWS_SELECT_S3_ACCESS` – 作為 `SELECT INTO S3` 權限的替代項目。如需使用方式的資訊，請參閱 [將來自 Amazon Aurora MySQL 資料庫叢集的資料儲存至 Amazon S3 儲存貯體中的文字檔案](AuroraMySQL.Integrating.SaveIntoS3.md)。
+ `AWS_COMPREHEND_ACCESS` – 作為 `INVOKE COMPREHEND` 權限的替代項目。如需使用方式的資訊，請參閱 [授與資料庫使用者存取 Aurora Machine Learning 的權限](mysql-ml.md#aurora-ml-sql-privileges)。
+ `AWS_SAGEMAKER_ACCESS` – 作為 `INVOKE SAGEMAKER` 權限的替代項目。如需使用方式的資訊，請參閱 [授與資料庫使用者存取 Aurora Machine Learning 的權限](mysql-ml.md#aurora-ml-sql-privileges)。
+ `AWS_BEDROCK_ACCESS` – Amazon Bedrock 沒有類似 `INVOKE` 權限。如需使用方式的資訊，請參閱 [授與資料庫使用者存取 Aurora Machine Learning 的權限](mysql-ml.md#aurora-ml-sql-privileges)。

當使用 Aurora MySQL 第 3 版中的角色授與存取權時，您也可以使用 `SET ROLE role_name` 或 `SET ROLE ALL` 陳述式啟用角色。下列範例會顯示作法。以適當的角色名稱替代 `AWS_SELECT_S3_ACCESS`。

```
# Grant role to user.

mysql> GRANT AWS_SELECT_S3_ACCESS TO 'user'@'domain-or-ip-address'

# Check the current roles for your user. In this case, the AWS_SELECT_S3_ACCESS role has not been activated.
# Only the rds_superuser_role is currently in effect.
mysql> SELECT CURRENT_ROLE();
+--------------------------+
| CURRENT_ROLE()           |
+--------------------------+
| `rds_superuser_role`@`%` |
+--------------------------+
1 row in set (0.00 sec)

# Activate all roles associated with this user using SET ROLE.
# You can activate specific roles or all roles.
# In this case, the user only has 2 roles, so we specify ALL.
mysql> SET ROLE ALL;
Query OK, 0 rows affected (0.00 sec)

# Verify role is now active
mysql> SELECT CURRENT_ROLE();
+-----------------------------------------------------+
| CURRENT_ROLE()                                      |
+-----------------------------------------------------+
| `AWS_SELECT_S3_ACCESS`@`%`,`rds_superuser_role`@`%` |
+-----------------------------------------------------+
```

## 尋找資料庫伺服器 ID
<a name="AuroraMySQL.server-id"></a>

二進位記錄 (binlog) 複寫需要資料庫伺服器 ID (`server_id`)。在 Aurora MySQL 和 Community MySQL 中尋找伺服器 ID MySQL 的方式不同。

在 Community MySQL 中，伺服器 ID 是您在登入伺服器時使用下列語法取得的數字：

```
mysql> select @@server_id;

+-------------+
| @@server_id |
+-------------+
| 2           |
+-------------+
1 row in set (0.00 sec)
```

在 Aurora MySQL 中，伺服器 ID 是您在登入資料庫執行個體時使用下列語法取得的資料庫執行個體 ID：

```
mysql> select @@aurora_server_id;

+------------------------+
| @@aurora_server_id     |
+------------------------+
| mydbcluster-instance-2 |
+------------------------+
1 row in set (0.00 sec)
```

如需 binlog 複寫的詳細資訊，請參閱 [Aurora 與 MySQL 之間或 Aurora 與另一個 Aurora 資料庫叢集之間的複寫 (二進位複寫)](AuroraMySQL.Replication.MySQL.md)。

## 身分驗證
<a name="AuroraMySQL.mysql80-authentication"></a>

在社群 MySQL 8.0 中，預設身分驗證外掛程式為 `caching_sha2_password`。Aurora MySQL 第 3 版仍會使用 `mysql_native_password` 外掛程式。您無法變更 `default_authentication_plugin` 設定。不過，您可以建立新的使用者並變更目前的使用者，而且其個別密碼會使用新的身分驗證外掛程式。以下是範例。

```
mysql> CREATE USER 'testnewsha'@'%' IDENTIFIED WITH caching_sha2_password BY 'aNewShaPassword';
Query OK, 0 rows affected (0.74 sec)
```

# 升級至 Aurora MySQL 第 3 版
<a name="AuroraMySQL.mysql80-upgrade-procedure"></a>

如需將資料庫從 Aurora MySQL 第 2 版升級到第 3 版的相關資訊，請參閱 [升級 Amazon Aurora MySQL 資料庫叢集的主要版本](AuroraMySQL.Updates.MajorVersionUpgrade.md)。