簡體   English   中英

MySQL Online DDL 更改完成,但未持久化

[英]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 語句數量的硬限制。 結果,似乎我無法在聯機模式下修改此表,除非我提高了此值。

https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_online_alter_log_max_size

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM