View a markdown version of this page

Amazon RDS 故障診斷 - Amazon Relational Database Service

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

Amazon RDS 故障診斷

下列各節可幫助您對 Amazon RDS 和 Amazon Aurora 資料庫執行個體的問題進行故障診斷。

如需使用 Amazon RDS API 偵錯問題的相關資訊,請參閱對 Amazon RDS 上的應用程式進行故障診斷。

無法連線至 Amazon RDS 資料庫執行個體

無法連線至資料庫執行個體時,下列是常見的原因:

  • 傳入規則 – 您的本機防火牆強制執行的存取規則,與您獲授權可存取資料庫執行個體的 IP 地址可能不符。問題很可能在於安全群組中的傳入規則。

    預設情況下,資料庫執行個體不允許存取。存取是透過與 VPC 相關聯的安全群組授予,該群組允許可傳入和傳出資料庫執行個體的流量。如有必要,請將特定情況的傳入和傳出規則新增至安全群組。您可以指定 IP 地址、IP 地址範圍,或其他 VPC 安全群組。

    注意

    新增傳入規則時,您可以針對 Source (來源) 選擇 My IP (我的 IP),以允許從瀏覽器中偵測到的 IP 位址存取資料庫執行個體。

    如需設定安全群組的詳細資訊,請參閱建立安全群組以存取在您的 VPC 中您的資料庫執行個體。

    注意

    不允許從 169.254.0.0/16 範圍內的 IP 地址連線的用戶端。這是「自動私有 IP 定址範圍」(APIPA),它用於本機連結定址。

  • 公開存取性– 若要從 VPC 外部連線至資料庫執行個體 (例如,使用用戶端應用程式),則執行個體必須具有指派給它的公用 IP 位址。

    若要讓執行個體可供公開存取,請修改並選擇 Public accessibility (公開存取性) 下方的 Yes (是)。如需詳細資訊,請參閱在 VPC 中的網際網路中隱藏資料庫執行個體。

  • 連接埠:由於本機防火牆限制,建立資料庫執行個體時指定的連接埠無法用來傳送或接收通訊。若要判斷您的網路是否允許將指定的連線埠用於傳入和傳出通訊,請洽詢網路管理員。

  • Availability (可用性) – 對於新建立的資料庫執行個體,資料庫執行個體的狀態為 creating,直到資料庫執行個體可供使用為止。狀態變更為 available 時,您便能連線至資料庫執行個體。根據資料庫執行個體的大小,可能需要最多 20 分鐘的時間,執行個體才會可用。

  • 網際網路閘道 – 若要開放公開存取資料庫執行個體,其資料庫子網路群組中的子網路必須具備網際網路閘道。

    設定子網路的網際網路閘道
    1. 登入 AWS 管理主控台 ,並在 https://https://console.aws.amazon.com/rds/ 開啟 Amazon RDS 主控台。

    2. 在導覽窗格中,選擇 Databases (資料庫),然後選擇資料庫執行個體的名稱。

    3. 在 Connectivity & security (連線能力和安全性) 標籤中,寫下 VPC 下的 VPC ID,以及 Subnets (子網路) 下的子網路 ID。

    4. 在 https://console.aws.amazon.com/vpc/ 開啟 Amazon VPC 主控台。

    5. 在導覽窗格中,選擇 Internet Gateways (網際網路閘道)。請確認已經有網際網路閘道連結到 VPC。否則,請選擇 Create Internet Gateway (建立網際網路閘道),來建立網際網路閘道。選取網際網路閘道,然後選取 Attach to VPC (連結至 VPC),接著遵循指示,來將此閘道連結至 VPC。

    6. 在導覽窗格中,選取 Subnets (子網),然後選取子網。

    7. 在 Route Table (路由表) 索引標籤中,確認有包含 0.0.0.0/0 的路由做為目的地,以及有 VPC 的網際網路閘道做為目標。

      如果您是使用其 IPv6 地址來連線到執行個體,請確認有針對所有 IPv6 流量 (::/0) 的路由,來指向網際網路閘道。若否,請執行下列操作:

      1. 選擇路由表 ID (rtb-xxxxxxxx) 以導覽至路由表。

      2. 在 Routes (路由) 標籤中,選擇 Edit routes (編輯路由)。選擇 Add route (新增路由),使用 0.0.0.0/0 做為目的地,並以網際網路閘道為目標。

        若是 IPv6,請選擇 Add route (新增路由),使用 ::/0 做為目的地,並以網際網路閘道為目標。

      3. 選擇 Save routes (儲存路由)。

      此外,若要嘗試連線至 IPv6 端點,請確保用戶端 IPv6 地址範圍有權連線至資料庫執行個體。

    如需詳細資訊,請參閱在 VPC 中使用資料庫執行個體。

對於引擎特定連線問題,請參閱下列主題:

測試資料庫執行個體的連線

您可以使用通用的 Linux 或 Microsoft Windows 工具來測試您對資料庫執行個體的連線。

