Amazon RDS for MySQL 的已知問題和限制 - Amazon Relational Database Service

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

Amazon RDS for MySQL 的已知問題和限制

使用 Amazon RDS for MySQL 的已知問題和限制如下所示。

InnoDB 保留字詞

InnoDB 是用於 RDS for MySQL 的保留字詞。此名稱無法用於 MySQL 資料庫。

Amazon RDS for MySQL 的儲存已滿行為

當 MySQL 資料庫執行個體的儲存空間已滿時,可能會出現中繼資料不一致、字典不符和孤立表格。若要避免這些問題,Amazon RDS 應自動停止達到 storage-full 狀態的資料庫執行個體。

MySQL 資料庫執行個體在下列情況下達到 storage-full 狀態:

  • 資料庫執行個體的儲存空間少於 20,000 MiB,可用儲存空間達到 200 MiB 或更少。

  • 資料庫執行個體擁有超過 102,400 MiB 的儲存空間,可用儲存空間達到 1024 MiB 或更少。

  • 資料庫執行個體的儲存空間介於 20,000 MiB 和 102,400 MiB 之間,且可用的儲存空間少於 1%。

由於資料庫執行個體達到 storage-full 狀態,因此 Amazon RDS 自動停止它之後,您仍然可以進行修改。若要重新啟動資料庫執行個體,請至少完成下列其中一項:

進行其中一項變更後,資料庫執行個體會自動重新啟動。如需修改資料庫執行個體的相關資訊,請參閱修改 Amazon RDS 資料庫執行個體

InnoDB 緩衝集區大小不一致

若為 MySQL 5.7,目前在管理 InnoDB 緩衝集區大小的方式中有一個錯誤。MySQL 5.7 可能將 innodb_buffer_pool_size 參數的值調整為非常大的值,因而導致 InnoDB 緩衝集區過大並使用過多的記憶體。此效果可能導致 MySQL 資料庫引擎停止執行,或可能阻止其啟動。對於可用記憶體更少的資料庫執行個體類別,此問題更常發生。

若要解決此問題,請將 innodb_buffer_pool_size 參數的值設為 innodb_buffer_pool_instances 參數值與 innodb_buffer_pool_chunk_size 參數值之乘積的倍數。例如,您可能將 innodb_buffer_pool_size 參數值設為 innodb_buffer_pool_instancesinnodb_buffer_pool_chunk_size 參數值之乘積的八倍,如下列範例所示。

innodb_buffer_pool_chunk_size = 536870912 innodb_buffer_pool_instances = 4 innodb_buffer_pool_size = (536870912 * 4) * 8 = 17179869184

如需此 MySQL 5.7 錯誤的詳細資訊,請參閱 MySQL 文件中的 https://bugs.mysql.com/bug.php?id=79379

索引合併最佳化傳回不正確的結果

使用索引合併最佳化的查詢可能會傳回不正確的結果,因為 MySQL 查詢最佳化工具在 MySQL 5.5.37 中引入了錯誤。當您對具有多個索引的資料表發出查詢請求,最佳化工具可以根據多個索引來掃描資料列範圍,卻無法正確地合併結果。如需查詢最佳化器錯誤的詳細資訊,請參閱 MySQL 錯誤資料庫中的 http://bugs.mysql.com/bug.php?id=72745http://bugs.mysql.com/bug.php?id=68194

例如,考慮對具有兩個索引的資料表進行查詢,其中搜尋引數會參考具索引的資料欄。

SELECT * FROM table1 WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';

在此情況下,搜尋引擎將搜尋這兩個索引。不過,由於 錯誤,合併的結果不正確。

若要解決此問題,您可以執行下列項目之一:

  • 對於您的 MySQL 資料庫執行個體,將 optimizer_switch 參數設為資料庫參數群組中的 index_merge=off。如需設定資料庫參數群組參數的相關資訊,請參閱Amazon RDS 的參數群組

  • 將 MySQL 資料庫執行個體升級為 MySQL 5.7 或 8.0 版。如需詳細資訊,請參閱RDS for MySQL 資料庫引擎的升級

  • 如果您無法升級執行個體或變更 optimizer_switch 參數,則可以藉由明確地識別查詢的索引來解決錯誤,例如:

    SELECT * FROM table1 USE INDEX covering_index WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';

如需詳細資訊,請參閱 MySQL 文件中的索引合併最佳化

Amazon RDS 資料庫執行個體的 MySQL 參數例外狀況

與 Amazon RDS 資料庫執行個體搭配使用時,部分 MySQL 參數需要特殊考量。

lower_case_table_names

