Как создать раздел в MySql, если он не существует? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть секционированная таблица, в которую я вставляю данные из хранимой процедуры,
У меня есть секционирование в таблице по столбцу с именем year,
Хранимая процедура может вставлять данные вправильно разделить таблицу.

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

Например.Моя таблица имеет имя backups
У меня есть 3 раздела на данный момент -
2018, 2019 и 2020
Но в 2021 году, в котором выполняется хранимая процедура,
может не быть раздела длягод
Поэтому я хочу, чтобы моя хранимая процедура обрабатывала проверку и создание раздела во время выполнения.

Ниже приведена структура моей таблицы -

enter image description here

Запрос на создание раздела -

ALTER TABLE backups
partition by list columns(year)
(partition backup_2018 values IN (2018),
partition backup_2019 values IN (2019),
partition backup_2020 values IN (2020));

Следующая моя хранимая процедура -

CREATE DEFINER=`root`@`localhost` PROCEDURE `daily_backup`()
BEGIN
    DECLARE backuptime INT;

    #Need Partition checking and creation here

    SET backuptime = UNIX_TIMESTAMP(CONCAT(DATE_SUB(DATE_FORMAT(NOW(),'%Y-%m-%d'), INTERVAL 1 DAY),' 23:59:59'));

    INSERT into backups 
    (user_id, latest_transaction_id, balance, last_transaction_timestamp, last_transaction_date, snapshot_date, year)    
    SELECT 
    T2.user_id,
    T2.transaction_id AS latest_transaction_id,
    T2.new_balance AS balance,
    T2.created_date AS last_transaction_timestamp,
    DATE_FORMAT(FROM_UNIXTIME(T2.created_date), '%Y-%m-%d %I:%i:%S') AS last_transaction_date,
    DATE_FORMAT(NOW(), '%Y-%m-%d') AS snapshot_date,
    DATE_FORMAT(NOW(), '%Y') AS year
FROM
    (SELECT 
        user_id, MAX(transaction_id) maxTransID
    FROM
        transaction
    WHERE
        created_date < @backuptime
    GROUP BY user_id) Tmp
        JOIN
    transaction T2 ON Tmp.MaxTransID = T2.Transaction_ID;
END

1 Ответ

0 голосов
/ 26 июня 2019

Я предлагаю разделить, используя RANGE COLUMNS вместо LIST COLUMNS. Таким образом, у вас есть возможность добавить последний столбец для любых лет, кроме тех разделов, которые вы определили до сих пор.

ALTER TABLE backups
partition by range columns(year)
(partition backup_2018 values LESS THAN (2019),
partition backup_2019 values LESS THAN (2020),
partition backup_2020 values LESS THAN (2021),
partition backup_other values LESS THAN MAXVALUE);

По мере приближения к концу 2020 года вы будете использовать ALTER TABLE backups REORGANIZE PARTITION backup_other INTO ( ...new partitions... ), чтобы разбить последний раздел и создать новые разделы для последующих лет.

Подробнее см. https://dev.mysql.com/doc/refman/5.7/en/partitioning-management-range-list.html.

Если вы забудете, не навредите, ваши данные просто на некоторое время будут заполняться backup_other, пока вы не забудете провести реорганизацию. Хотя в ваших интересах сделать это заранее, потому что реорганизация пустого раздела происходит быстро, а реорганизация раздела с данными в нем займет больше времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...