Добавить партиции в таблицу MariaDB/MySQL

Очень давно делал я партиции для одной таблички, и вот пришло время накинуть новых разделов в таблицу, а старое зачистить.

Кусочек DDL, где про партиции выглядит так:

 PARTITION BY RANGE (year(`add_date`))
(PARTITION `go_away_invalid_date` VALUES LESS THAN (0) ENGINE = InnoDB,
 PARTITION `go_away_2021` VALUES LESS THAN (2022) ENGINE = InnoDB,
 PARTITION `go_away_2022` VALUES LESS THAN (2023) ENGINE = InnoDB,
 PARTITION `go_away_2023` VALUES LESS THAN (2024) ENGINE = InnoDB,
 PARTITION `go_away_2024` VALUES LESS THAN (2025) ENGINE = InnoDB,
 PARTITION `go_away_2025` VALUES LESS THAN (2026) ENGINE = InnoDB,
 PARTITION `go_away_future` VALUES LESS THAN MAXVALUE ENGINE = InnoDB);

Моя таблица относится к RANGE PARTITION, а это значит, что простой синтакиси с ADD не прокатит, и будет ошибка, о чем говорится в документации и там же используется workaround.

Смысл костыля: добавить партиции можно, если перераспределить раздел, для данных, которые не попадают ни в один диапазон.

Собственно сразу на много лет вперед я создал новые партиции.

ALTER TABLE go_away REORGANIZE PARTITION  go_away_future INTO (
    PARTITION `go_away_2026` VALUES LESS THAN (2027) ENGINE = InnoDB,
    PARTITION `go_away_2027` VALUES LESS THAN (2028) ENGINE = InnoDB,
    PARTITION `go_away_2028` VALUES LESS THAN (2029) ENGINE = InnoDB,
    PARTITION `go_away_2029` VALUES LESS THAN (2030) ENGINE = InnoDB,
    PARTITION `go_away_2030` VALUES LESS THAN (2031) ENGINE = InnoDB,
    PARTITION `go_away_2031` VALUES LESS THAN (2032) ENGINE = InnoDB,
    PARTITION `go_away_2032` VALUES LESS THAN (2033) ENGINE = InnoDB,
    PARTITION `go_away_2033` VALUES LESS THAN (2034) ENGINE = InnoDB,
    PARTITION `go_away_2034` VALUES LESS THAN (2035) ENGINE = InnoDB,
    PARTITION `go_away_2035` VALUES LESS THAN (2036) ENGINE = InnoDB,
    PARTITION `go_away_2036` VALUES LESS THAN (2037) ENGINE = InnoDB,
    PARTITION `go_away_2037` VALUES LESS THAN (2038) ENGINE = InnoDB,
    PARTITION `go_away_2038` VALUES LESS THAN (2039) ENGINE = InnoDB,
    PARTITION `go_away_2039` VALUES LESS THAN (2040) ENGINE = InnoDB,
    PARTITION `go_away_2040` VALUES LESS THAN (2041) ENGINE = InnoDB,
    PARTITION `go_away_future` VALUES LESS THAN MAXVALUE ENGINE = InnoDB
);

У меня раздел `go_away_future` был пустой, по этому все выполнилось моментально. Если там будут данные, то придется подождать, пока произойдет реорганизация раздела.

Last updated