因為 Amazon RDS 會使用區分大小寫檔案系統,所以不支援將 lower_case_table_names 伺服器參數的值設為 2 (名稱按原狀儲存,但以小寫形式進行比較)。以下是 Amazon RDS for MySQL 資料庫執行個體支援的值:

  • 所有 RDS for MySQL 版本都支援 0 (名稱按原狀儲存,且比較會區分大小寫)。

  • RDS for MySQL 5.7 版、8.0.28 版和更新版本 8.0 版,以及 8.4 版支援 1 (存放在小寫和比較中的名稱不區分大小寫)。

在建立資料庫執行個體之前,請在自訂資料庫參數群組中設定 lower_case_table_names 參數。然後,在建立資料庫執行個體時,指定自訂資料庫參數群組。

當參數群組與版本低於 8.0 的 MySQL 資料庫執行個體相關聯時,建議您避免變更參數群組中的 lower_case_table_names 參數。變更該參數可能導致與時間點復原備份和僅供讀取複本資料庫執行個體產生不一致。

當參數群組與 8.0 或 8.4 版 MySQL 資料庫執行個體相關聯時,您無法修改lower_case_table_names參數群組中的參數。

僅供讀取複本應該一律使用與來源資料庫執行個體相同的 lower_case_table_names 參數值。

長查詢時間

您可以將 long_query_time 參數設為浮點值,以便您可以利用微秒解析,將緩慢查詢記錄至 MySQL 緩慢查詢日誌。您可以設定一值,例如 0.1 秒 (即 100 微秒),以在偵錯所花時間不到一秒的緩慢交易時提供協助。

Amazon RDS 中的 MySQL 檔案大小限制

對於 MySQL 8.0 版和更新版本的資料庫執行個體,檔案大小上限為 16 TiB。使用file-per-table資料表空間時,檔案大小上限會將 InnoDB 資料表的大小限制為 16 TiB。根據預設,InnoDB file-per-table 資料表空間 (其資料表每一個都在自己的資料表空間中) 是針對 MySQL 資料庫執行個體設定的。如需詳細資訊,請參閱 MySQL 文件中的 InnoDB 限制

注意

部分現有的資料庫執行個體具有較低的限制。例如,在 2014 年 4 月之前建立的 MySQL 資料庫執行個體具有 2 TB 的檔案和資料表大小限制。無論何時建立資料庫執行個體,此 2-TB 檔案大小限制也適用於從 2014 年 4 月之前取得之快照建立的資料庫執行個體或僅供讀取複本。

使用 InnoDB file-per-table 資料表空間有優缺點,取決於您的應用程式。如要判斷您應用程式的最佳方式,請前往 MySQL 文件中的 File-Per-Table 表格空間

不建議允許資料表成長至檔案大小上限。一般來說,更理想的做法是將資料表分割成更小的資料表,如此可以改善效能並縮短復原時間。

您可以用於將大型資料表分成更小資料表的選項為分割。「分割」會根據您指定的規則,將大型資料表的部分分散成個別檔案。例如,如果您依日期儲存交易,則可以建立分割規則,使用分割將較舊的交易分配成個別檔案。然後,您可以定期封存不需要立即可供應用程式使用的歷史交易資料。如需詳細資訊,請參閱 MySQL 文件中的分割

因為沒有可提供所有資料表和 InnoDB 系統資料表空間大小的單一系統資料表或檢視,因此您必須查詢多個資料表,以判斷資料表空間的大小。

決定 InnoDB 系統資料表空間和資料字典資料表空間的大小
  • 使用下列 SQL 命令來判斷您的任何資料表空間是否太大,且為進行分割的候選者。

    注意

    資料字典資料表空間專屬於 MySQL 8.0 和更高版本。

    select FILE_NAME,TABLESPACE_NAME, ROUND(((TOTAL_EXTENTS*EXTENT_SIZE) /1024/1024/1024), 2) as "File Size (GB)" from information_schema.FILES where tablespace_name in ('mysql','innodb_system');
決定 InnoDB 系統資料表空間之外的 InnoDB 使用者資料表大小 (適用於 MySQL 5.7 版)
  • 使用下列 SQL 命令來判斷您是否有太大的資料表,且為進行分割的候選者。

    SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2) as "Tablespace Size (GB)" FROM information_schema.INNODB_SYS_TABLESPACES ORDER BY 3 DESC;
判斷 InnoDB 系統資料表空間外的 InnoDB 使用者資料表大小 (適用於 MySQL 8.0 和更新版本)
  • 使用下列 SQL 命令來判斷您是否有太大的資料表,且為進行分割的候選者。

    SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2) as "Tablespace Size (GB)" FROM information_schema.INNODB_TABLESPACES ORDER BY 3 DESC;