您可以從 Linux 或 Unix 終端機測試連線,方法是輸入下列命令。將 DB-instance-endpoint 取代為端點並將 port 取代為資料庫執行個體的連線埠。

nc -zv DB-instance-endpoint port

例如,下列示範範例命令和傳回值:

nc -zv postgresql1.c6c8mn7fake0.us-west-2.rds.amazonaws.com 8299 Connection to postgresql1.c6c8mn7fake0.us-west-2.rds.amazonaws.com 8299 port [tcp/vvr-data] succeeded!

Windows 使用者可以使用 Telnet 來測試對資料庫執行個體的連線。Telnet 動作僅支援用於測試連線。如果連線成功,動作不會傳回訊息。如果連線不成功,您會收到類似如下的錯誤訊息:

C:\>telnet sg-postgresql1.c6c8mntfake0.us-west-2.rds.amazonaws.com 819 Connecting To sg-postgresql1.c6c8mntfake0.us-west-2.rds.amazonaws.com...Could not open connection to the host, on port 819: Connect failed

如果 Telnet 動作成功傳回,您的安全群組即已正確設定。

注意

Amazon RDS 不接受網際網路控制訊息通訊協定 (ICMP) 流量,包括 ping。

對連線身分驗證進行故障診斷

在某些情況下,您可以連線至資料庫執行個體,但會收到身分驗證錯誤。在這些情況下,您可能會重設資料庫執行個體的主要使用者密碼。請修改 RDS 執行個體,以便執行此動作。

如需修改 資料庫執行個體的詳細資訊,請參閱修改 Amazon RDS 資料庫執行個體。

Amazon RDS 安全問題

為了避免安全問題,請勿將您的 AWS 帳戶 根使用者電子郵件地址和密碼用於使用者帳戶。最佳實務是使用您的根使用者來建立使用者,並將那些使用者指派給資料庫使用者帳戶。如果必要,也可以使用您的根使用者來建立其他使用者帳戶。

如需建立使用者的相關資訊,請參閱在您的 AWS 帳戶中建立 IAM 使用者。如需在 中建立使用者的資訊 AWS IAM Identity Center,請參閱在 IAM Identity Center 中管理身分。

錯誤訊息「無法擷取帳戶屬性,某些主控台功能可能受損。」

您可以基於數個原因而收到此錯誤。這可能是因為您的帳戶缺少權限,或是您的帳戶並未適當設定。如果您的帳戶是新帳戶,您可能就不需等待帳戶就緒。如果這是現有的帳戶,您的存取政策中可能缺乏許可,因此無法執行某些動作 (例如建立資料庫執行個體)。若要修正問題,您的管理員需要為您的帳戶提供必要角色。如需詳細資訊,請參閱 IAM 文件。

對不相容的網路狀態進行故障診斷

不相容的網路狀態,表示資料庫可能在資料庫層級仍可存取,但您無法修改或重新啟動它。

原因

資料庫執行個體的不相容網路狀態可能是下列其中一個動作所造成:

  • 修改資料庫執行個體類別。

  • 修改資料庫執行個體以使用多可用區域資料庫叢集部署。

  • 由於維護事件而取代主機。

  • 啟動更換用資料庫執行個體。

  • 從快照備份還原。

  • 啟動之前已停止的資料庫執行個體。

Resolution

使用 start-db-instance 命令

若要修正處於不相容網路狀態的資料庫,請依照下列指示執行:

  1. 開啟 https://console.aws.amazon.com/rds/,並從導覽窗格選擇資料庫。

  2. 選擇處於不相容網路狀態的資料庫執行個體,並記下連線與安全性索引標籤中的資料庫執行個體識別符、VPC ID 和子網路 ID。

  3. 使用 AWS CLI 執行 start-db-instance命令。指定 --db-instance-identifier 值。

    注意

    若在資料庫處於不相容模式時執行此命令,可能會造成短暫停機時間。

    start-db-instance 命令無法解決 RDS for SQL Server 資料庫執行個體的此問題。

如果命令成功執行,您的資料庫狀態會變更為可用。

如果您的資料庫重新啟動,資料庫執行個體可能會執行在執行個體進入不相容網路狀態之前,於執行個體上執行的最後一項操作。這樣可能會讓執行個體再次進入不相容的網路狀態。

如果 start-db-instance 命令失敗,或執行個體再次進入不相容的網路狀態,請在 RDS 主控台中開啟資料庫,然後選取資料庫。導覽至日誌與事件區段。最近的事件區段會顯示要採取的進一步解決步驟。訊息分類如下:

  • INTERNAL RESOURCE CHECK (內部資源檢查):您的內部資源可能發生問題。

  • DNS CHECK (DNS 檢查):在 VPC 主控台中檢查 VPC 的 DNS 解析和主機名稱。

  • ENI CHECK (ENI 檢查):資料庫的彈性網路介面 (ENI) 可能不存在。

  • GATEWAY CHECK (閘道檢查):公開可用資料庫的網際網路閘道未連線至 VPC。

  • IP CHECK (IP 檢查):子網路中沒有空出的 IP 地址。

  • SECURITY GROUP CHECK (安全群組檢查):您的資料庫沒有相關聯的安全群組,或是安全群組無效。

  • SUBNET CHECK (子網路檢查):您的資料庫子網路群組中沒有有效的子網路,或子網路發生問題。

  • VPC CHECK (VPC 檢查):與您的資料庫相關聯的 VPC 無效。

