[英]MySQL Online DDL changes completing, but not persisting
我有一個非常大的表(> 60 億行和> 3tb 數據),我正試圖改變它。
示例架構:
CREATE TABLE `huge_table` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`col1` int(11) unsigned DEFAULT NULL,
`col2` int(11) unsigned DEFAULT NULL,
`col3` int(11) unsigned NOT NULL,
`col4` int(11) unsigned DEFAULT NULL,
`col5` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`col6` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`col7` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`col8` datetime GENERATED ALWAYS AS (cast(`created` as date)) VIRTUAL,
`dt1` timestamp(3) NULL DEFAULT NULL,
`dt2` timestamp(3) NULL DEFAULT NULL,
`dt3` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `idx_col5` (`col5`),
KEY `col4` (`col4`),
KEY `col1` (`col1`),
KEY `col3` (`col3`),
KEY `col6` (`col6`,`col3`),
KEY `col2` (`col2`),
KEY `col8` (`col8`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
大多數這些索引是不必要的,所以我試圖清理它們,並添加一個更精確的索引。 請注意,以下所有ALTER TABLE
語句的運行時間超過 24 小時。
首先,我嘗試使用 Online DDL 修改所有索引:
ALTER TABLE huge_table
DROP INDEX col4_idx,
DROP INDEX col1_idx,
DROP INDEX col3_idx,
DROP INDEX col6_idx,
DROP INDEX col2_idx,
DROP INDEX col8_idx,
ADD INDEX new_idx(col3, col6, col1),
ALGORITHM=INPLACE, LOCK=NONE;
當這最終完成(沒有錯誤)時,我檢查了架構,卻發現架構中沒有任何變化。 因此,我決定在不強迫它運行“INPLACE”的情況下再試一次:
ALTER TABLE huge_table
DROP INDEX col4_idx,
DROP INDEX col1_idx,
DROP INDEX col3_idx,
DROP INDEX col6_idx,
DROP INDEX col2_idx,
DROP INDEX col8_idx,
ADD INDEX new_idx(col3, col6, col1);
這也不起作用(它似乎仍在在線模式下運行)。 我決定將過程分成兩部分:首先刪除不必要的列,然后添加新列:
ALTER TABLE huge_table
DROP INDEX col4_idx,
DROP INDEX col1_idx,
DROP INDEX col3_idx,
DROP INDEX col6_idx,
DROP INDEX col2_idx,
DROP INDEX col8_idx;
ALTER TABLE huge_table
ADD INDEX new_idx(col3, col6, col1);
刪除列只需要幾秒鍾,新索引就完成了,沒有錯誤(再次,在聯機模式下)。 不幸的是,新索引沒有采用。
我認為整個 DDL 語句在創建新索引失敗后最終被回滾,但沒有看到任何記錄; 它似乎默默地失敗了。 我想知道是不是因為有一個VIRTUAL
列,但我希望引擎返回某種錯誤消息。 有沒有其他人看到過這種類型的問題?
所以,就在提交這個問題之前,我發現了錯誤:
Error Code: 1799. Creating index 'new_idx' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
問題是該表被大量使用,並且innodb_online_alter_log_max_size
設置是對在線 DDL 過程中存儲的 DML 語句數量的硬限制。 結果,似乎我無法在聯機模式下修改此表,除非我提高了此值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.