決定非 InnoDB 使用者資料表的大小
  • 使用下列 SQL 命令,判斷您的任何非 InnoDB 使用者資料表是否太大。

    SELECT TABLE_SCHEMA, TABLE_NAME, round(((DATA_LENGTH + INDEX_LENGTH+DATA_FREE) / 1024 / 1024/ 1024), 2) As "Approximate size (GB)" FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema') and ENGINE<>'InnoDB';
啟用 InnoDB file-per-table 資料表空間
  • 在資料庫執行個體的參數群組中,將 innodb_file_per_table 參數設為 1

停用 InnoDB file-per-table 資料表空間
  • 在資料庫執行個體的參數群組中,將 innodb_file_per_table 參數設為 0

如需更新參數群組的相關資訊,請參閱Amazon RDS 的參數群組

當啟用或停用了 InnoDB file-per-table 資料表空間,您可以發出 ALTER TABLE 命令,將資料表從全域資料表空間移至其自己的資料表空間,或從其自己的資料表空間移至全域資料表空間,如下列範例所示:

ALTER TABLE table_name TABLESPACE=innodb_file_per_table;

不支援 MySQL Keyring 外掛程式

Amazon RDS for MySQL 目前不支援 MySQL keyring_aws Amazon Web Services Keyring 外掛程式。

自訂連接埠

Amazon RDS 會封鎖 MySQL 引擎的自訂連接埠 33060 的連線。為您的 MySQL 引擎選擇不同的連接埠。

MySQL 預存程序限制

如果 MySQL 使用者名稱長度超過 16 個字元,則在以下版本的 RDS for MySQL 上,mysql.rds_kill 和 mysql.rds_kill_query 預存程序無法終止該使用者擁有的工作階段或查詢:

  • 8.0.32 和較低的 8 版本

  • 5.7.41 和較低的 5.7 版本

使用外部來源執行個體進行 GTID 式複寫

Amazon RDS 支援根據外部 MySQL 執行個體的全域交易識別符 (GTIDs) 複寫到需要在組態期間設定 GTID_PURGED 的 Amazon RDS for MySQL 資料庫執行個體。不過,只有 RDS for MySQL 8.0.37 和更新版本支援此功能。

MySQL 預設身分驗證外掛程式

RDS for MySQL 8.0.34 版和更新的 8.0 版使用 mysql_native_password外掛程式。您無法變更 default_authentication_plugin 設定。

RDS for MySQL 8.4 版和更高版本使用 caching_sha2_password 外掛程式做為預設身分驗證外掛程式。您可以變更 MySQL 8.4 的預設身分驗證外掛程式。mysql_native_password 外掛程式仍然適用於 MySQL 8.4,但此外掛程式的支援以 MySQL 8.4 結束。若要變更預設身分驗證外掛程式,請建立自訂參數群組並修改 authentication_policy 參數的值。如需詳細資訊,請參閱預設和自訂參數群組

覆寫 innodb_buffer_pool_size

在微型或小型資料庫執行個體類別中, innodb_buffer_pool_size 參數的預設值可能與執行下列命令傳回的值不同:

mysql> SELECT @@innodb_buffer_pool_size;

當 Amazon RDS 在管理資料庫執行個體類別時需要覆寫預設值時,可能會發生此差異。如有必要,您可以覆寫預設值,並將其設定為資料庫執行個體類別支援的值。若要判斷有效值,請新增資料庫執行個體上可用的記憶體用量和總記憶體。如需詳細資訊,請參閱 Amazon RDS 執行個體類型

如果您的資料庫執行個體只有 4 GB 的記憶體,則無法innodb_buffer_pool_size設定為 8 GB,但您可以將其設定為 3 GB,具體取決於您為其他參數配置的記憶體數量。

如果您輸入的值太大,Amazon RDS 會將該值降低到下列限制:

  • Micro 資料庫執行個體類別:256 MB

  • db.t4g.micro 資料庫執行個體類別:128 MB

從 MySQL 5.7 升級到 MySQL 8.4

您無法直接從 MySQL 5.7 升級到 MySQL 8.4。您必須先從 MySQL 5.7 升級到 MySQL 8.0,然後從 MySQL 8.0 升級到 MySQL 8.4。如需詳細資訊,請參閱RDS for MySQL 的主要版本升級

InnoDB 頁面壓縮

InnoDB 頁面壓縮不適用於檔案系統區塊大小為 16k 的 Amazon RDS 資料庫執行個體,因為檔案系統區塊大小必須小於 InnoDB 頁面大小。從 2024 年 2 月開始,所有新建立的資料庫執行個體都有 16k 的檔案系統區塊大小,可提高輸送量並減少頁面排清期間的 IOPS 耗用。