執行時間點復原

最佳實務是擁有備份 (快照或邏輯),以免您的資料庫進入不相容的網路狀態。請參閱 備份簡介。如果您已開啟自動備份,則暫停任何寫入資料庫的操作,並執行時間點復原。

注意

在執行個體進入不相容的網路狀態後,可能無法存取資料庫執行個體來執行邏輯備份。

如果您未開啟自動備份,請建立新的資料庫執行個體。然後使用 AWS Database Migration Service (AWS DMS),或使用備份與還原工具來遷移資料。

如果這無法解決問題,請聯絡 支援 以取得進一步協助。

重新設定資料庫執行個體擁有者密碼

如果您遭到鎖定資料庫 執行個體,則可以用主要使用者身分登入。然後,您可以重設其他系統管理使用者或角色的認證。如果您無法以主要使用者身分登入, AWS 帳戶擁有者可以重設主要使用者密碼。如需您可能需要重設哪些管理帳戶或角色的詳細資訊,請參閱主要使用者帳戶權限。

您可以使用 Amazon RDS 主控台、 AWS CLI 命令 modify-db-instance,或使用 ModifyDBInstance API 操作來變更資料庫執行個體密碼。如需修改 資料庫執行個體的詳細資訊,請參閱修改 Amazon RDS 資料庫執行個體。

Amazon RDS 資料庫執行個體停機或重新開機

重新啟動資料庫執行個體時,可能會發生資料庫執行個體當機。當資料庫執行個體進入防止受到存取的狀態,以及當資料庫重新啟動時,均可能發生當機。在您手動將資料庫執行個體重新開機時,就會重新開機。當您變更需要重新開機才會生效的資料庫執行個體設定時,也會發生重新開機。

當您變更需要重新開機才會生效的設定,或當您手動進行重新開機時,才會發生資料庫執行個體重新開機。如果您變更設定並要求該變更立即生效,即會立即發生重新開機。或者,它會在資料庫執行個體的維護時段期間發生。

發生下列其中一個動作時,資料庫執行個體會立即重新開機:

  • 您將資料庫執行個體的備份保留期間從 0 變更為非零值,或從非零值變更為 0。然後將 Apply Immediately (立即套用) 設為 true。

  • 您變更資料庫執行個體類別,並且將 Apply Immediately (立即套用) 設為 true。

  • 您將儲存類型從 Magnetic (Standard) (磁帶 (標準)) 變更為 General Purpose (SSD) (一般用途 (SSD)) 或 Provisioned IOPS (SSD) (佈建 IOPS (SSD)),或從 Provisioned IOPS (SSD) (佈建 IOPS (SSD)) 或 General Purpose (SSD) (一般用途 (SSD)) 變更為 Magnetic (Standard) (磁帶 (標準))。

發生下列其中一個動作時,維護時段期間會發生資料庫執行個體重新開機:

  • 您將資料庫執行個體的備份保留期間從 0 變更為非零值,或從非零值變更為 0,並且將 Apply Immediately (立即套用) 設為 false。

  • 您變更資料庫執行個體類別,並且將 Apply Immediately (立即套用) 設為 false。

變更資料庫參數群組中的靜態參數時,在與參數群組相關聯的資料庫執行個體重新開機之後,變更才會生效。變更需要手動重新開機。在維護時段期間,不會自動重新啟動資料庫執行個體。

如需查看資料表,以了解資料庫執行個體動作與設定 Apply Immediately (立即套用) 值會產生的效果,請參閱修改 Amazon RDS 資料庫執行個體。

Amazon RDS 資料庫參數變更未生效

在某些情況下,您可能會變更資料庫參數群組中的參數,但不會看到變更生效。若是如此,您可能需要重新啟動與 DB 參數群組關聯的資料庫執行個體。當您變更動態參數時,變更會立即生效。當您變更靜態參數時,在您重新啟動與參數群組關聯的資料庫實體之前,變更將不會生效。

您可以使用 RDS 主控台重新啟動資料庫執行個體。或者,您可以明確呼叫 RebootDBInstance API 操作。如果資料庫執行個體處於多可用區部署中,即可重新啟動,而不需容錯移轉。若在變更靜態參數之後,要求重新啟動相關聯的資料庫執行個體,將有助於降低參數組態錯誤影響 API 呼叫的風險。其中一個例子是呼叫 ModifyDBInstance 變更資料庫執行個體類別。如需詳細資訊,請參閱修改 Amazon RDS 中的資料庫參數群組中的參數。

Amazon RDS 資料庫執行個體用盡儲存體

