以下限制適用於線上 DDL 操作
在
TEMPORARY TABLE
上建立索引時,會複製資料表。如果資料表上有
ON...CASCADE
或ON...SET NULL
限制,則不允許ALTER TABLE
子句LOCK=NONE
。在原地線上 DDL 操作完成之前,它必須等待持有資料表上中繼資料鎖定的交易提交或回滾。線上 DDL 操作在其執行階段可能會短暫需要資料表上的獨佔中繼資料鎖定,並且在更新資料表定義的操作最終階段始終需要一個。因此,持有資料表上中繼資料鎖定的交易可能會導致線上 DDL 操作被封鎖。持有資料表上中繼資料鎖定的交易可能是在線上 DDL 操作之前或期間開始的。持有資料表上中繼資料鎖定的長時間執行或非活動交易可能會導致線上 DDL 操作逾時。
當執行原地線上 DDL 操作時,執行
ALTER TABLE
陳述式的執行緒會套用從其他連線執行緒同時在同一個資料表上執行的 DML 操作的線上日誌。當套用 DML 操作時,即使重複的項目只是暫時性的,並且會被線上日誌中的後續項目還原,也可能會遇到重複的鍵值項目錯誤 (ERROR 1062 (23000): 項目重複)。這類似於InnoDB
中外鍵限制檢查的概念,其中限制必須在交易期間保持有效。對於
InnoDB
資料表,OPTIMIZE TABLE
會對應到ALTER TABLE
操作,以重建資料表並更新叢集索引中的索引統計資料和釋放未使用的空間。次要索引的建立效率不高,因為鍵值是按照它們在主要鍵值中出現的順序插入的。OPTIMIZE TABLE
支援使用線上 DDL 支援來重建常規和分割的InnoDB
資料表。在 MySQL 5.6 之前建立的資料表,其中包含時間類型欄 (
DATE
、DATETIME
或TIMESTAMP
),並且未使用ALGORITHM=COPY
重建的,則不支援ALGORITHM=INPLACE
。在這種情況下,ALTER TABLE ... ALGORITHM=INPLACE
操作會傳回以下錯誤ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
以下限制通常適用於涉及重建資料表的大型資料表上的線上 DDL 操作
沒有機制可以暫停線上 DDL 操作,或限制線上 DDL 操作的 I/O 或 CPU 使用率。
如果操作失敗,線上 DDL 操作的回滾可能會很昂貴。
長時間執行的線上 DDL 操作可能會導致複寫延遲。線上 DDL 操作必須先在來源端執行完成,才能在複本端執行。此外,在來源端同時處理的 DML,也必須等到複本端的 DDL 操作完成後,才會在複本端處理。
有關在大型資料表上執行線上 DDL 操作的更多資訊,請參閱第 17.12.2 節,「線上 DDL 效能與並行」。