DBAtlas · Атлас эксплуатации баз данных

Обслуживание RANGE-секций: добавление будущих секций, архивирование / удаление старых

MySQLСекционирование

Команда

-- Current partitions
SELECT PARTITION_NAME, PARTITION_DESCRIPTION, TABLE_ROWS
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = 'shop' AND TABLE_NAME = 'events_log' ORDER BY PARTITION_ORDINAL_POSITION;

-- Add a new month by splitting the empty pmax
ALTER TABLE shop.events_log REORGANIZE PARTITION pmax INTO (
  PARTITION p2026_11 VALUES LESS THAN ('2026-12-01'),
  PARTITION pmax VALUES LESS THAN (MAXVALUE));

-- Move the old month into an archive table (instant), then drop the empty partition
CREATE TABLE shop.events_log_2026_08 LIKE shop.events_log;
ALTER TABLE shop.events_log_2026_08 REMOVE PARTITIONING;
ALTER TABLE shop.events_log EXCHANGE PARTITION p2026_08 WITH TABLE shop.events_log_2026_08;
ALTER TABLE shop.events_log DROP PARTITION p2026_08;

-- Pruning check: the partitions column should list a single partition
EXPLAIN SELECT * FROM shop.events_log WHERE created >= '2026-10-01' AND created < '2026-11-01';

Что делает

На таблице с RANGE-секционированием по дате добавляет секцию следующего периода, за миллисекунды переносит старый период в отдельную таблицу через EXCHANGE и удаляет секцию гораздо дешевле, чем DELETE.

Когда использовать

Для ежемесячного хранения и архивирования в растущих таблицах: журналы, события, аудит.

Внимание

Столбец секционирования должен входить в каждый уникальный ключ (включая PK). REORGANIZE PARTITION pmax переписывает данные в pmax; держите pmax пустой и создавайте секции заранее (например, на 3 месяца). DROP PARTITION необратим и не журналируется построчно; на репликах выполняется как DDL. Целевая таблица EXCHANGE должна иметь ту же структуру и не быть секционированной; строки вне диапазона вызывают ошибку (WITHOUT VALIDATION быстрее, но может пропустить неверные данные). DDL по секциям берёт metadata lock на уровне таблицы. Для отсечения секций (pruning) используйте столбец секционирования в WHERE, не оборачивая его в функцию.

Открыть в DBAtlas →