如果您的資料庫執行個體用盡儲存空間,將不再可用。強烈建議您持續監控在 CloudWatch​ 中發佈的 FreeStorageSpace​ 指標,藉此確保資料庫執行個體有充足的可用儲存空間。

如果您的資料庫執行個體用盡儲存體,其狀態將變更為 storage-full。例如,對已用完其儲存體之資料庫執行個體 DescribeDBInstances API 操作的呼叫有下列輸出:

aws rds describe-db-instances --db-instance-identifier mydbinstance DBINSTANCE mydbinstance 2009-12-22T23:06:11.915Z db.m5.large mysql8.0 50 sa storage-full mydbinstance.clla4j4jgyph.us-east-1.rds.amazonaws.com 3306 us-east-1b 3 SECGROUP default active PARAMGRP default.mysql8.0 in-sync

若要從此案例中復原,請使用 ModifyDBInstance API 操作或下列 AWS CLI 命令,將更多儲存空間新增至執行個體。

針對 Linux、macOS 或 Unix:

aws rds modify-db-instance \ --db-instance-identifier mydbinstance \ --allocated-storage 60 \ --apply-immediately

在 Windows 中:

aws rds modify-db-instance ^ --db-instance-identifier mydbinstance ^ --allocated-storage 60 ^ --apply-immediately
DBINSTANCE mydbinstance 2009-12-22T23:06:11.915Z db.m5.large mysql8.0 50 sa storage-full mydbinstance.clla4j4jgyph.us-east-1.rds.amazonaws.com 3306 us-east-1b 3 60 SECGROUP default active PARAMGRP default.mysql8.0 in-sync

現在,描述資料庫執行個體時,將會看到資料庫執行個體 modifying 狀態,這表示正在擴展儲存體。

aws rds describe-db-instances --db-instance-identifier mydbinstance
DBINSTANCE mydbinstance 2009-12-22T23:06:11.915Z db.m5.large mysql8.0 50 sa modifying mydbinstance.clla4j4jgyph.us-east-1.rds.amazonaws.com 3306 us-east-1b 3 60 SECGROUP default active PARAMGRP default.mysql8.0 in-sync

一旦儲存體擴展完成,您的資料庫執行個體狀態將變更為 available。

aws rds describe-db-instances --db-instance-identifier mydbinstance
DBINSTANCE mydbinstance 2009-12-22T23:06:11.915Z db.m5.large mysql8.0 60 sa available mydbinstance.clla4j4jgyph.us-east-1.rds.amazonaws.com 3306 us-east-1b 3 SECGROUP default active PARAMGRP default.mysql8.0 in-sync

您可以使用 DescribeEvents 操作,在您的儲存空間用盡時收到通知。例如,在此案例中,如果您於這些操作之後執行 DescribeEvents 呼叫,將看到下列輸出:

aws rds describe-events --source-type db-instance --source-identifier mydbinstance
2009-12-22T23:44:14.374Z mydbinstance Allocated storage has been exhausted db-instance 2009-12-23T00:14:02.737Z mydbinstance Applying modification to allocated storage db-instance 2009-12-23T00:31:54.764Z mydbinstance Finished applying modification to allocated storage

Amazon RDS 可用資料庫執行個體不足

在嘗試建立、啟動或修改資料庫執行個體時,會傳回 InsufficientDBInstanceCapacity 錯誤。在嘗試從資料庫快照還原資料庫執行個體時,也會傳回錯誤。傳回此錯誤時,常見原因是無法在要求的可用區域中使用指定的資料庫執行個體類別。您可以嘗試以下其中一項來解決此問題:

  • 使用不同的資料庫執行個體類別來重試此請求。

  • 使用不同的可用區域來重試此請求。

  • 重試該請求,但不指定明確的可用區域。

如需對 Amazon EC2 執行個體容量問題進行故障診斷的資訊,請參閱《Amazon EC2 ​使用者指南》中的執行個體容量不足。

如需修改資料庫執行個體的相關資訊,請參閱 修改 Amazon RDS 資料庫執行個體。

Amazon RDS 中的可用記憶體問題

可用記憶體是資料庫執行個體上可供資料庫引擎使用的隨機存取記憶體 (RAM) 總計。它是可用作業系統 (OS) 記憶體與可用緩衝區和頁面快取記憶體的總和。資料庫引擎使用主機上大多數的記憶體,但作業系統處理程序也使用一些 RAM。目前配置給資料庫引擎或作業系統處理程序目前所使用的記憶體不包括在可用記憶體中。當資料庫引擎記憶體不足時,資料庫執行個體會使用一般用於緩衝和快取的暫時空間。如前所述,此暫時空間包括在可用記憶體中。

您可以在 Amazon CloudWatch 中使用 FreeableMemory 指標以監控可用記憶體。如需詳細資訊,請參閱Amazon RDS 的監控工具。

如果資料庫執行個體在可用記憶體方面持續不足或使用交換空間,請考慮縱向擴展為更大的資料庫執行個體類別。如需詳細資訊,請參閱 資料庫執行個體類別。

