下列限制適用於線上 DDL 操作
在
TEMPORARY TABLE
上建立索引時,會複製資料表。如果資料表上有
ON...CASCADE
或ON...SET NULL
約束,則不允許使用ALTER TABLE
子句LOCK=NONE
。在就地線上 DDL 操作完成之前,它必須等待在資料表上持有中繼資料鎖定的交易認可或回滾。線上 DDL 操作在其執行階段可能會短暫需要資料表上的獨佔中繼資料鎖定,並且在操作的最後階段更新資料表定義時總是需要一個獨佔鎖定。因此,在資料表上持有中繼資料鎖定的交易可能會導致線上 DDL 操作遭到封鎖。在資料表上持有中繼資料鎖定的交易可能是在線上 DDL 操作之前或期間開始的。在資料表上持有中繼資料鎖定的長時間執行或非作用中交易可能會導致線上 DDL 操作逾時。
執行就地線上 DDL 操作時,執行
ALTER TABLE
語句的執行緒會套用從其他連線執行緒在同一個資料表上同時執行的 DML 操作線上日誌。當套用 DML 操作時,即使重複的項目只是暫時的,且稍後會被線上日誌中的項目還原,也可能會遇到重複的索引鍵項目錯誤 (錯誤 1062 (23000): 重複的項目)。這類似於InnoDB
中的外來索引鍵約束檢查,其中約束在交易期間必須成立。對於
InnoDB
資料表,OPTIMIZE TABLE
會對應到ALTER TABLE
操作,以重建資料表、更新索引統計資料,並釋放叢集索引中未使用的空間。 次要索引的建立效率較低,因為索引鍵是按照它們在主索引鍵中出現的順序插入的。 對於重建常規和分割的InnoDB
資料表,OPTIMIZE TABLE
支援線上 DDL 功能。在 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 效能和並行性」。