Автоматизация разбиения MySQL на разделы

Я много искал об автоматизации разбиения MySQL на разделы. Но, к сожалению, с проблемой ничего не связано. Я хочу удалить старые разделы, которые не нужны, но в то же время добавить новые данные в раздел. Что я могу сделать здесь, так это каждый день удалять старый раздел и создавать новые разделы с помощью некоторых автоматических функций mysql, таких как МЕСЯЦ (СЕЙЧАС () - интервал 2 месяца) и т. Д. Но что он будет делать, так это увеличивать стоимость операции, как каждую ночь Мне нужно воссоздать разделы для новых данных. Я обнаружил, что могу использовать разбиение по диапазону, но есть все жестко запрограммированные примеры, предполагающие, что мне может потребоваться разбиение каждый раз, когда добавляются новые данные.

Вот пример, который я нашел, но не очень похож на меня:

ALTER TABLE t1 PARTITION BY 
RANGE(TO_DAYS(FROM_UNIXTIME(transaction_date)))(
PARTITION JAN VALUES LESS THAN (TO_DAYS('2013-02-01')),
PARTITION FEB VALUES LESS THAN (TO_DAYS('2013-03-01')),
PARTITION MAR VALUES LESS THAN (TO_DAYS('2013-04-01')),
PARTITION APR VALUES LESS THAN (TO_DAYS('2013-05-01')),
PARTITION MAY VALUES LESS THAN (TO_DAYS('2013-06-01')),
PARTITION JUN VALUES LESS THAN (TO_DAYS('2013-07-01')),
PARTITION JUL VALUES LESS THAN (TO_DAYS('2013-08-01')),
PARTITION AUG VALUES LESS THAN (TO_DAYS('2013-09-01')),
PARTITION SEP VALUES LESS THAN (TO_DAYS('2013-10-01')),
PARTITION `OCT` VALUES LESS THAN (TO_DAYS('2013-11-01')),
PARTITION NOV VALUES LESS THAN (TO_DAYS('2013-12-01')),
PARTITION `DEC` VALUES LESS THAN (TO_DAYS('2014-01-01'))
);

Пожалуйста, предложите мне правильный способ сделать это.


person Omkar Mozar    schedule 04.05.2018    source источник


Ответы (2)


Полностью автоматизированного способа не существует - нужно писать код.

Но сначала давайте исправим проблему. Есть еще один раздел:

PARTITION future VALUES LESS THAN (MAXVALUE)

Это пригодится, если однажды ночью у вас случайно не получится свернуть перегородки.

А как насчет ошибки: ваша таблица, по сути, никогда не содержит данных за полные 12 месяцев. Сразу после сдвига перегородок у вас будет всего 11 месяцев. Это нормально? Если нет, оставьте 13 месяцев, а не 12.

Теперь немного кода для выполнения работы и, возможно, еще несколько советов: http://mysql.rjweb.org/doc.php/partitionmaint

person Rick James    schedule 18.05.2018

Вы можете сделать это вот так. Это автоматически сохранит данные в соответствующих разделах. Что касается автоматизации их усечения, я тоже изучаю создание запланированных событий.

PARTITION BY RANGE ( month(creationDate))
(PARTITION p0 VALUES LESS THAN (2) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (3) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (4) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN (5) ENGINE = InnoDB,
 PARTITION p4 VALUES LESS THAN (6) ENGINE = InnoDB,
 PARTITION p5 VALUES LESS THAN (7) ENGINE = InnoDB,
 PARTITION p6 VALUES LESS THAN (8) ENGINE = InnoDB,
 PARTITION p7 VALUES LESS THAN (9) ENGINE = InnoDB,
 PARTITION p8 VALUES LESS THAN (10) ENGINE = InnoDB,
 PARTITION p9 VALUES LESS THAN (11) ENGINE = InnoDB,
 PARTITION p10 VALUES LESS THAN (12) ENGINE = InnoDB,
 PARTITION p11 VALUES LESS THAN (13) ENGINE = InnoDB,
 PARTITION p12 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ |

Это также может быть расширено до создания разделов на основе недели.

person bharatharatna puli    schedule 22.01.2021