您也可以變更記憶體設定。例如,在 RDS for MySQL,您可以調整 innodb_buffer_pool_size 參數的大小。依預設,此參數設定為實體記憶體的 75%。如需更多 MySQL 的疑難排解秘訣,請參閱如何疑難排解 Amazon RDS for MySQL 資料庫中可用記憶體不足的問題?

MySQL 和 MariaDB 問題

您可以診斷並修正 MySQL 和 MariaDB 資料庫執行個體的問題。

MySQL 及 MariaDB 連線上限

RDS for MySQL 或 MariaDB 資料庫執行個體允許的連線數上限,取決於資料庫執行個體類別可用的記憶體數量。資料庫執行個體可用的記憶體越多,可用的連線數就越多。如需資料庫執行個體類別的詳細資訊,請參閱 資料庫執行個體類別。

依預設,資料庫執行個體的連線限制會設為資料庫執行個體類別的上限。您可以將並行連線數限制為任何值,最大為允許的連線數上限。使用資料庫執行個體中參數群組的 max_connections 參數。如需更多詳細資訊,請參閱 資料庫連線數上限 及 Amazon RDS 的參數群組。

您可以執行下列查詢,以擷取 MySQL 或 MariaDB 資料庫執行個體允許的連線數上限。

SELECT @@max_connections;

您可以執行下列查詢,以擷取 MySQL 或 MariaDB 資料庫執行個體的作用中連線數目。

SHOW STATUS WHERE `variable_name` = 'Threads_connected';

診斷和解決記憶體限制的不相容參數狀態

當滿足下列條件時,MariaDB 或 MySQL 資料庫執行個體可以置於記憶體限制的不相容參數狀態中:

  • 當資料庫執行個體狀態為可用時,執行個體會在一小時內至少重新啟動三次,或在一天內至少重新啟動五次。

  • 嘗試重新啟動資料庫執行個體失敗,因為維護動作或監控程序無法重新啟動資料庫執行個體。

  • 資料庫執行個體的潛在記憶體用量超過配置給其資料庫執行個體類別的記憶體 1.2 倍。

當資料庫執行個體在一小時內第三次重新啟動時,或在一天內第五次重新啟動時,它會執行記憶體用量檢查。此檢查會計算資料庫執行個體的潛在記憶體用量。計算所傳回的值是下列值的總和:

  • 值 1 – 下列參數的總和:

    • innodb_additional_mem_pool_size

    • innodb_buffer_pool_size

      您可以修改 innodb_buffer_pool_size 的值。不過,該值不一定符合您輸入的內容。此不相符情形的發生原因有幾個。首先,如果資料庫執行個體是微型資料庫執行個體,我們會覆寫預設值並將其設定為 256 MB。如需詳細資訊,請參閱覆寫 innodb_buffer_pool_size。

      其次,我們確保 500 MB 的記憶體保留在主機管理員、引擎、作業系統和核心的資料庫執行個體。

      最後,我們將 innodb_buffer_pool_size 分成數個單位進行最佳化。主機管理員會四捨五入至那些單位中最接近的倍數。單位的計算方式是將 innodb_buffer_pool_chunk_size 乘以 innodb_buffer_pool_instances。如需詳細資訊,請參閱 MySQL 文件中的設定 InnoDB 緩衝集區大小。

      除非 innodb_buffer_pool_size 小於 1 GB,否則 innodb_buffer_pool_instances 的預設值為 8。如果 innodb_buffer_pool_size 小於 1 GB,則 innodb_buffer_pool_instances 的預設值為 1。innodb_buffer_pool_chunk_size 的預設值為 128 MB。

    • innodb_log_buffer_size

    • key_buffer_size

    • query_cache_size (僅限 MySQL 5.7 版)

    • tmp_table_size

  • 值 2 – max_connections 參數乘以下參數的總和:

    • binlog_cache_size

    • join_buffer_size

    • read_buffer_size

    • read_rnd_buffer_size

    • sort_buffer_size

    • thread_stack

  • 值 3 – 如果已啟用 performance_schema 參數,請將 max_connections 參數乘以 429498。

    如果停用 performance_schema 參數,則此值為零。

因此,計算返回的值如下:

Value 1 + Value 2 + Value 3

當此值超過配置給資料庫執行個體使用之資料庫執行個體類別的記憶體 1.2 倍時,資料庫執行個體會置於不相容參數的狀態。如需配置給資料庫執行個體類別之記憶體的相關資訊,請參閱 資料庫執行個體類別的硬體規格。

計算將 max_connections 參數的值乘以數個參數的總和。如果 max_connections 參數設定為較大的值,則可能會導致檢查傳回資料庫執行個體潛在記憶體用量非常高的值。在這種情況下,請考慮降低 max_connections 參數的值。

若要解決此問題,請完成下列步驟:

  1. 調整與資料庫執行個體相關聯的資料庫參數群組中的記憶體參數。這樣做,可讓潛在的記憶體用量低於配置給其資料庫執行個體類別的記憶體 1.2 倍。

    如需有關設定參數的詳細資訊,請參閱 修改 Amazon RDS 中的資料庫參數群組中的參數。

  2. 重新啟動資料庫執行個體。

    如需有關設定參數的詳細資訊,請參閱 啟動之前已停止的 Amazon RDS 資料庫執行個體。

診斷和解決僅供讀取複本之間的延遲

建立 MySQL 或 MariaDB 僅供讀取複本且僅供讀取複本可供使用之後,Amazon RDS 會先複寫從開始僅供讀取複本建立操作起始起,對來源資料庫執行個體進行的變更。在此階段期間,僅供讀取複本的複寫延遲時間將大於 0。您可以在 Amazon CloudWatch 中檢視 Amazon RDS ReplicaLag 指標,進而監控此延遲時間。

ReplicaLag 指標會回報 MariaDB 的 Seconds_Behind_Master 欄位值,或是 MySQL SHOW REPLICA STATUS 命令。如需詳細資訊,請參閱 MySQL 文件中的 SHOW REPLICA STATUS 陳述式。

當 ReplicaLag 指標到達 0,複本即已跟上來源資料庫執行個體。如果 ReplicaLag 指標傳回 -1,複寫可能為非作用中。若要對複寫錯誤進行故障診斷,請參閱 診斷和解決 MySQLor MariaDB 讀取複寫失敗。如果 ReplicaLag 的值為 -1,也可能表示系統無法判斷 Seconds_Behind_Master 值,或該值為 NULL。

注意

MariaDB 以前的版本使用 SHOW SLAVE STATUS 而不是 SHOW REPLICA STATUS。如果您使用低於 10.5 的 MariaDB 版本,請使用 SHOW SLAVE STATUS。

在網路中斷期間,或在維護時段套用修補程式時,ReplicaLag 指標即會傳回 -1。在這種情況下,請等候系統還原網路連線,或是等待維護時段結束,隨後再重新檢查 ReplicaLag 指標。

MySQL 和 MariaDB 讀取複製技術是非同步的。因此您可以預期來源資料庫執行個體的 BinLogDiskUsage 指標與僅供讀取複本上的 ReplicaLag 指標偶爾會增加。例如,請考慮一個情況,其中來源資料庫執行個體可同時出現大量寫入操作。同時,會使用單一輸入/輸出執行緒,對僅供讀取複本的寫入操作進行序列化。這種情況可能會導致來源執行個體和僅供讀取複本之間發生延遲。

如需僅供讀取複本和 MySQL 的詳細資訊,請參閱 MySQL 文件中的複寫實作詳細資訊。如需僅供讀取複本和 MariaDB 的詳細資訊,請參閱 MariaDB 文件中的複寫概觀。

您可以利用執行下列動作,減少對來源資料庫執行個體的更新與對僅供讀取複本的後續更新之間的延遲:

  • 將僅供讀取複本的資料庫執行個體類別設定為與來源資料庫執行個體具有相等的儲存體大小。

  • 確保來源資料庫執行個體和僅供讀取複本所使用的資料庫參數群組中的參數設定相容。如需詳細資訊和範例,請參閱下一節中 max_allowed_packet 參數的討論。

  • 停用查詢快取。針對經常修改的資料表,因為快取已遭鎖定並且經常重新整理,使用查詢快取可能會增加複本延遲。若是這種情況,如果停用查詢快取,您可能會發現複本延遲較少。您可以在資料庫執行個體的資料庫參數群組中將 query_cache_type parameter 設定為 0,以停用查詢快取。如需查詢快取的詳細資訊,請參閱查詢快取組態。

  • 為 MySQL 或 MariaDB 的 InnoDB 備妥僅供讀取複本上的緩衝區集區。如果您有經常更新的一組小型資料表,並且使用 InnoDB 或 XtraDB 資料表結構描述。在這種情況下,傾印僅供讀取複本上的那些資料表。這麼做會造成資料庫引擎掃描來自磁碟之那些資料表的資料列,然後將它們快取在緩衝集區中。如此可減少複本延遲。下列顯示一個範例。

    對於 Linux、macOS 或 Unix:

    PROMPT> mysqldump \ -h <endpoint> \ --port=<port> \ -u=<username> \ -p <password> \ database_name table1 table2 > /dev/null

    在 Windows 中:

    PROMPT> mysqldump ^ -h <endpoint> ^ --port=<port> ^ -u=<username> ^ -p <password> ^ database_name table1 table2 > /dev/null

診斷和解決 MySQLor MariaDB 讀取複寫失敗

Amazon RDS 會監控僅供讀取複本的複寫狀態。如果複寫因任何原因停止,RDS 會將僅供讀取複本執行個體的 Replication State (複寫狀態) 欄位更新為 Error。您可以透過檢視 Replication Error (複寫錯誤) 欄位,檢閱 MySQL 或 MariaDB 引擎擲出之相關聯錯誤的詳細資訊。也會產生指出僅供讀取複本之狀態的事件,包括 RDS-EVENT-0045、RDS-EVENT-0046 和 RDS-EVENT-0057。如需事件和訂閱事件的詳細資訊,請參閱使用 Amazon RDS 事件通知。如果傳回 MySQL 錯誤訊息,請在 MySQL 錯誤訊息文件中檢閱錯誤。如果傳回了 MariaDB 錯誤訊息,請在 MariaDB 錯誤訊息文件中檢閱錯誤。

可能造成複寫錯誤的常見情況包括下列:

  • 僅供讀取複本之 max_allowed_packet 參數的值小於來源資料庫執行個體之 max_allowed_packet 參數的值。

    max_allowed_packet 參數是您可以在資料庫參數群組中設定的自訂參數。max_allowed_packet 參數可用來指定可在資料庫上執行的資料處理語言 (DML) 大小上限。在某些情況下,來源資料庫執行個體的 max_allowed_packet 值可能大於僅供讀取複本的 max_allowed_packet 值。若是如此,複寫程序會擲回錯誤並停止複寫。最常見的錯誤為 packet bigger than 'max_allowed_packet' bytes。您可以透過讓來源和僅供讀取複本使用具有相同 max_allowed_packet 參數值的資料庫參數群組,藉此修正錯誤。

  • 寫入僅供讀取複本上的資料表。如果您在僅供讀取複本上建立索引,您需要將 read_only 參數設為 0 才能建立索引。如果您要寫入僅供讀取複本上的資料表,可能中斷複寫。

  • 使用非交易儲存引擎 (例如 MyISAM)。僅供讀取複本需要交易儲存引擎。複寫只支持以下儲存引擎:MySQL 或 MariaDB 的 InnoDB。

    您可以使用下列命令,將 MyISAM 資料表轉換為 InnoDB:

    alter table <schema>.<table_name> engine=innodb;

  • 使用不安全的非確定性查詢 (例如 SYSDATE())。如需詳細資訊,請參閱 MySQL 文件中的二進位日誌記錄中安全和不安全陳述式的判定。

下列步驟有助於解決您的複寫錯誤:

如果複寫錯誤已修復,Replication State (複寫狀態) 會變更為 replicating (複寫中)。如需更多詳細資訊,請參閱 對 MySQL 僅供讀取複本問題進行故障診斷。

建立將二進位日誌啟用的觸發器需要 SUPER 權限

嘗試在 RDS for MySQL 或 RDS for MariaDB 資料庫執行個體中建立觸發器時,您可能會收到下列錯誤。

"You do not have the SUPER privilege and binary logging is enabled"

若要在二進位日誌記錄啟用時使用觸發器,需要 SUPER 權限,該權限受限於 RDS for MySQL 和 RDS for MariaDB 資料庫執行個體。當二進位日誌已啟用但沒有 SUPER 權限時,您可以將 log_bin_trust_function_creators 參數設定為 true 來建立觸發器。若要將 log_bin_trust_function_creators 設定為 true,請建立新的資料庫參數群組或修改現有的資料庫參數群組。

您可以建立新的資料庫參數群組,以便您可以在二進位日誌啟用的情況下,在 RDS for MySQL 或 RDS for MariaDB 資料庫執行個體中建立觸發條件。若要這樣做,請使用下列 CLI 命令。若要修改現有的參數群組,請從步驟 2 開始。

使用 CLI 建立新的參數群組以允許啟用二進位日誌的觸發器
  1. 建立新的參數群組。

    對於 Linux、macOS 或 Unix:

    aws rds create-db-parameter-group \ --db-parameter-group-name allow-triggers \ --db-parameter-group-family mysql8.0 \ --description "parameter group allowing triggers"

    在 Windows 中:

    aws rds create-db-parameter-group ^ --db-parameter-group-name allow-triggers ^ --db-parameter-group-family mysql8.0 ^ --description "parameter group allowing triggers"
  2. 修改資料庫參數群組以允許觸發器。

    對於 Linux、macOS 或 Unix:

    aws rds modify-db-parameter-group \ --db-parameter-group-name allow-triggers \ --parameters "ParameterName=log_bin_trust_function_creators, ParameterValue=true, ApplyMethod=pending-reboot"

    在 Windows 中:

    aws rds modify-db-parameter-group ^ --db-parameter-group-name allow-triggers ^ --parameters "ParameterName=log_bin_trust_function_creators, ParameterValue=true, ApplyMethod=pending-reboot"
  3. 修改資料庫執行個體以使用新資料庫參數群組。

    對於 Linux、macOS 或 Unix:

    aws rds modify-db-instance \ --db-instance-identifier mydbinstance \ --db-parameter-group-name allow-triggers \ --apply-immediately

    在 Windows 中:

    aws rds modify-db-instance ^ --db-instance-identifier mydbinstance ^ --db-parameter-group-name allow-triggers ^ --apply-immediately
  4. 若要讓變更生效,請手動將資料庫執行個體重新開機。

    aws rds reboot-db-instance --db-instance-identifier mydbinstance

診斷和解決時間點還原失敗

還原包含暫存資料表的資料庫執行個體

嘗試 MySQL 或 MariaDB 資料庫執行個體的時間點還原 (PITR) 時,您可能會遇到下列錯誤:

Database instance could not be restored because there has been incompatible database activity for restore functionality. Common examples of incompatible activity include using temporary tables, in-memory tables, or using MyISAM tables. In this case, use of Temporary table was detected.

PITR 仰賴於來自 MySQL 或 MariaDB 的備份快照和二進位記錄檔來將資料庫執行個體還原到特定時間。暫存資料表資訊在二進位記錄檔中可能不可靠,並且可能造成 PITR 失敗。如果在 MySQL 或 MariaDB 資料庫執行個體中使用暫存資料表,透過更頻繁地備份,即可以降低 PITR 失敗的可能性。暫存資料表的建立和下一個備份快照之間的時間,最可能發生 PITR 失敗。

還原包括記憶體內資料表的資料庫執行個體

還原具有記憶體內資料表的資料庫時,您可能會遇到問題。會在重新啟動期間清除記憶體內資料表。因此,您的記憶體內資料表在重新開機之後可能會是空白的。建議您使用記憶體內資料表時,思考您的解決方案以便在重新啟動時處理空白資料表。如果您使用具有複製資料庫執行個體的記憶體內資料表,則可能需要在重新啟動後,重新建立僅供讀取複本。如果將僅供讀取複本重新開機,而且無法從空白的記憶體內資料表還原資料,則可能必須進行此操作。

如需備份和 PITR 的詳細資訊,請參閱備份簡介和將 Amazon RDS 的資料庫執行個體還原至指定時間。

複寫已停止錯誤

當您呼叫 mysql.rds_skip_repl_error 命令時,可能會收到錯誤訊息,指出複寫已關閉或停用。

因為複寫已停止且無法重新啟動,因此出現此錯誤訊息。

如果您需要略過大量錯誤,複寫延遲可能增加至超出二進位記錄檔的預設保留期間。在此情況下,由於在清除二進位日誌檔之前已在複本上重播該檔案,您可能會遇到嚴重錯誤。此清除動作會導致複寫停止,而您將無法再呼叫 mysql.rds_skip_repl_error 命令來略過複寫錯誤。

透過增加二進位記錄檔在複寫主控端上保留的小時數,即可以減輕此問題。在延長二進位記錄檔保留時間之後,您可以重新啟動複寫,並視需要呼叫 mysql.rds_skip_repl_error 命令。

若要設定 binlog 保留時間,請使用 mysql.rds_set_configuration 程序。並指定 'binlog retention hours' 組態參數,以及資料庫叢集上保留二進位記錄檔的時數 (最多 720 小時 (30 天))。下列範例會將 binlog 檔案的保留期間設定為 48 小時。

CALL mysql.rds_set_configuration('binlog retention hours', 48);

僅供讀取複本建立失敗或複寫中斷,出現嚴重錯誤 1236

變更 MySQL 或 MariaDB 資料庫執行個體的預設參數值之後,您可能會遇到下列其中一個問題:

  • 您無法建立資料庫執行個體的僅供讀取複本。

  • 複寫失敗,出現 fatal error 1236。

MySQL 及 MariaDB DB 執行個的一些預設參數,有助於確定資 料庫符合 ACID 規定,而且僅供讀取複本不會當機。之所以能實現這個結果,是在認可之前,確定均透過將交易寫入二進位日誌,而讓每項認可獲得完全同步。將這些參數從其預設值進行變更以改善效能,在尚未將交易寫入二進位記錄時,可能造成複寫失敗。

若要解決此問題,請設定下列參數值:

  • sync_binlog = 1

  • innodb_support_xa = 1

  • innodb_flush_log_at_trx_commit = 1

僅供讀取複本複寫無法初始化中繼資料結構

嘗試開始複寫時,您收到下列錯誤訊息:

Read Replica Replication Error - SQLError: 13124, reason: Replica failed to initialize applier metadata structure from the repository

當複本的中繼資料結構發生問題時,就會發生此錯誤。若要修正中繼資料結構,您必須建立新的複本。

若要防止未來發生這種情況,請執行下列其中一個動作:

  • 如果可能,請在複本停用多執行緒。從 MySQL 8.0.27 開始,預設會啟用多執行緒。

  • 如果您需要在複本使用多執行緒,我們建議您使用 GTID 式複寫。如需詳細資訊,請參閱使用 GTID 式複寫。

無法將備份保留期間設定為 0

需要將備份保留期間設定為 0 有數個原因。例如,您可以透過將保留期間設定為 0 來立即停用自動備份。

在某些情況下,您可能會將值設定為 0,並收到一則訊息,表示保留期間必須介於 1 到 35 之間。在這些情況下,請檢查以確定您尚未設定執行個體的僅供讀取複本。僅供讀取複本需要用於管理僅供讀取複本日誌的備份,因此,您不可以設定 0 的保留期間。